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=