最近工作中用到了apktool解包修改xml文件,当时找了一下发现之前并没有记录文档,用法有点忘了又到网上查了一遍,这里记录一下,以后也方便查吧。

apktool-打包解包工具

用于查看apk中的资源和修改一些配置文件

下载网址:https://ibotpeaches.github.io/Apktool/

安装配置apktool:(官网里很详细,我这里就只简单说一下Windows下的)

下载apktool.bat和apktool.jar(下载的apktool.jar重命名成这样),放在一起在Windows下配置path就可以了。

使用:

1.解包:

$ apktool d foo.jar
// decodes foo.jar to foo.jar.out folder

$ apktool decode foo.jar
// decodes foo.jar to foo.jar.out folder

$ apktool d bar.apk
// decodes bar.apk to bar folder

$ apktool decode bar.apk
// decodes bar.apk to bar folder

$ apktool d bar.apk -o baz
// decodes bar.apk to baz folder

2.打包

$ apktool b foo.jar.out
// builds foo.jar.out folder into foo.jar.out/dist/foo.jar file

$ apktool build foo.jar.out
// builds foo.jar.out folder into foo.jar.out/dist/foo.jar file

$ apktool b bar
// builds bar folder into bar/dist/bar.apk file

$ apktool b .
// builds current directory into ./dist

$ apktool b bar -o new_bar.apk
// builds bar folder into new_bar.apk

$ apktool b bar.apk
// WRONG: brut.androlib.AndrolibException: brut.directory.PathNotExist: apktool.yml
// Must use folder, not apk/jar file

打完包之后一般需要重签:

删除apk包中的签名文件:META-INF

使用重签命令重签apk。

偷个懒,转个博客:https://www.jb51.net/article/141954.htm

dex2jar

将apk反编译成java源码

下载网址:https://sourceforge.net/projects/dex2jar/

apk中的dex文件转为jar:

将需要反编译的文件放到dex2jar的同目录,运行:d2j-dex2jar.bat xxxx.classes.dex

反编译出来的是个jar文件,解压可以看到源码

jd-gui

查看.class文件

下载网址:http://java-decompiler.github.io/

直接用这个工具打开.class文件即可。

进阶知识:(下面的东西我也是在其他地方看到的,自己并没有实际研究过源码,以后看过源码,再来修正,所以有什么问题还请见谅)

apktool对于xml的格式解析是自己实现的(在AXmlResourceParser里面),并结合xpp3库读取解析后的xml信息。再回编译的时候使用了Android的aapt工具。

xpp3:XmlPullParser,流的方式解析xml

常见问题:

No resource identifier found for attribute 'compileSdkVersion' in package 'android'

打包前执行:apktool empty-framework-dir

原因:官方文档表示apktool和framework是绑定在一起的。这个文件在使用的时候会被copy到apktool/frame/1.apk。如果你本地有两种版本的apktool,先用了旧版本,再用新版本的工具就可能导致apk的framework和新版本的工具不匹配,从而导致上面的问题。