安卓AOT预编译策略

编译策略

为了平衡应用编译耗时、磁盘空间占用和运行性能表现,安卓设备AOT预编译都是按需执行的: · 只在设备息屏&充电且闲置状态下才会编译部分用户使用过的热应用 · 编译应用时采用PGO(Profile-.Guided Optimization)定向编译部分热点函数为机器码

1.1原生安卓AOT预编译策略

  • 设备刷机或OTA后首次开机 设备首次开机过程中,由于应用依赖的系统框架源码环境可能发生变化,为确保应用正确执行,谷歌统一采用 verify模式编译设备上安装的所有应用,从而清理各个应用已经编译好的过期机器码产物

  • 应用安装时编译 应用安装时,由于应用代码实现可能已经发生变化,且此时无热点函数清单文件,所以采用vfy模式进行统一 编译成字节码文件,并清除已经编译好的过期机器码产物

  • 后台闲时编译

    在设备满足息屏&充电&非低电模式且处于IDLE闲时状态下启动后台服务,分析设备上已经安装的所有应用,对 用户使用过的热应用(运行时成功搜集到热点函数清单文件),采用speed-profile模式定向编译热点函数为机器码

确保应用正确执行的前提下,根据用户的使用习惯,用尽量少的资源实现应用“越用越快”的效果

小米改进策略对比分析

AOT预编译策略AOSP设备小米设备
设备闲时编译触发条件与规则:
同时满足如下条件时触发:
1.设备正在充电
2.设备处于息屏IDLE状态
3.设备不处于低电量模式
且24小时内最多触发一次
体验缺陷:
容易造成设备充电时过热问题
原生规则基础上优化触发条件,改善充电时
设备发热体验:
1.适当推迟触发编译时机到电池电量92%
以上(此时充电功率更低),防止充电时
设备过热问题
2.夜间12点到6点睡眠时间段则直接触发
OTA后首次开机编译触发条件与规则:
设备刷机或OTA升级后首次开机
使用veirfy模式编译设备安装的所有应用,去
除已经编译好的过期机器码文件,以保证应用
正确稳定运行
体验缺陷:
每次OTA更新后,由于应用机器码文件被清理,
运行性能出现衰退,需要等待后续闲时编译后才
能逐步改善
在原生规则基础上改善设备流畅度体验:
OTA升级后首次开机编译过程中,针对
Top8应用(微信、QQ、抖音、淘宝、
微博等),根据之前采集的热点函数清单
文件,直接进行speed-profile?编译生成新
的机器码,保证OAT升级后的流畅体
验,平均提升Top应用流畅度20%以上
仅针对中高端以上算力机型开放
应用安装时编译触发条件与规则:
应用首次安装或更新升级安装
使用veirfy模式编译设应用,去除已经编译的
过期机器码文件,保证应用正确稳定运行
体验缺陷:
应用首次安装时缺少机器码文件,前期运行性
能较低,造成启动慢、掉帧多的问题,需等待
闲时编译后才能逐步改善
应用版本更新安装后,由于机器码文件被清
理,性能体验出现衰退
在原生规则基础上,补充AOT预编译场景,
改善应用流畅度体验:
引入9秒预编译机制:应用安装后的首次
启动期间会收集启动期间的热点函数信
总,并主动触发speed-profile定向编译,
平均提升应用冷启动速度30%以上
引入baseline预编译机制:针对部分Top
应用,在安装时根据从应用商店下发的
热点函数清单文件,进行speed-profile定
向编译,**平均提升应用流畅度体验15%<**br/>以上
仅针对中高端以上算力机型开放

小米在安卓原生编译规则基础上,针对其体验缺陷进行针对性优化改善,在中高端机型上通过适当的编译资 源开销(后台编译时可能会造成设备短暂的发热),大幅改善应用流畅度体验