Physical Address:
ChongQing,China.
WebSite:
我们在Android开发过程中会不可避免地跟APK(Android Package File)打交道,作为Android应用标准的打包格式,其内部包含了Android应用的众多信息。
在Linux环境下,我们可以将apk文件重命名zip文件,再使用unzip工具进行解压,观察其内容。
如上图所示,我们将CarService.apk重命名为CarService.zip后,进行解压得到如下产物:
AndroidManifest.xml:Android应用清单,配置Android应用的一些具体信息,如包名、权限、Service、Activity等。
*dex:Java编译产物字节码,JVM会负责将其转化为底层语言进行执行。
res:用于存放Android应用的资源,如icon、xml等文件。
META-INF:用于存放Jar包、签名、证书相关的一些信息。
resources.arsc:二进制资源文件,包括字符串等。
我们可以通过这种方式获得一些有用的信息。除此之外,我们还可以借助一些其他的工具来帮助我们分析。
1.aapt2
aapt2是我们可能经常接触的一个工具,其功能很强大。可以用于编译、链接与数据解析、APK优化等。这里我们不关注其编译、链接的功能,我们着重关注其数据解析的功能。利用该功能,我们可以获取APK内部很多有用的信息。
aapt2本身在我们AOSP源码内作为预编译的可执行文件而存在。其所在目录一般在/prebuilts/sdk/tools/linux/bin/目录下,我们首先通过help参数获取一下命令使用的帮助信息:
./prebuilts/sdk/tools/linux/bin/aapt2 - -help
用于数据解析的命令语法为:
aapt2 dump sub-command filename.apk [options]
其中sub-command的可选项如下所示:
sub-command | 说明 |
apc | 输出在编译期间生成的 AAPT2 容器(APC)的内容 |
badging | 输出从 APK 的清单中提取的信息。 |
configurations | 输出 APK 中的资源使用的每项配置。 |
packagename | 输出 APK 的软件包名称。 |
permissions | 输出从 APK 的清单提取的权限。 |
strings | 输出 APK 的资源表字符串池的内容。 |
styleparents | 输出 APK 中使用的样式的父项。 |
resources | 输出 APK 的资源表的内容。 |
xmlstrings | 输出 APK 的已编译 xml 中的字符串。 |
xmltree | 输出 APK 的已编译 xml 树。 |
如我们使用badging来获取信息,如下示例:
aapt2 dump badging CarService.apk
结果如图所示:
2.apkanalyzer
apkanalyzer是另外一个比较常用的用于分析APK的工具。同样地,其作为预编译好的可进行文件存在于AOSP源码环境内。当然你也可以在Android SDK内找到,在Android SDK内的位置一般是android_sdk/cmdline-tools/version/bin.
使用apkanalyzer工具的命令行语法如下:
apkanalyzer [global-options] subject verb [options] apk-file [apk-file2]
其中 global-options 目前只有–human-readable一个选项。
subject的可选项包括:
而不同的subject选项可以有不同的verb组合,这里给出一些常用组合及各自的作用:
subject verb | 说明 |
apk summary | 输出应用ID、版本代码和版本名称 |
apk compare | 比较不同APK的差异 |
files list | 列出APK中的所有文件 |
files cat –file | 输出文件内容,使用–file必须指定APK内的路径 |
manifest print | 以xml形式输出APK应用清单 |
manifest application-id | 输出应用 ID 值 |
manifest version-name | 输出版本名称值 |
manifest permissions | 输出权限列表 |
dex list | 输出 APK 中的 DEX 文件列表 |
resources xml – -file | 以简单易懂的形式输出 XML 二进制文件,file选项指定APK内路径 |
resources packages | 输出资源表中定义的软件包列表 |
3.apktool
apktool是一个用于对第三方闭源的APK程序进行逆向工程的强大工具,有以下特性:
1.解压APK内的资源,如resources.arsc,classes.dex以及xml等内容
2.支持解压后重新编译打包
3.管理对Android Frameworks的依赖
4.支持debug调试,依赖于apktool版本
以下将会对apktool的使用举一些简单的例子:
反编译APK:apktool d apk-file
反编译结束后会在对应的文件夹下,你会看到反编译后的许多内容,如assets、lib、res与AndroidManifest.xml等内容。
编译打包:apktool b project-directory
一般我们会在反编译后进行一些修改,之后就会编译生成新的APK。新生成的APK文件位于项目目录下dist目录。
关于apktool的使用此外还有一些其他的功能,在此不做过多介绍,各位小伙伴可以自行探索。