最近工作中用到了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和新版本的工具不匹配,从而导致上面的问题。