测试和排查优化问题

启用应用优化后,请检查您的应用是否按预期运行,以及 R8 配置是否按预期运行。一般步骤如下:

  1. 测试应用的关键用户历程 (CUJ):例如,确保用户可以登录和执行其他重要任务。
  2. 使用基准测试衡量性能提升幅度:在启用应用优化前后对应用进行基准测试

如果您发现问题,R8 提供了一些工具来帮助您排查问题。如果您无法解决 R8 问题,请提交 bug

常规提示

R8 问题通常是应用特有的,但以下是一些有助于简化调试的常规提示:

  • 暂时关闭混淆:R8 会在优化过程中混淆代码。混淆通常不是导致错误的原因,但混淆会使错误更难调试。将 ‑dontobfuscate‑dontoptimize 标志添加到 keep 规则文件,以帮助您找出有问题的代码。
  • 检查反射:如果您遇到没有此类元素异常,例如

    Caused by: java.util.NoSuchElementException: Collection contains no element matching the predicate in the stack trace

    此异常通常表示相关字段是通过反射使用,因此您必须添加 keep 规则。

  • 检查字节码:大多数 R8 问题都需要检查字节码,您可以使用 APK 分析器等工具执行此操作。

查看应用了哪些规则

如需输出 R8 在构建项目时应用的所有规则的完整报告,请将以下代码添加到应用的模块 proguard‑rules.pro 文件中:

-printconfiguration <output-dir>/<report-name>.txt

您可以指定任何路径和文件名。如果您未指定路径或文件名,R8 会在 <module-name>/build/outputs/mapping/<build-type>/configuration.txt 中输出规则报告。

了解代码保留的原因

如果您看到了预期要移除的保留代码,请使用配置选项 ‑whyareyoukeeping 来了解保留代码的原因。R8 会输出从保留的代码到应用的某个入口点的路径。如需了解详情,请参阅 Proguard 手册中的 ‑whyareyoukeeping 文档。

恢复原始堆栈轨迹

经过 R8 处理的代码会发生各种更改,因此堆栈轨迹不再引用原始代码。例如,行号以及类和方法的名称可能会发生变化。为了还原原始堆栈轨迹,R8 提供了 retrace 命令行工具,该工具与命令行工具软件包捆绑在一起。

如需使用轨迹还原功能,请为其提供映射文件和堆栈轨迹文件。映射文件(称为 mapping.txt)会自动与您的 Android App Bundle (AAB) 捆绑在一起。如需了解详情,请参阅回溯文档以及介绍如何对崩溃堆栈轨迹进行去混淆处理的 Play 管理中心帮助中心文章。