通过ART 提高Android App 性能

2,660 阅读8分钟

Android Pie中,我们

推出了
,这
是一项新的优化功能,可在新安装或更新后大大缩短应用程序启动时间。平均而言,我们观察到应用程序在各种设备上的启动速度提高了15%(冷启动)。一些英雄案例甚至显示30%+更快的启动时间。其中一个最重要的方面是用户可以免费获得此功能,无需他们的支持或开发人员的努力!

ART优化Play Cloud中的配置文件

该功能建立在先前的Profile Guided Optimization(PGO)工作的基础上,该工作是在Android 7.0 Nougat中引入的。PGO允许Android Runtime通过构建应用程序最重要的热门代码的配置文件并将其优化工作集中在其上来帮助提高应用程序的性能。这可以带来巨大的改进,同时减少完全编译的应用程序的传统内存和存储影响。但是,它依赖于设备在空闲维护模式下根据这些代码配置文件优化应用程序,这意味着它可能在用户看到好处之前几天 - 我们的目标是改进。


Play Cloud中的ART优化配置文件
利用Android Play的强大功能,在安装/更新时带来所有PGO优势:大多数用户无需等待即可获得出色的性能!

这个想法依赖于两个关键的观察:

  1. 应用程序通常在众多用户和设备之间具有许多常用的代码路径(热代码),例如在启动或关键用户路径期间使用的类。这通常可以通过聚合几百个数据点来发现。
  2. 应用程序开发人员通常会逐步推出他们的应用程序,从alpha / beta渠道开始,然后扩展到更广泛的受众。即使没有alpha / beta设置,用户也常常会增加到新版本的应用。

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

在设备上,代码配置文件充当种子,在安装时实现有效的配置文件引导优化。这些优化有助于改善冷启动时间和稳定状态性能,所有这些都不需要app开发人员编写单行代码。

第1步:构建代码配置文件

其中一个主要目标是尽可能快地从聚合和匿名数据中构建高质量,稳定的代码配置文件(以最大限度地增加可以受益的用户数量),同时确保我们有足够的数据来准确优化应用程序的性能。采样过多的数据会在安装时占用更多带宽和时间。此外,我们构建代码配置文件的时间越长,获得好处的用户就越少。采样过少的数据,代码配置文件将没有足够的信息来确定适当优化的内容,以便产生影响。

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

实验表明,可以在很短的时间内非常快速地计算出最常用的代码路径。这意味着我们能够以足够快的速度构建代码配置文件,以便大多数用户受益。

第2步:安装代码配置文件

Android 9.0 Pie中,我们引入了一种新类型的安装工件:dex元数据文件。与APK类似,dex元数据文件是常规存档,其中包含有关如何优化APK的数据 - 例如已在云中构建的核心代码配置文件。一个关键的区别是dex元数据仅由平台和应用商店管理,并且不会被开发人员直接看到。

还有对App Bundles / Google Play动态交付的内置支持:无需任何开发人员干预,所有应用程序的功能拆分都经过优化。

第3步:使用代码配置文件优化性能

要了解这些代码配置文件如何实现更好的性能,我们需要查看它们的结构。代码配置文件包含以下信息

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

使用这些信息,我们使用了各种优化技术,其中以下三项提供了大部分优势:

  • 我们使用启动类来构建预先填充的堆,其中类已预先初始化(称为应用程序映像)。当应用程序启动时,我们将图像直接映射到内存中,以便所有启动类都可用。

    • 这样做的好处是应用程序的执行可以节省周期,因为它不需要再次执行工作,从而可以缩短启动时间。
  • 代码预编译:
    我们预编译所有热代码。当应用程序执行时,代码中最重要的部分已经过优化,可以本地执行。该应用程序不再需要等待JIT编译器启动。

  • 好处是代码被映射为干净的内存(与JIT脏内存相比),这提高了整体内存效率。内存压力下内核可以释放干净的内存,而脏内存则不能,减少内核杀死应用程序的可能性。

  • 更高效的dex布局:
    我们根据配置文件公开的方法信息重新组织dex字节码。dex字节码布局如下所示:[启动代码,发布启动代码,其余非配置代码]。

    • 这样做的好处是可以更高效地将dex字节代码加载到内存中:内存页面具有更好的占用率,并且由于所有内容都在一起,因此我们需要减少负载,并且我们可以减少I / O.

改进和观察

我们在去年年底向Playstore上的所有应用程序推出了云中的配置文件。

  • 超过30,000个应用程序已经显示出改进
  • 平均而言,冷启动在各种设备上的速度提高了15%
    • 许多顶级应用在所选设备上获得20%+(例如Youtube)甚至30%(例如Google搜索)。
  • 在Android Pie获取配置文件的应用程序安装量的90%以上
  • 额外优化的安装时间几乎没有增加
  • 适用于所有Pie设备。

一个非常有趣的观察是,平均而言,ART概述了大约20%的应用方法(如果我们计算代码的实际大小,则更少)。对于某些应用程序,配置文件仅占代码的2%,而对于某些应用程序,该数字则高达60%。

为什么这是一个重要的观察?这意味着运行时没有看到很多应用程序代码,因此不会投入代码的优化。虽然有许多有效的用例,其中代码将不会被执行(例如错误处理或向后兼容性代码),但这也可能是由于未使用的功能或不必要的代码。偏斜分布是一个强烈的信号,后者可以在进一步优化中发挥重要作用(例如,通过删除不需要的dex字节码来降低APK大小)。

未来发展

我们对ART优化配置文件所展示的改进感到兴奋,并且我们将来会更多地发展这一概念。构建每个应用程序的代码配置文件为更多应用程序改进提供了机会。开发人员可以使用数据根据最终用户的相关性和重要性来改进应用。使用“个人档案”中收集的信息,可以重新组织或修剪代码,以提高效率。开发人员可以使用App Bundle根据其使用情况拆分其功能,并避免向用户发送不必要的代码。我们已经看到应用启动时间的巨大改进,并希望看到配置文件带来的额外好处,使开发人员的生活更轻松,同时为我们的用户提供更好的体验。

通过ART来提高Android APP性能只是Android性能优化学习的其中一小点,关于Android开发的学习,在这我分享一份大纲,有需要的朋友可以点击查看腾讯T3Android高级技术脑图 加入我们【腾讯@Android高级架构】