活动和计划

使用 R8 缩减、优化应用并加快应用开发速度

阅读用时:5 分钟
Ben Weiss
开发者关系工程师

使用 R8 缩减、优化应用并加快应用开发速度

欢迎来到“Android 性能聚焦周”的第一天!

首先,我们将介绍一项最有效且最省力的更改,您可以通过这项更改来提升应用的性能:在完整模式下启用 R8 优化器。

您可能已经知道 R8 是一种可用于缩减应用大小的工具。它能出色地移除未使用的代码和资源,从而缩减应用的大小。但它的真正实力在于作为优化器的强大功能,这才是它真正g-R8 的地方。

当您启用完整模式并允许优化时,R8 会执行深入的程序级优化,重写您的代码,使其从根本上更高效。这不仅仅是小幅调整。

阅读本文后,不妨前往 YouTube 观看“Performance Spotlight Week”系列视频,了解 R8 优化器。

R8 如何提升应用性能

image.png

下面,我们重点介绍 R8 优化器为提升应用性能而采取的最大步骤。

摇树优化是缩减应用大小的最重要一步。在此阶段,R8 优化器会从应用所依赖的库中移除未使用的代码,并从您自己的代码库中移除无效代码。

方法内联是指用实际代码替换方法调用,从而提高运行时性能。

应用类合并和其他策略,使代码更紧凑。此时,您所有精美的抽象概念(例如接口和类层次结构)都无关紧要,并且可能会被移除。

代码缩减用于将类、字段和方法的名称更改为更短且无意义的名称。因此,您最终可能会得到一个名为 a 的类,而不是 MyDataModel。这正是从 R8 优化后的应用读取堆栈轨迹时最令人困惑的地方。(请注意,我们已在 AGP 9.0 中改进了这一点!)

资源缩减通过移除未使用的资源(例如 XML 文件和可绘制对象)来进一步缩减应用的大小。

通过应用这些步骤,R8 优化器可缩短应用启动时间,实现更流畅的界面渲染,减少缓慢和冻结的帧,并提高整体设备端资源使用率。

案例研究:Reddit 通过 R8 提升性能

下面以 Reddit 的一个示例为例,说明 R8 可以带来的性能提升。在完全模式下启用 R8 后,Reddit for Android 应用在各个方面都取得了显著的性能提升。

image.png

字幕:R8 如何提升 Reddit 的应用性能

该团队发现,冷启动速度提升了 40% ,“应用无响应”错误减少了 30% ,帧渲染提升了 25% ,应用大小减少了 14%

这些增强功能对于提高用户满意度至关重要。更快的启动速度意味着等待时间更短,可以更快地访问内容。减少 ANR 可让应用更稳定可靠,从而减少用户的不满。更流畅的帧渲染可消除界面卡顿,使滚动和动画感觉流畅且响应迅速。这种积极的技术影响也清晰地体现在用户情绪中。

如需详细了解这些改进,请参阅我们的博客

使用 R8 的非技术性副作用

在与合作伙伴合作的过程中,我们发现这些技术改进直接影响了用户满意度,并体现在用户留存率、互动度和会话时长上。用户黏度(可通过日活跃用户数、周活跃用户数或月活跃用户数来衡量)也因技术性能的改进而有所提升。我们发现,Play 商店中的应用评分随着 R8 的采用而有所提高。与产品负责人、首席技术官和决策者分享此信息有助于提升应用的性能。

image.png

因此,我们不妨直截了当地说:有意识地优化性能是一种美德

帮助您打造性能更出色的应用

我们了解到,针对 R8 的开发者指南需要改进。于是,我们开始着手解决这个问题。R8 优化工具的开发者指南现在更具实用性,可提供全面的指南来启用和调试 R8。

该文档会指导您制定采用的高级策略,强调选择优化友好型库的重要性,以及逐步采用 R8 的功能以确保稳定性。这种分阶段方法可让您安全地享受 R8 的优势,同时为您提供有关难以调试的问题的指导。

我们大幅扩展了有关 Keep 规则的指南,这些规则是控制 R8 优化器的主要机制。我们现在提供了一个部分,其中介绍了什么是保留规则、如何应用保留规则,并指导您了解编写和维护保留规则的最佳实践。我们还提供了实用且可行的使用情形和示例,帮助您了解如何正确防止 R8 移除运行时需要的代码,例如通过反射或使用 JNI 原生接口访问的代码。

文档现在还涵盖了必要的后续步骤和高级场景。我们添加了有关测试和问题排查的部分,以便您验证性能提升情况并调试可能出现的任何问题。高级配置部分介绍了如何定位特定 build 变体、自定义要保留或移除的资源,并为库作者提供了特殊的优化说明,确保您可以为其他开发者提供经过优化且 R8 友好的软件包。

充分发挥 R8 优化器的潜能

自 Android Gradle 插件 8.0 版起,R8 优化器默认使用“完整模式”。如果您的项目已开发多年,可能仍包含用于停用该功能的旧版标志。检查您的 gradle.properties 文件中是否包含此行,并将其移除。

android.enableR8.fullMode=false // delete this line to enable R8's full potential

现在,检查您是否已在应用的 build.gradle.kts 文件中为发布变体启用了 R8。通过将 isMinifyEnabled 和 isShrinkResources 设置为 true 来启用。您还可以在此步骤中传递默认配置文件和自定义配置文件。

  release {

   isMinifyEnabled = true

   isShrinkResources = true

   proguardFiles(

       getDefaultProguardFile("proguard-android-optimize.txt"),

       "keep-rules.pro"

   )

}

案例研究:Disney+ 性能改进

Disney+ 的工程师致力于提升应用性能,并不断优化应用的用户体验。有时,即使是看似微小的变化,也能带来巨大的影响。在检查其 R8 配置时,该团队发现使用了 -dontoptimize 标志。它是由默认配置文件引入的,而许多应用至今仍在使用该文件。

将 proguard-android.txt 替换为 proguard-android-optimize.txt 后,Disney+ 团队发现应用的性能有了显著提升。

image.png

在向用户推出包含此更改的新版应用后,Disney+ 的应用启动速度提高了 30%,用户感知的 ANR 数量减少了 25%。

如今,许多应用仍在使用包含 -dontoptimize 标志的 proguard-android.txt 文件。这正是我们改进工具的原因。

工具支持

Android Studio Narwhal 3 功能更新开始,使用 proguard-android.txt 时会看到 lint 警告

image.png

从 AGP 9.0 开始,我们将完全停止支持该文件。这意味着您必须迁移到 proguard-android-optimize.txt

我们还投入资源开发了新的 Android Studio 功能,让调试 R8 优化后的代码比以往更加轻松。从 AGP 9.0 开始,您现在可以在 Android Studio 的 Logcat 中自动对 R8 处理过的 build 进行堆栈轨迹去混淆,从而帮助您精确定位导致问题的确切代码行,即使在完全优化的应用中也是如此。在明天发布的关于“Android 性能聚光灯周”的博文中,我们将更深入地介绍此功能。

后续步骤

在 YouTube 上观看“Performance Spotlight Week”系列视频,了解 R8 优化器。

📣 参加效果挑战赛!

现在是时候亲身体验这些福利了。

我们建议您立即为应用启用 R8 完整模式。

  1. 请按照我们的开发者指南开始操作: 启用应用优化
  2. 检查您是否仍在使用 proguard-android.txt,并将其替换为 proguard-android-optimize.txt
  3. 然后,衡量效果。不要只是感觉到差异,还要验证差异。通过调整 GitHub 上的 Macrobenchmark 示例应用中的代码来衡量性能提升,以测量启动时间前后。

我们相信,您会看到应用的性能有显著提升。如果您在启用或排查 R8 方面有任何问题,请使用 #optimizationEnabled。我们会随时为您提供帮助。

欢迎在周五的“Ask Android”环节中提出问题

如果您有任何性能方面的问题,请使用社交媒体标记 #AskAndroid。在整个周内,我们都会关注您的问题,并将在 11 月 21 日(星期五)的“Ask Android”环节中解答有关性能的几个问题。请继续关注明天的内容,我们将更深入地探讨调试和问题排查。不过,现在就从 R8 开始,让您的应用走上快车道。

作者:

继续阅读