经过ART 提升Android App 性能


Android Pie中,咱们android

推出了
,这
是一项新的优化功能,可在新安装或更新后大大缩短应用程序启动时间。平均而言,咱们观察到应用程序在各类设备上的启动速度提升了 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

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

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

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

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

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

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

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

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

第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高级架构】
相关文章
相关标签/搜索