[译] 经过 Play Cloud 的 ART 优化配置提高应用性能

在 Android Pie 中,咱们在 Play Cloud 中推出了 ART 优化配置,这是一项新的优化特性,它大大提升了新安装或更新应用后的启动时间。平均而言,在不一样设备上,咱们观测到应用启动时间减小了 15%(冷启动)。一些明星案例甚至减小了 30% 以上。这其中最重要的一点是用户能够无偿使用该特性,而无需用户或开发者的任何额外操做!html

来源:Google 内部数据

Play Cloud 的 ART 优化配置

该特性创建在由 Android 7.0 Nougat 引入的 Profile Guided Optimization(PGO)基础之上。PGO 容许 Android Runtime 经过构建应用中热门代码的配置,并集中优化配置来提高应用性能。这能够带来巨大的改进,同时减小彻底编译的应用在传统内存及存储上的影响。然而,它依赖于设备在空闲维护模式下根据这些代码配置来优化应用,这意味着用户可能须要几天时间才能看到这些好处 — 这是咱们旨在改进的。前端

来源:Google 内部数据

Play Cloud 的 ART 优化配置利用 Android Play 的强大功能,在安装/更新时带来全部的 PGO 好处:大多数用户无需等待便可得到出色的性能!android

这个想法依赖于两个关键的观测结果:ios

  1. 应用一般在众多用户和设备之间具备许多经常使用的代码路径(热门代码),例如在启动或关键用户路径期间使用的类。这一般能够经过聚合几百个数据点来发现。
  2. 应用开发者一般会逐步推出他们的应用,从 alpha/beta 渠道开始,而后扩展到更普遍的受众。即便没有 alpha/beta 设置,用户一般也会将应用升级到新版本。

这意味着咱们可使用应用的首次部署来引导其余用户的性能。ART 分析应用代码的哪些部分值得在初始设备上进行优化,而后将数据上传到 Play Cloud,后者将构建核心聚合代码配置文件(包含与全部设备相关的信息)。一旦有足够的信息,代码配置就会发布并与应用的 APK 一块儿安装。git

在设备上代码配置做为种子,在安装时实现有效的配置来引导优化。这些优化有助于改善冷启动时间以及稳定性能状态,全部这些都无需 app 开发者编写任何代码。github

第一步:构建代码配置

其中一个主要目标是尽量快地从聚合及匿名数据中构建高质量、稳定的代码配置(以最大限度地增长可受益的用户数量),同时也须要确保咱们有足够的数据来正确地优化应用的性能。采样过多的数据在安装时会占用更多带宽和时间。此外,咱们构建代码配置的时间越长,得到好处的用户就越少。采样过少的数据,代码配置将没有足够的信息来肯定适合优化的内容。后端

聚合的结果是咱们所说的核心代码配置,它只包含有关每一个设备随机会话样本中常常出现的代码的匿名数据。咱们移除异常值以确保咱们专一于对大多数用户而言十分重要的代码。app

实验代表,在很短的时间内,最经常使用的代码路径能够很是快地被计算出来。这意味着咱们能够有足够快的速度构建代码配置,以使大多数用户受益。ide

来自 Google 应用的平均数据,来源:Google 内部数据

第二步:安装代码配置

在 Android 9.0 Pie 中,咱们引入了一种新型安装工件:dex 元数据文件。相似于 APK,dex 元数据文件是常规的存档文件,它包含如何优化 APK 的数据 — 就像在 cloud 中构建的代码核心配置同样。它们之间一个关键的区别是 dex 元数据仅由平台和应用商店管理,而且对开发者来讲是不直接可见。布局

还有对 App Bundles / Google Play 动态分发的内建支持:无需任何开发者干预,全部应用的功能拆分都通过优化。

第三步:使用代码配置来优化性能

要搞明白这些代码配置究竟如何实现更好的性能,咱们须要查看它们的结构。代码配置包含如下信息:

  • 启动期间加载的类
  • 运行时被认为值得优化的热门方法
  • 代码的布局(好比,在启动或启动后执行的代码)

使用这些信息,咱们使用了各类优化方法,其中如下三项提供了大部分优点:

  • 应用映像:咱们使用启动类来建立须要预先填充的堆,其中类已预先初始化(称为应用映像)。当应用启动时,咱们将映像直接映射到内存中,以便全部启动类均可以随时使用。

    • 这样作的好处是应用的执行能够节省周期,由于它无需再次执行,从而能够缩短启动时间。
  • 代码预编译:咱们预先编译全部热门代码。当应用执行时,代码中最重要的部分已通过优化,可在本地直接执行。应用无需再等待 JIT 编译器启动。

    • 这样作的好处是代码被映射为干净的内存(与 JIT 的脏内存相比较),这提升了总体的内存的效率。内存压力下内核能够释放干净的内存,而脏内存则不能被释放,这减小了内核杀死应用的可能性。
  • 更高效的 dex 布局:咱们根据配置抛出的方法信息从新组织 dex 字节码。dex 字节码布局以下所示:[启动代码、启动后的代码、其他非配置代码]。

    • 这样作的好处是能够更高效地将 dex 字节码加载到内存中:内存页具备更好的占用率,且因为全部内容都在一块儿,所以咱们须要加载的更少,咱们能够作更少的 I/O。

改进和统计

咱们在去年年末向 Playstore 上的全部应用推出了 Play Cloud 的配置。

  • 已超过 30,000 个应用有所改进

  • 平均而言,冷启动在各类设备上的速度提升了 15%

    • 许多排名靠前的应用在所选设备上得到了 20%+(好比 Youtube)甚至 30%(好比 Google 搜索)的提高。
  • 在 Android Pie 上安装的应用中有 90% 以上得到了优化

  • 额外优化的安装时间几乎没有增长

  • 适用于全部 Pie 设备。

一个很是有趣的观测结果是,平均而言,ART 优化了大约 20% 的应用方法(若是咱们计算代码的实际大小,则更少)。而对于另外一些应用,配置仅占代码量的 2%,而对于某些应用,该数字则高达 60%。

来源:Google 内部数据

为何这是一个十分重要的统计?这意味着 Runtime 没有看到太多的应用代码,所以没有对代码进行优化。虽然有不少代码不会被执行的例子(好比错误处理或向后兼容性代码),但这也多是因为未使用的功能或没必要要的代码所形成的。倾斜分布是一个强烈的信号,它代表后者能够在进一步优化中发挥重要做用(好比经过删除不须要的 dex 字节码来减小 APK 大小)。

将来发展

咱们为 ART 优化配置所带来的改进感到兴奋,咱们将会在将来更多地发展这一律念。构建每一个应用的代码配置为更多应用改进提供了机会。开发者可使用数据,以根据(功能与)终端用户的相关性及重要性来改进应用。使用配置中收集到的信息,能够从新组织或修剪代码,以提升效率。开发者可使用 App Bundle,根据其使用状况来拆分功能,并避免向用户发送没必要要的代码。咱们已经看到应用启动时间的巨大改进,并但愿看到配置所带来的其余额外好处,使开发者的生活更加轻松,同时为咱们的用户提供更好的体验。

若是发现译文存在错误或其余须要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可得到相应奖励积分。文章开头的 本文永久连接 即为本文在 GitHub 上的 MarkDown 连接。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏

相关文章
相关标签/搜索