排查优化问题

由于 R8 的优化会更新应用的代码,因此务必要对应用的行为进行严格测试,以确保应用按预期运行。如果出现意外行为,请使用此页面作为指南,排查优化后可能出现的问题。

在问题排查过程中,请重点关注以下情况:

  • 过度优化导致应用崩溃:您的应用崩溃,因为 R8 优化了过多的代码。
  • 优化不明确或不足:R8 未按您的预期优化应用,或者您需要进一步了解优化。

应用崩溃

如果您的应用在通过 R8 进行优化后崩溃,通常是因为反射损坏。如需识别损坏的反射,请遵循以下准则:

  • 您会观察到异常,这通常意味着所指示的类、方法或字段正在通过反射使用。这些异常通常是以下之一:ClassNotFoundExceptionNoSuchMethodExceptionNoSuchFieldExceptionNoClassDefFoundErrorNoSuchMethodErrorNoSuchFieldError
  • 您会看到引用了反射的代码,其中包含 import kotlin.reflect.*import java.lang.reflect.*
  • 您会看到类构造函数的使用方式如下:Something::class.constructors
  • 您会看到 Class.forName(...)

解决方案:添加保留规则

优化不明确或不足

由于规则是从您的应用以及包含的库中应用的,因此您可能需要更清楚地了解所应用的规则,或者需要说明 R8 为何保留了您希望优化的某些代码部分。

  • 所应用规则存在歧义:由于所包含库中的规则也适用于您的应用,并且这些库中的全局选项也会传播到您的应用,因此您可能不确定应用了哪些规则。

    解决方案:查看 R8 在构建项目时应用的所有规则的报告,了解应用了哪些规则。您可以在 ./app/build/outputs/mapping/configuration.txt 中找到此报告。此报告包含用于配置 R8 的每个库和模块中的所有合并规则,可用于识别低效规则。

  • 保留了过多的代码:R8 的优化可能会保留您希望移除的代码。

    解决方案:使用配置选项 -whyareyoukeeping 帮助了解保留代码的原因。输出包含从保留的代码到应用的某个入口点的路径。如需了解详情,请参阅 -whyareyoukeeping

  • 难以理解原始堆栈轨迹:R8 会以各种方式更改代码,导致堆栈轨迹不再引用原始代码。例如,行号以及类和方法的名称可能会发生变化。

    解决方案:从 Android Studio Otter 3 功能更新和 AGP 9.0 开始,Logcat 会自动对堆栈轨迹进行反混淆处理。不过,如果您使用的是旧版 Android Studio,则需要手动恢复原始堆栈轨迹。如需还原原始堆栈轨迹,请使用 retrace 命令行工具,该工具与命令行工具软件包捆绑在一起。

    如需使用 retrace,请提供包含映射文件和堆栈轨迹文件路径的命令。名为 mapping.txt 的映射文件会自动与您的 Android App Bundle (AAB) 捆绑在一起。如需了解详情,请参阅 retrace 文档以及 Play 管理中心帮助中心内介绍如何对崩溃的堆栈轨迹进行反混淆处理的文章。使用 Play 和 Firebase Crashlytics 时,请使用 mapping.txt 文件,其中包含服务从应用用户处收集的崩溃信息。以下命令展示了如何从项目的根目录运行 retrace

    $ANDROID_HOME/cmdline-tools/latest/bin/retrace app/build/outputs/mapping/$releaseVariant/mapping.txt trace.txt
    

报告错误

如果您无法解决 R8 问题,请提交 bug