近一年多以来一直在做性能优化( 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
- 本文已收录于仓库 Technical-Article-Translation
最后
那么怎么进行性能优化呢?可以从以下几个方向出发
- 启动优化
- UI渲染优化
- 崩溃优化
- 内存优化
- 卡顿优化
- 存储优化
- 网络优化
- 耗电优化
- 多线程并发优化
- 安装包优化
这里给大家分享一份《Android性能优化-大厂实战全解析》,这份《Android性能优化-大厂实战全解析》包括有:腾讯、字节、阿里、百度、网易、美团等一线互联网大厂的优化实战解析,更是附赠360°性能调优学习指南,有需要的朋友们也可以下载下来随时查漏补缺。文末扫码100%免费领取!!
资料获取:
文末扫码免费领取~
《Android性能优化-大厂实战全解析》目录及内容展示
腾讯团队
- 腾讯光影研究室—Android P之Smart Linkify
- 腾讯微信—Matrix原理分析系列之开篇
- 腾讯微信—Mareix源码系列之如何解析应用安装包
- 腾讯微信—Mareix源码系列之如何监控帧率变化
- 腾讯Bugly—动态下发 so 库在 Android APK 安装包瘦身方面的应用
- QQ音乐—彻底弄懂浏览器缓存策略
- QQ音乐Android编译提速之路
- 全民k歌适配arm64-v8a方案
- 全民K歌内存篇1——线上监控与综合治理
- 全民K歌内存篇2——虚拟内存浅析
- 全民K歌内存篇3——native内存分析与监控
- 腾讯Bugly—对字符串匹配算法的一点理解
- …
字节团队
-
字节跳动技术团队— 深入理解Gradle框架之一:Plugin,Extension, buildSrc
-
字节跳动技术团队—深入理解gradle框架之二:依赖实现分析
-
字节跳动技术团队—Scene:Android 开源页面导航和组合框架
-
字节跳动技术团队—AwCookieManager.nativeGetCookiecrash 排查
-
字节跳动技术团队—另类 BadTokenException 问题分析和解决
-
字节跳动技术团队—抖音包大小优化-资源优化
-
字节跳动技术团队—二维码扫描优化
-
字节跳动—Android Camera内存问题剖析
-
抖音BoostMultiDex优化实践:Android低版本上APP首次启动时间减少80%
-
抖音BoostMultiDex优化实践:Android低版本上APP首次启动时间减少80%(二)
-
抖音 Android 性能优化系列:Java 内存优化篇
-
今日头条 Android ‘秒’ 级编译速度优化
-
…
阿里团队
-
支付宝客户端架构解析:Android 客户端启动速度优化之「垃圾回收」
-
支付宝 App 构建优化解析:通过安装包重排布优化 Android 端启动性能
-
支付宝 App 构建优化解析:Android 包大小极致压缩
-
解决支付宝包体积优化的遗留问题:运行时获取dexpc
-
闲鱼技术—曾梦想 if-else 走天涯?看看“责任树模式”优化
-
闲鱼如何在2个月内实现Android启动速度翻倍的?
-
高德技术—Android Native 内存泄漏系统化解决方案
-
天猫精灵技术—史上最全Android渲染机制讲解(长文源码深度剖析)
-
…
百度团队
-
百度APP-Android H5首屏优化实践
-
百度App技术—一种简单优雅的TextView行间距适配方案
-
百度App技术—Android 10分区存储介绍及百度APP适配实践
-
百度App技术—Gradle 与 Android 构建入门
-
百度App组件化之路
-
百度App网络深度优化系列《三》弱网优化
-
…
网易团队
-
网易新闻客户端 H5 秒开优化
-
网易新闻构建优化:如何让你的构建速度“势如闪电”
-
网易传媒技术团队—AOP技术在客户端的应用与实践
-
网易大数据|互联网产品决策秘笈: AB测试
-
…
美团团队
-
美团技术团队—Android静态代码扫描效率优化与实践
-
美团技术团队—Probe:Android线上OOM问题定位组件
-
美团技术团队—移动端UI一致性解决方案
-
美团—设计稿(UI视图)自动生成代码方案的探索
-
……
-
……