使用 R8 缩减应用大小、优化应用并加快应用开发速度
欢迎来到 Android 性能聚焦周的第一天!
首先,我们将介绍一种最有效且只需少量工作即可提升应用性能的方法:在完整模式 下启用 R8 优化器。
您可能已经知道 R8 是一种用于缩减应用大小的工具。它在移除未使用的代码和资源方面表现出色,可以有效缩减应用大小。但其真正的强大之处在于,它是一款出色的优化器。
当您启用完整模式并允许优化时,R8 会执行深度、全程序优化,重写您的代码,从根本上提高效率。这不仅仅是小幅调整。
阅读本文后,请在 YouTube 上观看 R8 优化器的性能聚焦周简介。
R8 如何提升应用性能
接下来,我们将重点介绍 R8 优化器为提升应用性能而采取的主要步骤。
摇树(优化) 是缩减应用大小的最重要步骤。在此阶段,R8 优化器会从应用所依赖的库中移除未使用的代码,并从您自己的代码库中移除无用代码。
方法内联 会将方法调用替换为实际代码,从而提高运行时性能。
类合并 和其他策略用于使代码更紧凑。此时,您所有精美的抽象(例如接口和类层次结构)都无关紧要,并且可能会被移除。
代码缩减大小 用于将类、字段和方法的名称更改为更短、无意义的名称。因此,您可能会得到一个名为 a 的类,而不是 MyDataModel。这是从经过 R8 优化的应用读取堆栈轨迹时最容易造成混淆的原因。(请注意,我们在 AGP 9.0 中对此进行了改进!)
资源缩减 通过移除未使用的资源(例如 XML 文件和可绘制对象)进一步缩减应用大小。
通过应用这些步骤,R8 优化器可以缩短 应用启动时间,实现 更流畅的界面渲染,减少缓慢和冻结的帧,并提高设备上的整体资源使用率。
案例研究:Reddit 通过 R8 提升性能
为了说明 R8 可以带来的性能提升,我们来看一个 Reddit 的示例。在完整模式下启用 R8 后,Reddit for Android 应用在各个方面都实现了显著的性能提升。
说明:R8 如何提升 Reddit 的应用性能
该团队观察到,冷启动速度提升了 40% ,“应用无响应”(ANR) 错误减少了 30% ,帧渲染速度提升了 25% ,以及应用大小缩减了 14% 。
这些改进对于提升用户满意度至关重要。更快的启动速度意味着更少的等待时间和更快的内容访问速度。更少的 ANR 错误意味着应用更稳定可靠,减少了用户的挫败感。更流畅的帧渲染消除了界面卡顿,使滚动和动画感觉流畅且响应迅速。这种积极的技术影响在用户情绪中也清晰可见。
如需详细了解他们的改进,请参阅我们的博客。
使用 R8 的非技术性副作用
在与合作伙伴的合作过程中,我们发现这些技术改进直接影响了用户满意度,并反映在用户留存率、互动度和会话时长上。用户黏度(可以通过每日、每周或每月活跃用户数来衡量)也因技术性能的提升而受到积极影响。我们还发现,Play 商店中的应用评分与 R8 的采用率呈正相关。与您的产品负责人、首席技术官和决策者分享这些信息有助于加快应用性能的提升。
因此,让我们直截了当地说:有意识地优化性能是一种美德 。
引导您打造性能更出色的应用
我们了解到,我们需要改进针对 R8 的开发者指南。因此,我们开始着手改进。现在,针对 R8 优化器的 开发者指南 更具实用性,并提供了有关启用和调试 R8 的全面指导。
该文档将引导您了解采用 R8 的总体策略,强调选择优化友好型库的重要性,以及逐步采用 R8 的功能以确保稳定性。这种分阶段方法可让您安全地解锁 R8 的优势,同时为您提供有关难以调试的问题的指导。
我们大幅扩展了有关 Keep 规则 的指南,Keep 规则是控制 R8 优化器的主要机制。现在,我们提供了一个部分,介绍 Keep 规则是什么、如何应用 Keep 规则,并提供有关编写和维护 Keep 规则的最佳实践。我们还提供了实用且可操作的用例和示例,帮助您了解如何正确阻止 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 即可启用 R8。您还可以在此步骤中传递默认和自定义配置文件。
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+ 团队发现其应用的性能显著提升。
在向用户推出包含此更改的新版应用后,Disney+ 发现应用启动速度提升了 30%,用户感知到的 ANR 错误减少了 25%。
如今,许多应用仍在使用包含 -dontoptimize 标志的 proguard-android.txt 文件。而这正是我们改进工具的原因。
工具支持
从 Android Studio Narwhal 3 功能更新 开始,当您使用 proguard-android.txt 时,系统会显示 lint 警告
从 AGP 9.0 开始,我们将完全停止支持 该文件。这意味着您必须迁移到 proguard-android-optimize.txt。
我们还投入了大量精力来开发 Android Studio 新功能 ,以便让调试经过 R8 优化的代码比以往更加轻松。从 AGP 9.0 开始,您现在可以在 Android Studio 的 Logcat 中自动取消混淆经过 R8 处理的 build 的堆栈轨迹,帮助您准确找出导致问题的代码行,即使是在经过全面优化的应用中也是如此。我们将在明天发布的关于 Android 性能聚焦周的博文中更深入地介绍这一点。
后续步骤
在 YouTube 上观看 R8 优化器的性能聚焦周简介。
📣 参加性能挑战!
现在是亲身体验福利的时候了。
我们向您发起挑战,请您今天 为您的应用启用 R8 完整模式。
- 按照我们的开发者指南开始使用: 启用应用优化。
-
检查您是否仍在使用
proguard-android.txt,并将其替换为proguard-android-optimize.txt。 - 然后,衡量所产生的影响 。不要仅仅 感受差异,还要 验证差异。通过调整我们 GitHub 上的 Macrobenchmark 示例应用 中的代码来衡量性能提升,以衡量启动时间前后。
我们相信,您会发现应用的性能有显著提升。如果您有关于启用或排查 R8 问题,请使用 #optimizationEnabled。我们会随时为您提供帮助。
请在周五的 Ask Android 环节中提出您的问题
使用社交媒体标记 #AskAndroid 提出任何性能问题。在整个一周内,我们都会关注您的问题,并将在 11 月 21 日(周五)的 Ask Android 性能环节中回答几个问题。请关注明天的内容,我们将更深入地介绍调试和问题排查。但现在,请开始使用 R8,让您的应用快速发展。
继续阅读
-
活动和计划
从 R8 优化器和 Profile Guided Optimizations 的基础功能,到 Jetpack Compose 带来的性能提升,再到有关提升应用性能的新指南,我们介绍了构建高性能应用所需的低工作量、高影响力的工具。
Ben Weiss, Sara Hamilton • 阅读用时:3 分钟
-
活动和计划
Google I/O 大会日程已发布!
阅读用时:1 分钟
-
活动和计划
去年 9 月,我们分享了对 Google Play 游戏的未来愿景,其核心理念是:提升游戏成功的最佳方式是提供世界一流的玩家体验。
Maru Ahues Bouza • 阅读用时:3 分钟
随时了解最新动态
每周通过电子邮件接收最新的 Android 开发洞见 每周。