Tinder 用 R8 配置分析器将冷启动时间缩短 47%

作者:Ajesh R Pai,开发者关系工程师;Ulises Uriel Verduzco Diaz,软件工程师,Tinder;Tracy Agyemang,产品营销经理

Tinder 致力于通过让每一代单身人士都能轻松又愉快地相遇,从而推动并激发真实而深刻的联结。然而,随着其 Android 应用程序的代码库规模不断扩大,其复杂度也随之攀升。

在开展最新优化工作之前,应用程序中约有 70% 的代码未经过优化,其中包含 17 个 dex 文件,其中三个文件专门用于启动时的优化。

尽管团队已启用 R8,但由于保留规则的限制,其大部分优化潜力仍未能得到充分发挥,且团队始终无法准确识别出究竟是哪些规则阻碍了优化效果。

为了缩短应用启动时间、降低用户感知到的应用程序无响应(ANR)错误,Tinder 联合全新的 R8 配置分析器,共同应对这些挑战。

通过使用 R8配置分析仪,Tinder 成功识别并移除了那些无意中阻碍优化的规则。优化成果立竿见影、成效显著:Tinder 的应用冷启动时间减少了 47%,应用下载体积缩小了 28.98%(降至 61.5 MB),同时用户感知到的 ANR 错误也降低了 28%。

配置分析器

R8配置分析仪 通过追踪代码缩减、优化和混淆得分,来展示可用的优化改进空间,从而实现 R8 优化。它能够清晰地显示广泛、冗余或过时的保留规则,包括来自外部库的规则,帮助您深入分析保留规则的影响,并对保留规则进行精细化调整。

配置分析器所呈现的关键指标包括:

  • 缩减得分:表示可用于 R8 缩减的代码占比。
  • 优化得分:表示可进行优化的代码占比(例如方法内联、类横向合并)。
  • 混淆得分:表示可通过 R8 重命名的类、方法和字段的百分比,以进一步减小应用体积。

利用该分析器,您可以对保留规则及其影响进行全面审计:

  • 查找广泛规则:缩小包级规则的范围,避免对 R8 优化造成限制,并明确指出哪些特定的类、方法和字段被排除在缩减、优化和混淆之外。
  • 细化规则:仅针对需要反射的特定类或方法进行优化,以解锁更多优化潜力。
  • 移除冗余规则:删除与当前构建中零个类、方法或字段相匹配的规则。
  • 相同规则:相同保留规则意味着,这些规则针对的是相同的类、字段和方法,或者在同一批保留规则文件中存在重复的保留规则声明。
  • 查找被涵盖的规则:清理那些已被更广泛配置覆盖的特定规则。
  • 识别存在问题的库:检查所有库中合并后的消费者保留规则所带来的整体优化影响。




R8 配置分析器对某款示例应用的报告

为帮助您将 R8 配置分析器与相关工具结合使用,我们发布了 R8分析器技能。该工具通过汇总 R8 配置分析器的报告,以直观的方式展示关键指标——优化得分、混淆得分和缩减得分——从而优化自动化开发流程。

此外,它还重点突出了五条最具影响力的保留规则,让您清晰地了解哪些规则会阻碍代码优化。

精准定位隐藏的优化阻滞因素

在集成 R8 配置分析器之前,Tinder 的 Android 应用因代码库严重未优化而背负着巨大的技术债务。这种缺乏优化的情况直接导致用户体验下降,用户在应用启动时往往面临启动缓慢的问题。

为解决这些问题,Tinder 团队借助 R8 配置分析器,对其 R8 配置进行了全面审计。分析结果显示,即使在 R8 全局模式下,代码库的 R8 优化率也仅为约 28%。

通过 R8 配置分析器,Tinder 发现了一个内部库引入了一条范围广泛、未限定用途的保留规则。

# 防止对所有公共类及其所有公共成员和受保护成员进行优化

-keep public class * {
    public protected *;
}

这条“宽泛”的规则无意间覆盖了整个应用中的各类依赖,导致大量类都无法进行优化。由于该规则过于包容,不仅可能导致运行时崩溃,开发者也常常忽视为新功能添加新的规则,而这些新功能正是通过反射实现的。

随着时间的推移,这些隐性问题不断累积,愈发严重。

借助 R8 配置分析器提供的洞察,团队成功追踪并分析了该库中那条宽泛保留规则所影响的具体类。团队立即发现,优化被阻滞在那些较大、非动态调用的类中,而这些类本可以由 R8 进行优化。

通过对这一特定保留规则进行精细化调整,Tinder 获得了可观的优化能力,解开了旧有配置的束缚,并大幅提升了整体优化表现。R8 分数从 28% 提升至 50%,为整个应用带来了即时的性能提升。

目前,Tinder 团队正积极努力,进一步提升这一数值。

  • 加载速度更快:团队帮助用户将应用冷启动时间的延迟缩短了 47%。
  • 应用体积更小:应用下载体积从 86.6 MB 降至 61.5 MB(降幅达 28.98%)。
  • 稳定性提升:用户感知到的应用程序无响应(ANR)错误率从 0.35% 降至 0.28%,距离同行平均值已大幅接近。
  • 复杂度降低:DEX 文件总数从 17 个减少至 11 个,其中仅包含两个用于启动的文件。

除了这些技术层面的性能提升外,应用优化的进一步加强,也直接转化为实实在在的业务增长和更高的用户参与度,尤其是在资源受限的市场中。

  • 区域参与度:在低内存设备占据市场份额较大的国家,用户参与度实现了最大幅度的增长,而降低 ANR 错误率更是提升该广阔市场用户参与度的关键所在。
  • 参与度提升:自应用优化升级以来,用户参与度已提升了 3%。

以持续集成守护未来性能

解决代码压缩问题并非一劳永逸的解决方案,而是需要持续关注与维护。受到 R8 配置分析器带来巨大收益的启发,Tinder 的 Android 团队主动将优化监控整合进日常工作流中,以预防回归问题的发生。

Tinder 团队在 CI/CD 流程中新增了一项任务,用于报告优化状态的变化,以便每个人都能清楚地看到自己的贡献如何影响优化效果。在向其他考虑集成 R8 配置的开发者提供建议时,团队特别强调了审计内部依赖的重要性。

虽然大多数热门第三方库都附带了清晰定义的规则,但那些被视为“稳定”的公司内部项目,实际上可能引入了范围较广、对整体优化产生负面影响的规则。

核心要点

面对高度未优化的代码库和庞大的 DEX 文件数量,Tinder 需要一种便捷的方式来全面审计应用的压缩规则。R8 配置分析器恰好提供了理想的工具,能够识别范围过广的内部库规则以及被保留规则影响的类,使团队得以自信地对代码库进行优化。

最终,Tinder 成功将应用的冷启动时间缩短了近一半,APK 大小缩减了超过 28%,并为用户奠定了更加健康、高效的使用基础。目前,团队正积极努力,进一步提升这些指标。

如何使用 R8 配置分析器

R8 配置分析器及其独立功能可根据您当前的 Android Gradle 插件(AGP)版本进行使用:

  • AGP 9.3 版本:R8 配置分析器已与 AGP 9.3 完全集成并正式发布。在运行 R8 发布版构建时,分析报告将生成在 build/outputs/mapping/release/configanalyzer.html 文件夹中。
  • 独立 Gradle 任务:AGP 9.3 引入了一项独立的 Gradle 任务,允许您在不运行完整发布版构建的情况下生成分析报告,从而在本地对保留规则进行精细化调整时,获得更为快速的反馈循环:
    ./gradlew :app:analyzeReleaseR8Config
    报告将生成在 build/reports/r8/r8-config-analyzer-release.html 中。
  • 老版本 AGP 的使用方式:如果您使用的是 AGP 9.3 以下的版本,无需将整个 AGP 版本迁移到最新版本以分析您的配置。您只需单独将 R8 版本更新至 9.3.7-dev 或更高版本,具体操作请参考 在AGP指令中替换R8。若要在本地生成报告,请在构建命令中指定以下属性:
    ./gradlew assembleRelease -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=

如需了解更多详情,请参阅 R8配置分析仪 的文档。

添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论