DEX 代码优化

DEX 代码优化是一项 Android Vitals 发现,可帮助您监控和提高应用的编译质量、大小和性能。使用 R8 或替代工具(例如 ProGuard 兼容的优化器或辅助 DEX 后处理器)优化和混淆代码,可减小应用的 DEX 大小、提升运行时性能并最大限度地减少其内存占用。

DEX(即 Dalvik Executable)文件包含用于运行应用的已编译代码。这通常包括 Java 和 Kotlin 代码,而不是已编译的 C++ 代码或 .so 文件。

Android Vitals 报告会针对所有应用和游戏提供 DEX 代码优化指标,但只会针对满足特定大小要求的应用和游戏强制执行阈值。

检测问题

当应用的 DEX 代码优化级别较低时,Android Vitals 可以提醒您。这包括使用 R8 的应用和游戏的混淆、缩减和优化。对于未使用 R8 的应用,Android Vitals 会尝试检查优化、缩减和混淆率,但在必要时会回退到混淆启发法作为代理。

监控优化状态

当您的应用未达到代码优化的最低定义百分比时,Android Vitals 可以通过 Play 管理中心提醒您,从而帮助提升应用性能。如需详细了解缩减、优化和混淆处理,请参阅使用 R8 配置分析器

对于使用 AGP 版本 8.10 或更高版本的最新补丁构建的应用,这些百分比是从包含的 r8.json 文件中提取的。

对于较低版本的 AGP 或未包含 r8.json 文件的情况,系统会根据 mapping.txt 文件(如果包含)计算百分比,或者在没有映射文件的情况下使用 DEX 启发式方法。

对于使用替代代码优化器进行优化的应用,Android Vitals 会执行分析,以估计 app bundle 中混淆的类、方法和字段的百分比。

DEX 总大小下限

虽然 Android Vitals 会针对所有应用计算代码优化指标,但只有当您的 app bundle 满足以下总 DEX 大小要求时,您才会收到提醒:

  • 应用:软件包包含至少 10 MB 的 DEX 代码(以未压缩大小衡量)
  • 游戏:软件包包含至少 50 MB 的 DEX 代码(以未压缩大小衡量)

Android Vitals 会显示应用的 DEX 大小,但您也可以使用命令行在本地测量此大小:

  unzip -l <yourapp>.aab | grep -E '\.dex$' | awk '{sum+=$1} END {print sum}'

在本地衡量 R8 代码优化效果

如果您的应用使用 R8 进行优化,您可以使用 R8 配置分析器来衡量应用软件包的优化、混淆和缩减情况。R8 配置分析器报告也包含在 R8 分析器技能中。虽然该报告可帮助您了解保留规则对优化、缩小和混淆得分的影响,但报告中的百分比与 Android Vitals 中的值不一致,因为这些百分比是在优化之前计算的。

如需检查 Android Vitals 用于计算得分的确切元数据,请从 app bundle 中提取 r8.json 文件:

unzip -p <yourapp>.aab BUNDLE-METADATA/com.android.tools/r8.json

解决问题

如需解决 DEX 代码优化得分偏低的问题,请查看基于您的 build 系统和优化器的建议:

Android Gradle 插件和 R8

如需提高 R8 DEX 代码优化得分,请参阅改进 R8 优化中的指南。您还可以使用 R8 分析器技能,获取有关优化应用保留规则的更多指导。

非 R8 构建系统和 DEX 后处理器

如果您的 build 流水线使用自定义 build 工具或辅助 DEX 后处理器,请按以下步骤操作,以改进应用的优化:

  • 在 Android Studio 中打开您的 app bundle,然后在 APK 分析器中查看。
  • 选择所有 .dex 文件
  • 在切换“取消混淆名称”按钮时,请密切注意大小最大的文件(注意:这需要您上传 mapping.txt 文件)。如果您发现其中一些文件在混淆后仍然很大,则很可能是因为它们受到软件包范围的保留规则的影响。
  • proguard-rules.pro 文件、configuration.txt 或优化器的等效文件中(如果您未使用 R8)查找与未混淆的软件包匹配的 keep 规则。例如,如果 com.foo. 是 dex 中的一个大型软件包,请查找格式为 -keep com.foo.**-keep com.foo.bar.** 的 keep 规则。
  • 请注意,库使用方 keep 规则可能不太容易识别。如果您怀疑某个库使用方规则会影响优化,可以将其添加到使用最新版 AGP 的独立示例应用中,并使用 R8 配置分析器检查该规则,从而在本地进行验证。