通过 APK 分析器的命令行版本,您可以在构建流程完成后立即了解 APK 的组成,并且可以比较两个 APK 之间的差异。使用 APK 分析器可以减少调试应用中的 DEX 文件和资源相关问题所花费的时间,并减小 APK 的大小。
apkanalyzer 包含在 Android SDK 命令行工具软件包中(位于 android_sdk/cmdline-tools/version/bin/apkanalyzer)。或者,您也可以在 Android Studio 中访问 APK 分析器工具,如使用 APK 分析器来分析您的 build 中所述。
语法
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选项(如--file
      /AndroidManifest.xml)指定 APK 内的路径。 | 
| 查看清单中的信息 | 说明 | 
| 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选项可指定文件的路径。 | 
