需要使用到的工具:apktool,dex2jar,jd-gui
打包下载地址:http://download.csdn.net/detail/guai8023/9810937
官方下载地址:
apktool:
https://ibotpeaches.github.io/Apktool/install/
dex2jar:
https://sourceforge.net/projects/dex2jar/files/
jd-gui:
http://jd.benow.ca/
在任意地方执行apktool:
对于windows平台,把apktool.bat和apktool.jar放到C:\Windows下,这个目录要添加到环境变量
对于linux平台,把apktool和apktool.jar放到/usr/local/bin下,并给予这两个文件执行权限,
sudo chmod +x apktool.jar
sudo chmod +x apktool
1、反编译apk中的资源
需要到apktool 这个工具,用于最大幅度地还原APK文件中的9-patch图片、布局、字符串等等一系列的资源。
用法:
apktool d HelloWorld.apk
-f 如果目标文件夹已存在,则强制删除现有文件夹(默认如果目标文件夹已存在,则解码失败)。
-o 指定解码目标文件夹的名称(默认使用APK文件的名字来命名目标文件夹)。
-s 不反编译dex文件,也就是说classes.dex文件会被保留(默认会将dex文件解码成smali文件)。
-r 不反编译资源文件,也就是说resources.arsc文件会被保留(默认会将resources.arsc解码成具体的资源文件)。
如果出现莫名其妙的错误,首先把apktool换成新版本,然后删除C:\Users\...\apktool\framework\1.apk,这个文件是安装framework-res.apk时生成的,当要编译的apk用到了系统资源时,此时就需要安装framework-res.apk才可以反编译成果,甚至需要安装两个framework相关的apk,具体可以查看system/framework/下的相关文件,安装命令如下:
apktool if framework-res.apk
反编译后的目录中,original文件夹下存放的是未经反编译过、原始的AndroidManifest.xml文件,res文件夹下存放的是反编译出来的所有资源,smali文件夹下存放的是反编译出来的所有代码,AndroidManifest.xml则是经过反编译还原后的manifest文件。这里值得一提的是smali文件夹,如果你进入到这个文件夹中你会发现它的目录结构和我们源码中src的目录结构是几乎一样的,主要的区别就是所有的java文件都变成了smali文件。smali文件其实也是真正的源代码,只不过它的语法和java完全不同,它有点类似于汇编的语法,是Android虚拟机所使用的寄存器语言。
2、重新打包apk
反编译后修改完文件后如果需要重新打包,需要用到如下命令:
apktool b HelloWorld -o New_HelloWorld.apk
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 签名文件名 -storepass 签名密码 待签名的APK文件名 签名的别名
zipalign 4 New_HelloWorld.apk New_HelloWorld_aligned.apk
其中4是固定值不能改变,后面指定待对齐的APK文件名和对齐后的APK文件名。运行这段命令之后就会生成一个New_HelloWorld_aligned.apk文件,就可以安装到手机上了。
3、反编译代码
首先解压HelloWorld.apk,找到其中的classes.dex,将它拷贝到dex2jar解压后的目录下,执行命令:
d2j-dex2jar classes.dex
没有报错则说明成功了,然后在目录下会发现多出了一个classes-dex2jar.jar,之后用jd-gui工具打开这个jar包就可以查看到源码了。