Android反编译的目的无非就是为了看到APK的xml、资源和代码:
得到代码的方式:直接解压APK文件 --> 得到classes.dex文件 --> 使用 dex2jar classes.dex classes.jar生成jar文件 --> [可选的解压jar文件] -->使用XJad或者JDCompiler查看源代码
得到XML的方式:
方式1:直接解压APK文件 --> 通过axmlprinter工具查看XML文件(这种方式查看的XML文件的id都是数字--即R文件中id对应的值)
方式2:使用APKTool工具解压APK文件可以直接查看XML文件
Android反编译常常使用如下的一些工具:
1、反编译命令:
apktool d D:\\Developer\androidDecode\Test0201.apk D:\\Developer\androidDecode\test0201
D:\\Developer\androidDecode\Test0201.apk:要反编译的APK文件
D:\\Developer\androidDecode\test0201:反编译文件的保存目录,必须为空目录
2、从反编译的文件编译成APK apktool b D:\\Developer\androidDecode\test0201 D:\\Developer\androidDecode\test020101.apk
D:\\Developer\androidDecode\test0201:保存编译后文件的目录
D:\\Developer\androidDecode\test020101.apk:生成的新的APK文件的保存的绝对路径
3、签名APK文件:
singedAPK.bat文件
java -jar "%~dp0signapk.jar" "%~dp0testkey.x509.pem" "%~dp0testkey.pk8" %1 signed.apk
执行singedAPK.bat命令
singedAPK D:\\Developer\androidDecode\test020101.apk 生成一个singed.apk文件和test020101.apk在同一个目录
4、使用baksmali.jar把一个dex文件转换为一个smali文件
java -jar D:\\Developer\ApkTool\baksmali.jar -o D:\\Developer\androidDecode\baksmaliout D:\\Developer\androidDecode\Hello.dex
D:\\Developer\ApkTool\baksmali.jar:baksmali.jar文件所存在的全路径
D:\\Developer\androidDecode\baksmaliout:生成的smali文件的保存目录
D:\\Developer\androidDecode\Hello.dex:要转成smali文件的路径
5、使用ddx.jar把一个dex文件转换为ddx文件
java -jar D:\\Developer\ApkTool\ddx.jar -d D:\\Developer\androidDecode\ddxout D:\\Developer\androidDecode\Hello.dex
D:\\Developer\ApkTool\ddx.jar:ddx.jar文件的绝对路径
D:\\Developer\androidDecode\ddxout:要保存ddx文件的路径
D:\\Developer\androidDecode\Hello.dex:要转换的dex路径
6、Android自带dexdump工具:dex文件转为smali文件 dexdump -d xxxx.dex > xxxx.smali
7、dex2jar.jar:dex2jar XXX.dex YYY.jar
说明:
apktool项目地址:https://code.google.com/p/android-apktool/
baksmali项目地址:https://code.google.com/p/smali/
dex2jar项目地址:https://code.google.com/p/dex2jar/downloads/list
java Decompiler(JD)项目地址:http://jd.benow.ca/
XJAD百度网盘下载地址:http://pan.baidu.com/share/link?shareid=406366626&uk=3558809438&fid=881236853
axmlprinter项目地址:https://code.google.com/p/android4me/downloads/detail?name=AXMLPrinter2.jar&can=2&q=