需要使用到的工具: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
如此一来就可以在任何目录执行apktool了,需要注意的是apktool.jar的名字不要添加多余的字符,比如apktool_2.2.2.jar,这样会报错的。
1、反编译apk中的资源
需要到apktool 这个工具,用于最大幅度地还原APK文件中的9-patch图片、布局、字符串等等一系列的资源。
用法:
apktool d HelloWorld.apk
d是decode的意思,表示我们要对HelloWorld.apk这个文件进行解码,除了这个基本用法之外,我们还可以再加上一些附加参数来控制decode的更多行为:
-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
其中b是build的意思,表示我们要将Demo文件夹打包成APK文件,-o用于指定新生成的APK文件名,这里新的文件叫作New_Demo.apk,执行完命令后会发现在同级目录下面生成了一个新的APK文件:HelloWorld.apk,下一步需要进行签名操作:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 签名文件名 -storepass 签名密码 待签名的APK文件名 签名的别名
其中jarsigner命令文件是存放在jdk的bin目录下的,需要将bin目录配置在系统的环境变量当中才可以在任何位置执行此命令。
签名之后的APK文件现在已经可以安装到手机上了,不过在此之前Android还极度建议我们对签名后的APK文件进行一次对齐操作,因为这样可以使得我们的程序在Android系统中运行得更快。对齐操作使用的是zipalign工具,该工具存放于<Android SDK>/build-tools/<version>目录下,将这个目录配置到系统环境变量当中就可以在任何位置执行此命令了。命令格式如下:
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包就可以查看到源码了。