The Android Developer Challenge is back! Submit your idea before December 2.

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 选项可指定文件路径。