Android APK文件分析

关于APK文件分析的一些工具记录。
Views: 22
2 0
Read Time:1 Minute, 13 Second

我们在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的可选项包括:

  • apk:分析apk文件属性,如应用ID、版本代码与名称
  • files:分析apk内的文件
  • manifest:分析apk文件内的清单内容
  • dex:分析apk文件内的DEX文件
  • resources:查看文本、图像和字符串资源

而不同的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的使用此外还有一些其他的功能,在此不做过多介绍,各位小伙伴可以自行探索。

Happy
Happy
100 %
Sad
Sad
0 %
Excited
Excited
0 %
Sleepy
Sleepy
0 %
Angry
Angry
0 %
Surprise
Surprise
0 %
默认图片
FranzKafka95
极客,文学爱好者。如果你也喜欢我,那你大可不必害羞。
文章: 45

留下评论

zh_CNCN