下午遇到一个需求,需要修改apk源码的问题,于是上网查了下相关资料,编写了一个小demo验证下反编译并重新打包的效果,当然只涉及到简单的修改,下面讲解一下具体步骤以及过程中遇到的小坑,有兴趣的朋友可以在结尾处下载相关的工具。当然,本人并不支持反编译修改源码,仅作为学习及参考。
本文只介绍使用apktool反编译做简单修改并重新打包,有兴趣的朋友也可以使用dex2jar进行反编译,这种方式可以查看java源码,后期也会对这种方式进行补充。
开始之前,先介绍下用到的工具:
1. apktool(包括apktool.jar、aapt.ext、apktool.bat),编译和反编译apk,从apk中提取图片和布局资源
2. dex2jar,将可运行文件classes.dex反编译为jar源码文件
3. jd-gui,查看jar源码文件
使用apktool反编译并重新打包
1. 将下载的apktool解压,并将要反编译的apk放到该文件夹下,并且在此窗口打开命令行(shift+右键)
2. 执行反编译命令 apktool d filename 本例中即: apktool d test.apk
3. 反编译后得到的文件目录如下图所示,可以看到AndroidManifest.xml,res及smail文件了,我们可以修改res下的文件及AndroidManifest或者smail文件,但是smail文件是java虚拟机识别的汇编语言,修改难度较大,有兴趣的同学可以钻研一下
(有人可能会说,直接将.apk文件修改后缀名为.zip也能拿到AnroidManifest文件,但是这样拿到的文件,里面全是乱码,是无法进行修改的)
4. 修改AndroidManifest中的文件(比如将该应用的桌面图标隐藏,将红框部分的代码删除即可)
5. 对修改后的代码进行重新打包,执行命令 apktool b files,本例中即: apktool b test;执行命令后,生成的新的apk文件存放于下图红框部分的文件夹中
6. 这样拿到的apk文件直接安装是不会成功的,将会提示Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES],这是因为没有签名造成的,所以必须签名后才能安装使用,生成签名的指令为:
keytool -genkey -keystore test.keystore -keyalg RSA -validity 10000 -alias test.keystore 解释下参数的含义: -genkey产生证书文件 -keystore 指定生成证书的名字 -keyalg 指定密钥的算法 -validity 证书的有效期天数 -alias 别名
7. 使用Java jdk中的jarsigner对应用进行签名,前提是你的机器中已经配好了环境,将重新打包好的apk文件与生成的keystore放到同一目录下,执行指令: jarsigner -verbose -keystore test.keystore test.apk test.keystore 重新签名的apk再次安装就不会报错了
遇到的小问题: 刚开始下载的apktool.jar以及aapt.exe文件版本较低,导致打包时出现异常,大家反编译或者打包时遇到异常时,先考虑是否apktool.jar版本过低或者是环境是否有问题,如果都OK,那只能自行Google解决了,异常也贴个图吧,大概是长这个样子:
So,反编译修改重新打包是不是很简单啊,有不对的地方还望指正,下面是传送门,请自行下载工具,至于第二种方式接下来会继续更新,未完待续。。。
传送门: