运用 APK 剖析器剖析 build

Android Studio 包含一个 APK 剖析器,可让您在构建流程完成后当即了解 APK 或 Android App Bundle 文件的组成。运用 APK 剖析器能够削减调试运用的 DEX 文件和资源相关问题所用的时刻,而且有助于减小 APK 的巨细。您也能够运用apkanalyzer从命令行运转 APK 剖析器。

借助 APK 剖析器,您能够:

  • 检查运用中的文件(如 DEX 和 Android 资源文件)的肯定巨细和相对巨细。
  • 了解 DEX 文件的组成。
  • 快速检查运用中的文件(如AndroidManifest.xml文件)的终究版别。
  • 对两个 APK 或 app bundle 进行并排比较。

当某个项目处于翻开状况时,您能够通过以下三种办法访问 APK 剖析器:

  • 将 APK 或 app bundle 拖到 Android Studio 的Editor窗口中。
  • Project窗口中切换到Project视图,然后在默许的build/output/apks/目录中双击相应 APK。
  • 菜单栏中依次挑选Build > Analyze APK,然后挑选您的 APK 或 app bundle。

检查文件和巨细信息

APK 是遵循 ZIP 文件格式的文件。APK 剖析器将每个文件或文件夹显现为一个实体,您可打开这些实体以导航到相应文件夹。这些实体的层次结构反映了 APK 中的文件和文件夹的结构。

APK 剖析器会显现每个实体的原始文件巨细和下载文件巨细值,如图 1 所示。Raw File Size表明实体在磁盘上未经紧缩时的巨细。Download Size则表明实体由 Google Play 提交时的紧缩后巨细的估计值。 % of Total Download Size表明实体占 APK 总下载巨细的百分比。

Android-使用 APK 分析器分析 build

图 1. APK 剖析器中的文件巨细。

检查 AndroidManifest.​xml

假如您的项目包含多个AndroidManifest.xml文件(如产品变种的清单文件)或许包含的库也供给清单文件,这些文件会在您的运用中合并成一个文件。此清单文件在 APK 或 app bundle 中一般是二进制文件,但在 APK 剖析器中挑选此文件后,系统会重构并呈现此实体的 XML 格式。

在此检查器中,您能够了解在构建期间或许对您的运用所做的任何更改。例如,您能够看到运用所依靠的某个库中的AndroidManifest.xml文件是怎么合并到终究AndroidManifest.xml文件中的。

此外,此检查器还供给了一些 lint 功用,而且会在右上角显现正告或错误。图 2 显现了检查器正在报告选定清单文件中的一条错误。

Android-使用 APK 分析器分析 build

图 2. 所选清单文件的右上方显现了一个错误图标。

检查 DEX 文件

在 APK 剖析器的 DEX 文件检查器中,您能够当即检查运用的 DEX 文件中的底层信息。该检查器中供给了类、软件包、总引证和声明计数,这有助于决议是否运用 MultiDex 或怎么移除依靠项以避免超出64K DEX 约束。

图 3 显现了一个低于 64k DEX 约束的中等巨细的运用。Defined MethodsReferenced Methods列中列出了 DEX 文件中每个软件包、类和办法的相关计数。

Referenced Methods列会计算 DEX 文件引证的所有办法。这一般包含在您的代码和依靠项库中界说的办法,以及在代码运用的标准 Java 和 Android 软件包中界说的办法。这些办法计入每个 DEX 文件中的 64k 办法约束。

Defined Methods列仅计算在某一个 DEX 文件中界说的办法,所以此数字是Referenced Methods的子集。

注意:假如将某个依靠项打包在运用中,这两个办法计数都会加上在该依靠项中界说的办法。减缩巨细和代码减缩功用也会在源代码通过编译后显著改动 DEX 文件的内容。

Android-使用 APK 分析器分析 build

图 3. 一个中等巨细的运用。

过滤 DEX 文件树状视图

Class列表正上方,APK 剖析器供给了用于检查所选 DEX 文件内容的过滤器,如图 4 中所示。

Android-使用 APK 分析器分析 build

图 4. 设置 DEX 过滤器来显现BuildConfig的字段和办法。

如需运用过滤器来显现某个类中的所有办法和字段,请履行以下操作:

  1. File列表中,挑选classes.dex文件。

  2. Class列表中,导航到一个类并挑选该类。

  3. 打开您挑选的类。

  4. 切换Show fields图标以显现或躲藏类字段。

  5. 切换Show methods图标以显现或躲藏类办法。

  6. 切换Show all referenced methods or fields图标以显现或躲藏引证的软件包、类、办法和字段。

    在树状视图中,斜体节点是在选定 DEX 文件中没有界说的引证。DEX 文件能够引证在其他文件中界说的办法和字段。例如,System.out.println()是对 Android 框架中的println()办法的引证。

加载 ProGuard 映射

过滤器图标旁边是 ProGuard 映射图标。ProGuard 图标处于灰显状况,直到您加载一组 ProGuard 映射文件来向 DEX 检查器增加一些功用,如对称号进行去混杂处理 (mapping.txt)、显现已移除的节点 (usage.txt),以及指示无法移除的节点 (seeds.txt)。

您导入的 ProGuard 映射文件的生成 build 必须与启用了代码减缩功用后生成 DEX 文件的 build 相同。

Android-使用 APK 分析器分析 build

图 5. 加载 ProGuard 映射…

若要加载 ProGuard 映射文件,请履行以下操作:

  1. 点击Load Proguard Mappings…

  2. 导航到包含映射文件的项目文件夹,然后加载所有文件、文件的任意组合或包含文件的文件夹。

    映射文件一般坐落project/app/build/outputs/mappings/release/。假如文件挑选器检测到此项目结构,会默许挑选release文件夹。

    首要,文件挑选器会检查与mapping.txtseeds.txtusage.txt彻底匹配的文件名。接下来,文件挑选器会检查在任意位置包含文本mappingusageseeds且以.txt结尾的文件名。例如,release-seeds-1.10.15.txt便是一个匹配项。

以下列表介绍了映射文件:

  • seeds.txt:ProGuard 配置阻挠在减缩过程中移除的节点以粗体显现。

  • mapping.txt:启用Deobfuscate names,以便康复由 R8 进行了混杂处理的节点的原始称号。例如,能够将abc之类进行了混杂处理的节点称号康复为MyClassMainActivitymyMethod()

  • usage.txt:启用Show removed nodes,以便显现 R8 在减缩过程中移除的类、办法和字段。康复的节点带删除线。

    如需详细了解怎么运用 R8 对代码进行混杂处理并最大极限地减小其巨细,请参阅减缩、混杂处理和优化运用。

显现字节码、查找用法以及生成 Keep 规矩

Class列表视图中的节点具有一个上下文菜单,其间包含以下选项,可用于检查字节码、查找用法以及显现一个对话框(其间显现了您能够为选定节点仿制并张贴的 ProGuard 规矩)。右键点击Class列表视图中的任意节点即可显现其上下文菜单。

Show bytecode:对选定的类、办法或字段进行反编译,并在对话框中显现 smali 字节码表明方法,如下所示:

Android-使用 APK 分析器分析 build

图 6. init办法的 DEX 字节码。

Find usages:显现 DEX 代码的哪些其他部分对选定的类或办法进行了引证,如图 7 中所示。假如加载了seeds.txt,以粗体显现的节点表明 ProGuard 配置阻挠在紧缩过程中移除这些节点:

Android-使用 APK 分析器分析 build

图 7.MyClass的引证。

Generate Proguard Keep rule:显现您能够仿制并张贴到项目 ProGuard 配置文件中的 Proguard 规矩,如图 8 中所示。这样可阻挠在代码减缩阶段移除给定的软件包、类、办法或字段。如需了解概况,请参阅自界说要保存的代码。

Android-使用 APK 分析器分析 build

图 8. 您能够从对话框仿制到 ProGuard 配置文件中的 Proguard 规矩。

检查代码和资源实体

各种构建任务会更改运用中的终究实体。例如,ProGuard 减缩规矩或许会改动您的终究代码,而图片资源或许会被产品变种中的资源替换。

如需运用 APK 剖析器检查文件的终究版别,请点击相应实体以显现文本或图片实体的预览,如图 9 中所示。

Android-使用 APK 分析器分析 build

图 9. 终究图片资源的预览。

APK 剖析器还能够显现各种文本和二进制文件。例如,在resources.arsc实体检查器中,您能够检查配置专用的值,如字符串资源的言语翻译。在图 10 中,您能够看到每个字符串资源的翻译。

Android-使用 APK 分析器分析 build

图 10. 已翻译字符串资源的预览。

比较文件

APK 剖析器能够比较两个不同 APK 或 app bundle 文件中的实体巨细。当您需求了解为什么您的运用较之从前版别有所增大时,这十分有用。

在发布通过更新的运用之前,请履行以下操作:

  1. 将要发布的运用版别加载到 APK 剖析器中。

  2. 点击 APK 剖析器右上角的Compare with previous APK…

  3. 在挑选对话框中,找到上次向用户发布的工件,然后点击OK

    此时将显现一个类似于图 11 中的对话框,帮助您评估更新或许会对用户产生的影响。

图 11 显现了特定运用的调试 build 和发布 build 之间的差异。这两种 build 类型运用不同的 build 选项,因而会以不同的办法改动底层实体。

Android-使用 APK 分析器分析 build

图 11. 调试版 APK 和发布版 APK 之间的差异。