Tinder 的使命是让每一代单身人士都能轻松有趣地结识新朋友,从而促进和激发真实的联系。然而,随着 Android 应用代码库规模的扩大,其复杂性也随之增加。在进行最新优化工作之前,该应用大约有 70% 的代码未经过优化,包含 17 个 dex 文件,其中 3 个专门用于启动。尽管他们启用了 R8,但由于保留规则,其大部分优化潜力都受到了限制,而且团队无法确定是哪些具体规则阻碍了优化。为了缩短启动时间并减少用户感知的应用无响应 (ANR) 错误,Tinder 采用了新的 R8 配置分析器来应对这些挑战。
通过使用 R8 配置分析器,Tinder 成功识别并移除了无意中引入的优化阻碍因素。结果立竿见影,成效显著:Tinder 的应用冷启动次数减少了 47%,应用下载大小缩减了 28.98%(降至 61.5 MB),用户感知的 ANR 减少了 28%。
配置分析器
R8 配置分析器通过跟踪缩减、优化和混淆得分来显示 R8 优化情况,从而指出可改进的方面。它会显示宽泛、冗余或过时的保留规则,包括来自外部库的保留规则,以便您分析保留规则的影响并优化保留规则。
配置分析器中显示的关键指标包括:
- 缩减得分:可供 R8 缩减的代码百分比。
- 优化得分:可进行优化的代码百分比(例如,方法内联、横向类合并)。
- 混淆得分:可由 R8 重命名以缩减大小的类、方法和字段所占的百分比。
使用分析器审核保留规则及其影响:
- 查找宽泛规则:缩小限制 R8 优化的软件包级规则的范围,并找出从缩减、优化和混淆处理中排除的具体类、方法和字段。
- 优化规则:仅定位需要反射的特定类/方法,以实现优化
- 移除冗余规则:移除与当前 build 中的零个类、方法或字段匹配的规则。
- 相同的规则:相同的保留规则是指针对相同类、字段和方法的规则,或在相同或不同保留规则文件中重复声明的保留规则。
- 查找被包含的规则:清理已被更广泛配置涵盖的特定规则。
- 找出有问题的库:检查所有库中合并的消费者保留规则对优化的综合影响。
为了帮助您将 R8 配置分析器与智能体工具结合使用,我们发布了 R8 分析器技能。此技能可总结 R8 配置分析器报告,显示关键指标(优化、混淆和缩减分数),从而优化自动化开发工作流。它还会突出显示影响最大的五条 keep 规则,让您清楚了解哪些因素阻碍了代码优化。
找出隐藏的优化障碍
在集成 R8 配置分析器之前,Tinder 的 Android 应用因代码库严重缺乏优化而背负了沉重的技术债务。这种缺乏优化的做法直接降低了用户体验,导致用户遇到冷启动缓慢的问题
为了解决这些问题,Tinder 团队利用 R8 配置分析器全面审核了其 R8 配置。分析器显示,即使在 R8 完整模式下,代码库的 R8 优化率也只有 28% 左右。借助 R8 Configuration Analyzer,Tinder 发现一个内部库引入了一条宽泛且未限定范围的保留规则。
# Prevents optimization in all public classes along with all of their public and protected members -keep public class * { public protected *; }
这条“宽泛”的规则无意中涵盖了整个应用中的各种依赖项,导致大量类无法进行优化。由于过度包含的规则可以防止运行时崩溃,开发者经常会忘记为使用反射的新功能添加新规则,导致隐藏的问题随着时间的推移而不断累积。
通过利用 R8 配置分析器提供的分析洞见,该团队成功追踪并分析了受库中宽泛保留规则影响的具体类。该团队立即发现,在 R8 可以进行优化的较大、非动态调用的类中,优化被阻止了。通过优化这一特定的 keep 规则,Tinder 释放了巨大的优化潜力,理清了遗留配置,并大幅提升了整体优化指标,R8 得分从 28% 跃升至 50%,使整个应用的性能立即得到提升。目前,Tinder 团队正在积极努力,以进一步提高这一指标。
- 加载速度更快:该团队将应用冷启动速度慢的用户比例降低了 47%。
- 占用空间更小:应用下载大小从 86.6MB 降至 61.5MB(缩减了 28.98%)。
- 稳定性提升:用户感知的应用无响应 (ANR) 错误率从 0.35% 降至 0.28%,显著接近同类应用的中位数
- 降低复杂性:DEX 文件总数从 17 个减少到 11 个,其中仅包含 2 个启动文件。
除了这些技术性能提升之外,应用优化程度的提高还直接转化为切实的业务增长和更高的用户互动度,尤其是在资源受限的市场中。
- 区域互动度:在低 RAM 设备占据巨大市场份额的国家/地区,互动度增幅最大,而降低 ANR 发生率是提高这一庞大市场互动度的关键。
- 互动度提升:自应用优化力度加大以来,互动度提升了 3%。
通过持续集成保障未来性能
解决代码缩减问题并非一劳永逸,而是需要持续关注。R8 配置分析器带来了巨大的性能提升,这让 Tinder 的 Android 团队深受鼓舞,他们主动将优化监控集成到日常工作流程中,以防止性能下降。
Tinder 的团队在其 CI/CD 流水线中添加了一项新作业,用于报告优化统计信息的变化,以便每个人都能看到自己的贡献对优化产生的影响。在向其他考虑集成 R8 配置的开发者提供建议时,该团队强调了审核内部依赖项的重要性。虽然大多数热门第三方库都附带明确定义的规则,但被视为“稳定”的公司内部项目实际上可能会引入广泛的规则,从而对整体优化产生负面影响。
重点小结
面对严重未优化的代码库和大量 DEX 文件,Tinder 需要一种方法来清晰地审核其应用的缩减规则。R8 配置分析器提供了理想的工具,可用于识别过于宽泛的内部库规则以及受 Keep 规则影响的类,从而使团队能够放心地优化其代码库。最终,Tinder 成功将冷启动次数减少了近一半,APK 大小缩减了 28% 以上,并为用户打造了更健康、更高效的基础。目前,该团队正在积极努力,以进一步提升这些数据。
如何使用 R8 配置分析器
您可以根据当前的 Android Gradle 插件 (AGP) 版本,使用 R8 配置分析器及其独立功能:
1. AGP 9.3 版本:R8 配置分析器已完全集成并随 AGP 9.3 一起发布。运行 R8 发布 build 时,系统会在 `build/outputs/mapping/release/configanalyzer.html` 文件夹中生成报告。
2. 独立 Gradle 任务:AGP 9.3 引入了一项独立 Gradle 任务,让您无需运行完整的发布 build 即可生成分析器报告,从而在本地优化保留规则时提供更快的反馈环:
./gradlew :app:analyzeReleaseR8Config
报告生成时间:build/reports/r8/r8-config-analyzer-release.html.
3. 在旧版 AGP 上使用:如果您使用的是 AGP 9.3 以下的版本,则无需迁移整个 AGP 版本即可分析配置。您可以按照在 AGP 中替换 R8 的说明,将 R8 版本单独更新到 9.3.7-dev 或更高版本。如需在本地生成报告,请在运行 build 时指定该属性:
./gradlew assembleRelease -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=<output_directory>
如需了解详情,请参阅 R8 配置分析器文档。
-
案例研究Grab 是东南亚领先的超级应用,通过单一应用为八个国家/地区的数百万用户提供配送、出行和金融服务。
Ajesh Pai, Nguyen Van Minh, Tracy Agyemang • 阅读用时:5 分钟 -
案例研究WhatsApp 是全球最大的即时通讯平台,为全球数十亿用户提供服务。它是不同地区用户的默认通讯工具,通过私密、可靠且安全的即时通讯服务连接用户。
Niharika Arora, Tracy Agyemang, Mayank Jain • 阅读用时:8 分钟 -
案例研究Karrot 是一款超本地化、社区驱动的点对点交易应用,用户可以与其他经过验证的用户买卖和交易商品。自 2015 年在韩国推出以来,该平台已拓展至全球市场,注册用户数超过 4,300 万。
Thomas Ezan, Tracy Agyemang • 阅读用时:2 分钟
每周通过电子邮件接收最新的 Android 开发洞见。