apkanalyzer

APK 分析器的命令行版本在构建过程完成后可立即洞察 APK 的组成,并允许您比较两个 APK 之间的差异。使用 APK 分析器可减少您花费在调试应用中 DEX 文件和资源问题上的时间,并减小 APK 的大小。

apkanalyzer 包含在 Android SDK 命令行工具 软件包中,位于 android_sdk/cmdline-tools/version/bin/apkanalyzer。或者,您可以按照 使用 APK 分析器分析您的构建 中的说明,在 Android Studio 中访问 APK 分析器工具。

语法

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 文件属性 描述
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-fileapk-file2 的大小。您可以包含以下选项
  • --different-only:打印具有差异的目录和文件。
  • --files-only:不打印目录条目。
  • --patch-size:显示文件级补丁的估算值,而不是原始差异。

示例输出(旧大小/新大小/大小差异/路径)

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 包 [option1 option2 ...] apk-文件 打印 DEX 中的类树。在输出中,PCMF 分别表示包、类、方法和字段。而 xkrd 分别表示已移除、已保留、已引用和已定义的节点。

添加以下选项以细化输出

  • --defined-only:仅在输出中包含 APK 中定义的类。
  • --files:指定要包含的 DEX 文件名。默认值:所有 DEX 文件。
  • --proguard-folder 文件:指定要搜索映射的 Proguard 输出文件夹。
  • --proguard-mappings 文件:指定 Proguard 映射文件。
  • --proguard-seeds 文件:指定 Proguard 种子文件。
  • --proguard-usages 文件:指定 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()
dex code --class [--method 方法] 以 smali 格式打印类或方法的字节码。类名是必需的,并打印要反编译的完全限定类名。添加 --method 选项以指定要反编译的方法。

方法反编译的格式为 name(params)returnType,例如 someMethod(Ljava/lang/String;I)V

查看存储在 res/ 和 resources.arsc 中的资源 描述
resources 包 打印在资源表中定义的包列表。
resources configs --type 类型 [--package ] apk-文件 打印指定 类型 的配置列表。类型 是资源类型,例如 string。如果要指定资源表包名,请包含 --package 选项,否则将使用第一个定义的包。
resources value --config 配置 --name 名称 --type 类型 [--package ] apk-文件 打印由 配置名称类型 指定的资源的值。类型 选项是资源类型,例如 string

如果要指定资源表包名,请包含 --package 选项,否则将使用第一个定义的包。

resources names --config 配置 --type 类型 [--package ] apk-文件 打印配置和类型的资源名称列表。类型 选项是资源类型,例如 string。如果要指定资源表包名,请包含 --package 选项,否则将使用第一个定义的包。
resources xml --file 路径 apk-文件 打印二进制 XML 文件的易于阅读的形式。包含 文件 选项以指定文件的路径。