App的启动时长,是性能优化中的一个常见问题。对于用户体验来说,过长的启动时间是不太友好的。
今年的Google I/O
大会上,推荐了Baseline Profiles
,可以通过Baseline Profiles
来优化启动速度。
简介
Baseline Profile
是包含Apk中的类和方法的列表文件,在应用安装时,Android Runtime(ART)
通过这些类和方法将关键路径预编译为机器码。可以缩短启动时长,减少卡顿,提升性能,让用户拥有更好的体验。
工作原理
配置文件规则会在 Apk 的 assets/dexopt/baseline.prof
中编译为二进制形式。
在应用安装期间,ART 会对配置文件中的方法执行预先 (AOT) 编译,以便提升这些方法的执行速度。如果配置文件包含应用启动或帧渲染期间使用的方法,用户将获享启动速度更快且/或卡顿更少的体验。
在开发App或Library时,请考虑定义基准配置文件,以涵盖用户使用过程中需要缩短渲染时间或延迟的重要的特定热路,例如应用启动时预先获取数据。
创建Baseline Profiles
Google提供了两种创建Baseline Profiles
的方式
自动创建
可以通过Macrobenchmark库自动生成Baseline Profiles
,这也是Google推荐的做法。
自动创建步骤如文档所示。
手动创建
在src/main
目中下创建一个baseline-prof.txt的文件。该文件中的每行指定了一条规则,用于匹配App或Library中需要优化的方法或类。
以下示例展示了 Jetpack Compose 库中包含的一些基准配置文件规则:
HSPLandroidx/compose/runtime/ComposerImpl;->updateValue(Ljava/lang/Object;)V
HSPLandroidx/compose/runtime/ComposerImpl;->updatedNodeCount(I)I
HLandroidx/compose/runtime/ComposerImpl;->validateNodeExpected()V
PLandroidx/compose/runtime/CompositionImpl;->applyChanges()V
HLandroidx/compose/runtime/ComposerKt;->findLocation(Ljava/util/List;I)I
Landroidx/compose/runtime/ComposerImpl;
规则语法
语法 | 说明 |
---|---|
FLAGS | 表示 H 、S 和 P 中的一个或多个字符,用于指示相应方法在启动类型方面应标记为 Hot 、Startup 还是 Post Startup 。 带有 H 标记表示相应方法是一种“热”方法,这意味着相应方法在应用的整个生命周期内会被调用多次。 带有 S 标记表示相应方法在启动时被调用。 带有 P 标记表示相应方法是与启动无关的热方法。 如果某个类出现在此文件中,则表示系统会在启动过程中使用该类,并且应在堆中预先分配该类,以避免耗费资源来加载它。ART 编译器会采用各种优化策略,例如:对这些方法进行 AOT 编译,以及在生成的 AOT 文件中执行布局优化。 |
CLASS_DESCRIPTOR | 目标方法的类的描述符。例如,androidx.compose.runtime.SlotTable 应具有描述符 Landroidx/compose/runtime/SlotTable; 。注意:根据 Dalvik 可执行文件 (DEX) 格式,描述符中附加了 L。 |
METHOD_SIGNATURE | 方法的签名,包括方法的名称、参数类型和返回值类型。例如,LayoutNode 上的方法 // LayoutNode.kt fun isPlaced():Boolean { // ... } 具有签名 isPlaced()Z 。 |
- 对于方法
[FLAGS][CLASS_DESCRIPTOR]->[METHOD_SIGNATURE]
- 对于类
[CLASS_DESCRIPTOR]
注意事项
创建基准配置文件时,还需要注意一些其他事项:
- Android 5 到 Android 6(API 级别 21 和 23)已在安装时对 APK 进行 AOT 编译。
- 可调试应用绝不会经过 AOT 编译,以帮助进行问题排查。
- 规则文件必须命名为
baseline-prof.txt
,并放在主源代码集的根目录中(它应该是AndroidManifest.xml
文件的同级文件)。 - 只有在您使用 Android Gradle 插件
7.1.0-alpha05
或更高版本 (Android Studio Bumblebee Canary 5) 时,才会用到这些文件。 - Bazel 目前不支持读取基准配置文件,也不支持将其合并到 APK 中。
- 基准配置文件的压缩后大小不得超过 1.5 MB。因此,库和应用应尽量定义一小部分能够最大限度提升影响的配置文件规则。
- 如果宽泛规则对应用编译过多,就会增加磁盘访问,进而降低启动速度。您应测试基准配置文件的性能。