安卓反编译及重新打包

       下午遇到一个需求,需要修改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,反编译修改重新打包是不是很简单啊,有不对的地方还望指正,下面是传送门,请自行下载工具,至于第二种方式接下来会继续更新,未完待续。。。

传送门:

反编译工具

推荐阅读更多精彩内容