转载:http://blog.csdn.net/aeolus1019/article/details/8064014
在这我们主要讲系统APK的反编译和编译。
其实系统APK的反编译和编译和apk的区别不大,主要区别在于,系统APK涉及共享签名的问题,还有就是在反编译和编译前需要将两个依赖项进行IF命令操作,也可以理解为安装。
一、依赖项的IF命令:
1、提取你系统的system\framework下面的com.htc.resources.apk和framework-res.apk(原则上每个不同的系统都提取一次;注意修改过的这两个文件反编译或编译可能会失败);
2、将上面两项放入C盘根目录下,这个随便你放,只要在命令输入时路径相同就可以;
3、打开CMD或命令提示符,即DOS窗口;
4、在DOS窗口输入:
apktool if C:\com.htc.resources.apk 输入完成后回车键回车
apktool if C:\framework-res.apk 输入完成后回车键回车
5、这样IF命令和安装已经结束,这是系统APK编译必须的
二、反编译系统APK
所谓反编译系统APK就是将系统APK分解,让不可以识别的XML文件变为可以识别。
将需要反编译的系统APK放入C盘,我个人喜欢放C盘,个人自己去体会。
以framework-res.apk这个反编译为例:
命令: apktool d C:\framework-res.apk C:\framework-res回车
完成后会在C盘出现一个framework-res名称的文件夹。请注意,反编译完成总共只有5-6行,多出就是错误了。但是不是完全的错误,这个需要实际去查看错误原因了。
三、编译系统APK
编译系统APK就是将修改后的系统文件合成。
以上面反编译系统APK继续:
命令: apktool b C:\framework-res回车
完成后会在framework-res文件夹内build文件夹或dist文件夹内生成一个新的APK文件,这就是修改后的合成的新的APK文件。
四、如何使用修改后的系统APK
将合成的新的系统APK解压,获取你修改后的APK中的文件。然后用压缩软件打开未修改的原来的系统APK文件,将你修改后的文件替换进去,如果你修改的是values文件夹或者以values开头的文件夹内容,那么你就把解压后的新的文件resources.arsc替换进原来的系统APK中即可。如果你修改的其他文件夹的内容就替换其中的内容。用这种方式可以避免共享签名的问题,如果你纯粹使用使用新的APK文件放入系统,会造成死在第一屏或第二屏无限重启。
关于DEX后缀名的编译,暂时不推荐大家去修改,这个DEX反编译后生成的是smail文件夹。
实例:
一、打开默认第三方程序安装(未知源勾选):这个不需要上面说的依赖项支持
这里我只讲操作步骤,大家不要去懂得原理,可以参考此修改去修改其他的设置,但不是很推荐。
1、提取SettingsProvider.apk,按上面的方式反编译:apktool d C:\SettingsProvider.apk C:\SettingsProvider回车
2、用文本编辑器,找到:SettingsProvider\res\values\tools.xml
3、找到: <bool name="def_install_non_market_apps">false</bool>,将false修改为true,保存;
4、合成: apktool b C:\SettingsProvider回车
5、提取新的合成的新的文件resources.arsc文件替换到原来的SettingsProvider.apk中即可。
反编译dex获取Java源代码
Apktool工具只能反编译成smali的中间代码文件,这里需要借助另外一个开源工具:dex2jar,下载地址:http://code.google.com/p/dex2jar/。这个工具不能直接翻译成java文件,但是可以把dex文件转换成jar文件,然后可以通过jad工具把jar文件反编译成Java源文件,jd-gui下载地址:
http://java.decompiler.free.fr/jd-gui/downloads/jd-gui-0.3.3.windows.zip 。
详细步骤:
解压apk文件,直接拖拽(rar解压软件),找到classes.dex文件
在cmd下进入dex2jar.bat所在路径,
然后输入“dex2jar.bat XXX”,XXX指的是你要反编译的apk中的classes.dex文件所在路径及名称(classes上面解压得到),
如:dex2jar.bat D:\classes.dex;
这样会生成一个jar文件,然后用jd-gui工具将jar文件反编译成java文件,选择保存所有,它会生成一个压缩文件,所有的源码都在这个压缩文件中,解压了就可以看到详细的代码了。