Android 11 进步 App 冷启动速率 5% 以上

计算机软件开发 2024-10-8 20:27:25 193 0 来自 中国
近一年多以来不停在做性能优化( OOM、Native、ANR 等等),在背面我也会写一些性能相干的文章,将自己学习和实践所得分享出来。以今天这篇文章作为开端。
在 Android 11 上增长了一个新的功能 IORap,IORap 将会镌汰 App 冷启动耗时,颠末在各种装备上测试,App 的启动速率(冷启动)匀称进步了 5% 以上,部分装备进步了 20% 以上,开辟者不必要做任何任何事变,即可享受带来的启动优化收益。
1.png IORap prefetching for Android apps

IORap 会提前猜测必要那些 I/O 并将他们提前,通过这种方式镌汰 App 启动耗时。大量的 App 启动时间很长,是由于 blocking I/O 导致 IO 哀求队列未到达饱和,在预取数据之后同时压缩 I/O ,App 可以很快的从 kernel pagecache 中访问预取数据,从而镌汰 App 启动耗时。
2.png 我们测试了在 Google Play Store 上一些热门的应用,80% 的 App 在启动期间,由于 blocking I/O 淹灭了 10% 以上的时间,80% 的 App 淹灭了 20% 以上的时间。我们在 Google Play Store 上测试了大部分应用都可以从 IORap 中得到收益。
4.png IORap 作为一个独立的 service,它通过 IPC 与 package manager,activity manager, perfetto service 等等交互,以下是 IORap 的架构图。
5.png

  • Step 1: Collecting perfetto traces
IORap 基于一定的策略分析预取 I/O ,通过 perfetto 举行跟踪纪录,会在 kernel pagecache 中添加和删除的页面。颠末测试,启动期间通过 perfetto 举行跟踪纪录造成的开销可以忽略不计。

  • Step 2: Generating prefetch list
基于上面的 perfetto trace,IORap 会在装备空闲时,生成预取列表,预取列表包罗启动期间必要读取的文件信息(名称,偏移,长度), IORap 会根据 perfetto trace 分析 mm_pagemap 变乱,并将结果 (inode、偏移量、长度) 转换为 (名称、偏移量、长度),然后将数据存储在预取列表中,预取列表是一个 protobuf 文件。
6.png

  • Step 3: I/O prefetching
颠末上一步,生成预取列表之后,后续运行 App 时 IORap 可以为 App 预取对应的数据,在上一步实行完之后,不在必要 perfetto trace, 开辟者不必要做任何事变,体系会在用户点击图标时大概通过 Intent 哀求它,实行预取操纵,享受带来的启动优化。

  • Step 4: Obsoleting the prefetch list
预取列表不会永世存在,会由于一些变乱导致预取列表过期,而被删除,当 App 更新时,由于更新过程中大概会发生变革,和之前的预取数据会有一些差别,以是不发起在这个阶段预取数据,别的 dexopt 会在 App 安装后举行优化,优化后的 App,数据不会发生改变,这会使预取列表过期,过期的预取列表将被删除,这时会开始新一轮的 perfetto trace。
Improvements & Observation

通过对比几个实行的结果,我们可以确定 IORap 对于低端机和高端机都会有收益,匀称而言, IORAP 可以进步 26% 的启动速率,对于启动期间有大量 I/O 的 App 会有很大的资助,比方,Spotify 低端装备和高端装备有两位数字的优化结果。
7.png 在实行过程中,发现了一个征象 IORap 性能会受到预取数据的影响,跟踪一连时间对于 IORap 来说非常重要,跟踪一连时间越短,预取的数据就越少,得到的性能也越低。另一方面,长时间的预取会导致必要预取的数据过多,这大概会导致启动速率变慢,我们可以根据 ReportFullyDrawn 变乱的时间戳来估计跟踪一连时间。在精确的调用 reportFullyDrawn 回调可以进步 IORap 的性能。
Future Development

我们对 IORap 所体现出来的性能非常的高兴,在将来将会朝着以下两方向举行优化。

  • 包管性能的条件之下,更频仍地举行预取,假如预取可以在分析期间完成,那就更好了。通过提供一个预构建的预取列表,我们可以在生成预取列表之前消除一些性能差距
  • IORap 可以猜测应用启动,更早的开始预取,从而进一步加速 App 启动
Conclusion

可以在 App 启动完成之后,调用 reportFullyDrawn 来资助 IORap 举行更好的优化,IORap 重要有助于镌汰 I/O 壅闭时间,因此可以思量对 App 启动举行分析,发现和办理其他大概存在的性能标题。
原文: medium.com/improving-a…
译者:DHL
转载泉源于:https://juejin.cn/post/7088139935479234573
如有侵权,请接洽删除!
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-12-4 00:44, Processed in 0.147410 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表