Android 11 提高 App 冷启动速度 5% 以上

近一年多以来一直在做性能优化( OOM、Native、ANR 等等),在后面我也会写一些性能相关的文章,将自己学习和实践所得分享出来。以今天这篇文章作为开端。

在 Android 11 上增加了一个新的功能 IORap,IORap 将会减少 App 冷启动耗时,经过在各种设备上测试,App 的启动速度(冷启动)平均提高了 5% 以上,部分设备提高了 20% 以上,开发者不需要做任何任何事情,即可享受带来的启动优化收益。

IORap prefetching for Android apps

IORap 会提前预测需要那些 I/O 并将他们提前,通过这种方式减少 App 启动耗时。大量的 App 启动时间很长,是因为 blocking I/O 导致 IO 请求队列未到达饱和,在预取数据之后同时压缩 I/O ,App 可以很快的从 kernel pagecache 中访问预取数据,从而减少 App 启动耗时。

我们测试了在 Google Play Store 上一些热门的应用,80% 的 App 在启动期间,因为 blocking I/O 耗费了 10% 以上的时间,80% 的 App 耗费了 20% 以上的时间。我们在 Google Play Store 上测试了大部分应用都可以从 IORap 中获得收益。

IORap 作为一个独立的 service,它通过 IPC 与 package manager,activity manager, perfetto service 等等交互,以下是 IORap 的架构图。

  • 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 文件。

  • 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 低端设备和高端设备有两位数字的优化效果。

在实验过程中,发现了一个现象 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

如有侵权,请联系删除!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容