Android性能优化之冷启动优化:使用Baseline/Cloud Profiles

962 阅读3分钟

简介

Baseline Profiles是在Google I/O 2022大会上被作为Jetpack新功能推出的,可以使用在Android 7 及更高版本系统上,主要目的是为了改善应用首次启动的体验。据Google官方介绍,它能够减少多达40%的启动时长。Cloud Profiles是从Android 9开始Google Play提供的。Cloud Profiles依赖于Google Play Services,在国内不可用,Baseline Profiles则不受Google Play Service影响。

原理

先提一下JITAOT
Just-In-Time - 实时编译,边运行边编译,热点 java 字节码编译成本地 code ,重新安装之后需要重新优化。
Ahead-Of-Time - 预先编译,运行前编译。
关于AOT和JIT的详细信息可以查看 理解Java的JIT和AOT

Baseline Profiles是包含Apk中的类和方法列表的配置文件,会被编译成APK中的assets/dexopt/baseline.prof,作为应用的一部分提供给Play Store,随应用一起下发给用户。当Cloud Profiles可用时,Baseline Profiles会和Cloud Profiles合并,在应用安装期间,ART会对配置文件中的方法执行预先编译(AOT)。

Cloud Profiles是在应用安装或更新时Google Play下发到手机的(如果可用)。Google Play会收集先安装用户的热点代码,然后上传到Cloud,在其他用户安装或更新时下发给他们(这个时候Cloud Profiles可用)。

Android 5.0、6.0 系统在应用安装期间会进行全量 AOT 编译。此时不需要使用Baseline/Cloud Profiles。虽然 AOT 的性能更高,但它会带来额外的问题:应用安装时间大大增加、磁盘占用更加大。

Android 7.0+ 系统支持 JIT、AOT 并存的混合编译模式。在这些高版本的系统当中,ART 虚拟机会在运行时统计到应用的热点代码,存放在/data/misc/profiles/cur/0/包名/primary.prof这个路径下。ART 虚拟机会针对这些热点代码进行 AOT 编译,这种方式要比全量 AOT 编译灵活很多。Android 7.0-8.1的系统只能使用Baseline Profiles,Android 9.0及以上支持Baseline+Cloud Profiles。

创建Baseline Profiles

1.官方推荐使用Macrobenchmark
Jetpack Macrobenchmark可以快速对基于Kotlin或Java的代码进行基准化分析。关于Macrobenchmark更多信息可以查看Macrobenchmark 简介|Android 开发者

具体使用步骤参考基准配置文件|Android 开发者

2.手动创建

src/main目中下创建一个baseline-prof.txt的文件。文件中的每一行指定了一条规则,用于代码中需要优化的方法或类。如

HSPLandroidx/compose/runtime/ComposerImpl;->updatedNodeCount(I)I
Landroidx/compose/runtime/ComposerImpl;

语法规则:
方法:[FLAGS][CLASS_DESCRIPTOR]->[METHOD_SIGNATURE]
类:[CLASS_DESCRIPTOR]

FLAGS
表示一个或多个HS 和 P中的字符,以指示相应方法应标记为 HotStartup 还是 Post Startup
带有 H 标记表示相应方法是一种“热”方法,这意味着相应方法在应用的整个生命周期内会被调用多次。
带有 S 标记表示相应方法在启动时被调用。
带有 P 标记表示相应方法是与启动无关的热方法。
ART 编译器会采用各种优化策略,例如:对这些方法进行 AOT 编译,以及在生成的 AOT 文件中执行布局优化。

CLASS_DESCRIPTOR
目标方法的类的描述符。根据 Dalvik 可执行文件 (DEX) 格式,例如,androidx.compose.runtime.SlotTable 应具有描述符L,最终变成Landroidx/compose/runtime/SlotTable;

METHOD_SIGNATURE
方法的签名,包括方法的名称、参数类型和返回值类型。例如, // LayoutNode.kt
fun isPlaced():Boolean {
// ...
}
具有签名 isPlaced()Z

注意事项

  • AGP版本需要不低于7.1.0-alpha05
  • 基准配置文件的压缩后大小不得超过 1.5 MB。
  • 如果宽泛规则对应用编译过多,就会增加磁盘访问,进而降低启动速度。

参考资料

基准配置文件|Android 开发者
Google I/0 应用性能的新动态
Improving App Performance with Baseline Profiles