DEX 代码优化

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

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

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

检测问题

当应用的 DEX 代码优化、缩减或混淆级别未达到定义的最低百分比时,Android Vitals 可以在 Play 管理中心内向您发出提醒。

优化得分的计算方式

对于使用 AGP 8.10 或更高版本的最新补丁版本(例如 8.10.1,而非 8.10.0)构建的应用,这些百分比是从包含的 r8.json 文件中提取的。请确保您使用的是 AGP 和 R8 次要版本的最新补丁版本,以便生成准确的元数据。

对于使用较低版本 AGP 构建的应用,或使用不包含 r8.json 的其他代码优化工具进行优化的应用,Android Vitals 会使用 mapping.txt 文件(如果包含)或 DEX 启发法来估算混淆百分比。

DEX 总大小下限

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

  • 应用:app bundle 包含至少 10 MB 的 DEX 代码(按未压缩大小计算)
  • 游戏:app bundle 包含至少 50 MB 的 DEX 代码(按未压缩大小衡量)

在本地衡量代码优化效果

如需测量 app bundle 的未压缩 DEX 大小,并获取与 Android Vitals 中的结果一致的优化、缩减和混淆百分比,请运行 android analyze:

android analyze <yourapp>.aab

解决问题

如需解决 DEX 代码优化得分较低的问题,请根据您的构建系统和优化工具查看相应建议:

R8

如需提高 R8 DEX 代码优化得分,请参阅改进 R8 优化中的指南,并使用 R8 配置分析器了解保留规则如何影响优化、缩减和混淆得分(如需详细了解这些指标的定义,请参阅了解报告)。

如果您使用 Android Gradle 插件 (AGP),还可以使用 R8 分析器技能获取有关优化应用保留规则的其他指导。如果您使用 Bazel,还可以使用 R8 配置分析器;请参阅 rules_android R8 优化文档。

非 R8 优化器和 DEX 后处理器

如果您的构建流水线使用自定义构建工具或辅助 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 规则可能不那么容易识别。如果您怀疑库使用方规则会影响优化,可以使用 android analyze <library>.aar 直接检查库,也可以通过以下方式进行验证:使用最新版本的 AGP 将库添加到独立的示例应用中,然后使用 R8 配置分析器进行检查。