Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

apkanalyzer

使用 APK 分析器的命令行版本,您可以在编译流程完成后立即了解 APK 的组成,并可以比较两个 APK 之间的差异。使用 APK 分析器可以让您花更少的时间来排除应用中 DEX 文件和资源上的问题,并减小 APK 的大小。

apkanalyzer 包含在 Android SDK Tools 软件包中,位于 android_sdk/tools/bin/apkanalyzer 下。或者,您也可以使用 Android Studio 中的 APK 分析器工具,如使用 APK 分析器分析您的编译中所述。

语法

    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

全局选项

选项 说明
--human-readable 以可读性良好的格式输出大小。

命令

以下命令说明按 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 选项(例如 --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 输出类树。在输出中,PCMF 分别表示软件包、类、方法和字段。xkrd 分别表示已移除、保留、引用和定义的节点。

添加以下选项可优化输出:

  • --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()
dex code --class class [--method method] 以 smali 格式输出类或方法的字节码。输出中必需包含类名称,并且要输出完全限定的类名以进行反编译。添加 --method 选项可指定要反编译的方法。方法反编译的格式是 name(params)returnType,例如 someMethod(Ljava/lang/String;I)V
查看存储在 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 输出由 confignametype 指定的资源的值。type 选项是资源的类型,例如 string。如果要指定资源表软件包名称,请添加 --package 选项,否则将会使用第一个定义的软件包。
resources names --config config --type type [--package package] apk-file 输出属于某个配置和类型的资源名称列表。type 选项是资源的类型,例如 string。如果要指定资源表软件包名称,请添加 --package 选项,否则将会使用第一个定义的软件包。
resources xml --file path apk-file 输出可读性良好的二进制 XML 文件。添加 file 选项可指定文件路径。