(九)Android 性能优化 APK 分析器

771 阅读6分钟

人生在勤,不索何获。

什么是APK 分析器 ?

 Android Studio 包含一个 APK 分析器,可让您在构建流程完成后立即了解 APK 的组成。使用 APK 分析器可以减少调试应用的 DEX 文件和资源相关问题所用的时间,并且有助于减小 APK 的大小。

APK 分析器可以干什么 ?

  • 查看 APK 中的文件(如 DEX 和 Android 资源文件)的绝对大小和相对大小。
  • 了解 DEX 文件的组成。
  • 快速查看 APK 中的文件(如 AndroidManifest.xml 文件)的最终版本。
  • 对两个 APK 进行并排比较。

实操体验

(1)访问 APK 分析器

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

(2)查看文件信息

APK 分析器中的文件大小

 APK 是遵循 ZIP 文件格式的文件

  • Raw File Size:表示实体在磁盘上未经压缩时的大小
  • Download Size:则表示实体由 Google Play 提供时的压缩后大小的估计值
  • % of Total Download Size: 表示实体占 APK 总下载大小的百分比

(3)查看清单文件

APK 清单文件

  • 在APK中,多个清单文件会最终合并成一个
  • 清单文件在 APK 中通常是二进制文件,但在 APK 分析器中会以XML格式显示
  • 查看器还提供了一些 Lint 功能,并且会在右上角显示相关警告或错误

(4)查看 DEX 文件

APK DEX文件

 查看器中提供了类、软件包、总引用和声明计数

  • Defined Methods:仅统计在某一个 DEX 文件中定义的方法,所以此数字是 Referenced Methods 的子集
  • Referenced Methods:会统计 DEX 文件引用的所有方法。这通常包括在您的代码和依赖项库中定义的方法,以及在代码使用的标准 Java 和 Android 软件包中定义的方法 - 这些方法计入每个 DEX 文件中的 64k 方法限制
  • Size: 对应的文件大小

(5)过滤 DEX 文件

 过滤 DEX 文件树状视图(参考上面DEX文件图)。
 在 Class 列表正上方,APK 分析器提供了用于查看选定 DEX 文件内容的过滤器。要使用过滤器来显示某个类中的所有方法和字段,请执行以下操作:

  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() 方法的引用。

(6)加载 ProGuard 映射

 加载 ProGuard 映射(参考上面DEX文件图)。
 过滤器图标旁边是 ProGuard 映射图标。它们处于灰显状态,直到您加载一组 ProGuard 映射文件来向 DEX 查看器添加一些功能,如对名称进行反混淆处理 (mapping.txt)、显示已移除的节点 (usage.txt),以及指示无法移除的节点 (seeds.txt)。您导入的 ProGuard 映射文件的构建版本必须与启用了代码缩减功能后生成的 APK 的构建版本相同。

APK DEX加载ProGuard映射

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

  1. 点击 Load Proguard Mappings
  2. 导航到包含映射文件的项目文件夹,然后加载所有文件、文件的任意组合或包含文件的文件夹。
  3. 映射文件通常位于project/app/build/outputs/mappings/release/。如果文件选择器检测到此项目结构,会默认选择 release 文件夹。文件选择器会检查与 mapping.txtseeds.txt 和 usage.txt 完全匹配的文件名。
  4. 以下列表介绍了映射文件:
  • seeds.txt:ProGuard 配置阻止在压缩过程中移除的节点以粗体显示。
  • mapping.txt:启用 Deobfuscate names(点击图标),以便恢复由 R8 进行了混淆处理的节点的原始名称。例如,可以将 abc 之类进行了混淆处理的节点名称恢复为 MyClassMainActivity 和 myMethod()
  • usage.txt:启用 Show removed nodes(点击图标),以便显示 R8 在压缩过程中移除的类、方法和字段。恢复的节点带删除线。

APK DEX加载ProGuard映射之Usage示例

有何感受?映射文件就像一把钥匙,定位编译器优化的细节。

(7)用法和规则

 显示字节码、查找用法以及生成 Keep 规则。
 右键点击 Class 列表视图中的任意节点即可显示其上下文菜单。Class 列表视图中的节点具有一个上下文菜单。

APK DEX 上下文菜单

(7.1)Show bytecode

 对选定的类、方法或字段进行反编译,并在对话框中显示 smali 字节码(而不是 Java 代码)表示形式。

APK DEX 显示字节码

(7.2)Find usages

 显示 DEX 代码的哪些其他部分对选定的类或方法进行了引用。如果加载了 seeds.txt,以粗体显示的节点表示 Proguard 配置阻止在压缩过程中移除这些节点。

APK DEX 查找用法

(7.3)Generate Proguard Keep rule

 显示您可以复制并粘贴到项目 Proguard 配置文件中的 Proguard 规则,这些规则可阻止在代码缩减阶段移除给定的软件包、类、方法或字段。

APK DEX 生成keep规则

有何感受?还在为自己不会写混淆文件而发愁吗?别人都帮我们写好了。

(8)查看代码和资源实体

 使用 APK 分析器可以轻松查看文件的最终版本:只需点击相应实体,下方便会显示文本或图片实体的预览。

APK 查看资源实体

 APK 分析器还可以显示各种文本和二进制文件。例如,在 resources.arsc 实体查看器中,您可以查看配置专用的值,如字符串资源的语言翻译。

APK 查看资源文本

有何感受?语言的横向对比器有木有,快速检查我们的多语言问题。

(9)比较 APK 文件

 APK 分析器可以比较两个不同 APK 文件中的实体大小。当您需要了解为什么您的应用较之先前版本有所增大时,这非常有用。在发布经过更新的 APK 之前,请执行以下操作:

  1. 将要发布的 APK 版本加载到 APK 分析器中。
  2. 点击 APK 分析器右上角的 Compare With。
  3. 在选择对话框中,找到上次向用户发布的 APK,然后点击 OK。

APK 大小比较

有何感受?每个里程碑的发布版本对比,清晰了解增减量,更好把控品质。

(10)依赖树的生成

APK 依赖树的生成

一起来查看自己的apk吧~

小编的扩展链接

参考链接

只有天在上,更无山与齐

   ❤ 比心 ❤