关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。
专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。
一、导读
我们继续总结学习基础知识,温故知新。
apkanalyzer 用于分析我们生成的apk,可以得到各种我们想要的信息,
例如分析 APK 文件属性,如应用 ID、版本代码和版本名称,查看文本、图像和字符串资源等等。
常用的如:
apkanalyzer apk summary xxx.apk 输出应用 ID、版本代码和版本名称。 eg: com.myapp 5 1.1-beta
二、概览
通过 APK 分析器的命令行版本,您可以在构建流程完成后立即了解 APK 的组成,并且可以比较两个 APK 之间的差异。
使用 APK 分析器可以减少调试应用中的 DEX 文件和资源相关问题所花费的时间,并减小 APK 的大小。
apkanalyzer 包含在 Android SDK 命令行工具软件包中(位于 android_sdk/cmdline-tools/version/bin/apkanalyzer)。
或者,您也可以在 Android Studio 中访问 APK 分析器工具,如使用 APK 分析器来分析您的 build 中所述。
三、用法
Android Studio 包含一个 APK 分析器,可让您在构建流程完成后立即了解 APK 或 Android App Bundle 文件的组成。
使用 APK 分析器可以减少调试应用的 DEX 文件和资源相关问题所用的时间,并且有助于减小 APK 的大小。
您也可以使用 apkanalyzer 从命令行运行 APK 分析器。
下面我们分部讲解一下.
3.1 使用 Android Studio
可以通过以下三种方式访问 APK 分析器:
- 将 APK 或 app bundle 拖到 Android Studio 的 Editor 窗口中。
- 在 Project 窗口中切换到 Project 视图,然后在默认的 build/output/apks/ 目录中双击相应 APK。
- 在菜单栏中依次选择 Build > Analyze APK,然后选择您的 APK 或 app bundle。
打开后就可以直接查看相关信息了,这一步是傻瓜式的操作了。
通过 apkanalyzer,我们可以:
3.1.1 查看文件和大小信息
3.1.2 查看 AndroidManifest.xml
3.1.3 查看 DEX 文件
3.1.4 过滤 DEX 文件树状视图
3.1.5 加载 ProGuard 映射
3.1.6 显示字节码、查找用法以及生成 Keep 规则
这个我们讲一下,使用方式为先选定一个dex文件,然后在下面展示类的窗口中选择一个类,然后点击右键即可。
- Show bytecode
对选定的类、方法或字段进行反编译,并在对话框中显示 smali 字节码表示形式 - Find usages
显示 DEX 代码的哪些其他部分对选定的类或方法进行了引用,如果加载了 seeds.txt,以粗体显示的节点表示 ProGuard 配置阻止在压缩过程中移除这些节点。
- Generate Proguard Keep rule
生成 Keep 规则,大白话就是如果你不想混淆这个类,使用该选择之间生成keep规则即可。
3.1.7 查看代码和资源实体
3.1.8 比较文件
3.2 使用 命令行
apkanalyzer 的语法为:
apkanalyzer [global-options] subject verb [options] apk-file [apk-file2]
- global-options: 这里我们常用的有 -h ,简单易懂的格式(-h 选项)
- subject :要查询的内容,常用的有 apk, files, manifest, dex, resources
- verb :要了解的关于 subject 的内容
apkanalyzer -h apk verb [options] apk-file [apk-file2]
apkanalyzer -h files verb [options] apk-file [apk-file2]
apkanalyzer -h manifest verb [options] apk-file [apk-file2]
apkanalyzer -h dex verb [options] apk-file [apk-file2]
apkanalyzer -h resources verb [options] apk-file [apk-file2]
-h 可要可不要
我们列一下常用命令
查看 APK 文件属性 | 说明 |
---|---|
apkanalyzer apk summary xxx.apk | 输出应用 ID、版本代码和版本名称。 eg: com.myapp 5 1.1-beta |
apkanalyzer apk file-size xxx.apk | 输出 APK 的总文件大小 |
apkanalyzer apk download-size xxx.apk | 输出 APK 的下载大小估计值 |
apkanalyzer apk features xxx.apk | 输出 APK 用来触发 Play 商店过滤的功能 |
apkanalyzer apk features --not-required xxx.apk | 输出 APK 用来触发 Play 商店过滤的功能。添加 --not-required 选项可在输出中包含标记为“非必需”的功能 |
apkanalyzer apk compare xxx1.apk xxx2.apk | 比较 apk-file 和 apk-file2 的大小。输出示例(旧大小/新大小/大小差异/路径) |
apkanalyzer apk compare --different-only xxx1.apk xxx2.apk | 比较 apk-file 和 apk-file2 的大小,输出存在差异的目录和文件 |
apkanalyzer apk compare --files-only xxx1.apk xxx2.apk | 比较 apk-file 和 apk-file2 的大小。不输出目录条目 |
apkanalyzer apk compare --patch-size xxx1.apk xxx2.apk | 比较 apk-file 和 apk-file2 的大小。逐个显示每个文件的补丁大小估计值,而不是原始差异 |
查看 APK 文件系统 | 说明 |
---|---|
apkanalyzer files list xxx.apk | 列出 APK 中的所有文件 |
apkanalyzer files cat --file path xxx.apk | 输出文件内容。您必须使用 --file path 选项(如 --file /AndroidManifest.xml)指定 APK 内的路径。 |
查看清单中的信息 | 说明 |
---|---|
apkanalyzer manifest print xxx.apk | 以 XML 格式输出 APK 清单。 |
apkanalyzer manifest application-id xxx.apk | 输出应用 ID 值。 |
apkanalyzer manifest version-name xxx.apk | 输出版本名称值。 |
apkanalyzer manifest version-code xxx.apk | 输出版本代码值。 |
apkanalyzer manifest min-sdk xxx.apk | 输出最低 SDK 版本。 |
apkanalyzer manifest target-sdk xxx.apk | 输出目标 SDK 版本。 |
apkanalyzer manifest permissions xxx.apk | 输出权限列表 |
apkanalyzer manifest debuggable xxx.apk | 输出应用是否可调试。 |
查看清单中的信息 | 说明 |
---|---|
dex list apk-file | 输出 APK 中的 DEX 文件列表。 |
dex references [--files path] [--files path2] apk-file | 输出指定 DEX 文件中的方法引用数。 默认包含所有 DEX 文件。添加 --files 选项可指明要包含的特定文件。 输出示例:classes.dex 59598 |
dex packages [option1 option2 ...] apk-file | 输出 DEX 中的类树。在输出中,P、C、M 和 F 分别表示软件包、类、方法和字段。x、k、r 和 d 分别表示已移除、保留、引用和定义的节点。 |
dex code --class class [--method method] | 以 smali 格式输出类或方法的字节码。输出中必须包含类名,并且要输出完全限定类名以进行反编译。添加 --method 选项可指定要反编译的方法。方法反编译的格式为 name(params)returnType,例如 someMethod(Ljava/lang/String;I)V。 |
packages 添加以下选项可优化输出:
--defined-only:在输出中仅包含 APK 中定义的类。
--files:指定要包含的 DEX 文件名。默认:所有 DEX 文件。
--proguard-folder file:指定用于搜索映射的 Proguard 输出文件夹。
--proguard-mappings file:指定 Proguard 映射文件。
--proguard-seeds file:指定 Proguard 种子文件。
--proguard-usages file:指定 Proguard 用法文件。
--show-removed:显示由 Proguard 移除的类和成员。
输出示例(类型/状态/定义的方法/引用的方法/字节大小/名称):
P d 1 1 85 g
P d 1 1 85 g.a
C d 1 1 85 g.a.a
M d 1 1 45 g.a.a java.lang.Object get()
C r 0 1 40 byte[]
M r 0 1 40 byte[] java.lang.Object clone()
查看存储在 res/ 和 resources.arsc 中的资源 | 说明 |
---|---|
resources packages | 输出资源表中定义的软件包列表。 |
resources configs --type type [--package package] apk-file | 输出指定 type 的配置列表。 type 是资源类型,如 string。 如果要指定资源表软件包名称,请添加 --package 选项,否则系统将使用第一个定义的软件包。 |
resources value --config config --name name --type type [--package package] apk-file | 输出由 config、name 和 type 指定的资源的值。type 选项是资源类型,如 string。如果要指定资源表软件包名称,请添加 --package 选项,否则系统将使用第一个定义的软件包。 |
resources names --config config --type type [--package package] apk-file | 输出属于某个配置和类型的资源名称列表。type 选项是资源类型,如 string。 如果要指定资源表软件包名称,请添加 --package 选项,否则系统将使用第一个定义的软件包。 |
resources xml --file path apk-file | 以简单易懂的形式输出 XML 二进制文件。 添加 file 选项可指定文件的路径。 |