APK Analyzer 的命令行版本可在构建过程完成后,让您深入了解 APK 的组成,并允许您对比两个 APK 之间的差异。使用 APK Analyzer 可以减少您调试应用内 DEX 文件和资源问题所花费的时间,并有助于减小 APK 的体积。
apkanalyzer 包含在 Android SDK 命令行工具软件包中,位于 android_sdk/cmdline-tools/version/bin/apkanalyzer。此外,您也可以在 Android Studio 中访问 APK Analyzer 工具,具体请参阅使用 APK Analyzer 分析您的构建。
语法
apkanalyzer 的语法如下:
apkanalyzer [global-options] subject verb [options] apk-file [apk-file2]
subject 是您想要查询的内容,可以是整个 APK,也可以是 APK 的一部分。subject 可以是以下任意一项:
apk:分析 APK 文件属性,例如应用 ID、版本代码和版本名称。files:分析 APK 文件内的文件。manifest:分析 APK 文件内清单文件的内容。dex:分析 APK 文件内的 DEX 文件。resources:查看文本、图像和字符串资源。
verb 是您想要了解关于该 subject 的什么信息。有关 subject、verb 及其选项的说明,请参阅下文的命令部分。
每个命令都需要您指定一个 APK 文件。只有 apk compare 命令需要您指定第二个 APK。
只要选项没有歧义,您可以缩写每个选项。例如,全局选项 --human-readable 可以缩写为 -h。
以下示例分析 apk (subject) 以获取其 file-size (verb),然后以人类可读的格式(-h 选项)打印文件大小:
apkanalyzer -h apk file-size myapk.apk
命令
以下命令描述按 subject 进行组织,并列出了每个 subject 可用的 verb 和选项组合。
|
|
描述 |
|---|---|
apk summary apk-file
|
打印应用 ID、版本代码和版本名称。
输出示例 com.myapp 5 1.1-beta |
apk file-size apk-file
|
打印 APK 的总文件大小。 |
apk download-size apk-file
|
打印 APK 的预计下载大小。 |
apk features [--not-required] apk-file
|
打印 APK 所使用、且会触发 Play 商店过滤的特性。添加 --not-required 选项可将标记为“非必需”的特性也包含在输出中。
输出示例 android.hardware.type.watch
android.hardware.microphone implied:
requested android.permission.RECORD_AUDIO permission |
apk compare [options] apk-file apk-file2
|
比较 apk-file 和 apk-file2 的大小。您可以包含以下选项:
输出示例(旧大小 / 新大小 / 大小差异 / 路径) 39086736 48855615 9768879 / 10678448 11039232 360784 /classes.dex 18968956 18968956 0 /lib/ 110576 110100 -476 /AndroidManifest.xml ... |
| 查看 APK 文件系统 | 描述 |
files list apk-file
|
列出 APK 中的所有文件。
输出示例 / /classes2.dex /classes.dex /assets/ /assets/asset.data /AndroidManifest.xml /resources.arsc /res/ ... |
files cat --file path apk-file
|
打印文件内容。您必须使用 --file path 选项指定 APK 内部的路径,例如 --file /AndroidManifest.xml。 |
| 查看清单中的信息 | 描述 |
manifest print apk-file
|
以 XML 格式打印 APK 清单。 |
manifest application-id apk-file
|
打印应用 ID 值。 |
manifest version-name apk-file
|
打印版本名称值。 |
manifest version-code apk-file
|
打印版本代码值。 |
manifest min-sdk apk-file
| 打印最低 SDK 版本。 |
manifest target-sdk apk-file
|
打印目标 SDK 版本。 |
manifest permissions apk-file
|
打印权限列表。 |
manifest debuggable apk-file
|
打印应用是否可调试。 |
| 访问 DEX 文件信息 | 描述 |
dex list apk-file
|
打印 APK 中的 DEX 文件列表。 |
dex references [--files path] [--files path2] apk-file
|
打印指定 DEX 文件中的方法引用数量。默认为所有 DEX 文件。添加 --files 选项可指定要包含的特定文件。
输出示例 classes.dex 59598 classes2.dex 8042 |
dex packages [option1 option2 ...] apk-file
|
打印来自 DEX 的类树。在输出中,P、C、M 和 F 分别代表包、类、方法和字段。此外,x、k、r 和 d 分别代表已移除、已保留、已引用和已定义的节点。
添加以下选项可优化输出:
输出示例(类型/状态/定义的方法/引用的方法/字节大小/名称) 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() |
dex code --class class [--method method]
|
以 smali 格式打印类或方法的字节码。必须提供类名,且会打印完全限定类名以进行反编译。添加 --method 选项可指定要反编译的方法。
方法反编译的格式为 |
| 查看 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。
如果您想指定资源表包名,请包含 |
resources names --config config --type type [--package package] apk-file
|
打印特定配置和类型的资源名称列表。type 选项是资源类型,例如 string。如果您想指定资源表包名,请包含 --package 选项,否则将使用第一个定义的包。 |
resources xml --file path apk-file
|
以人类可读格式打印二进制 XML 文件。包含 file 选项以指定文件路径。 |