概述
基准配置文件可以略过所包含代码路径的解译和即时 (JIT) 编译步骤,从而使应用首次启动时的代码执行速度即可提高约 30%。
通过在应用或库中分发基准配置文件,Android 运行时 (ART) 可以通过预先 (AOT) 编译来优化指定的代码路径,从而针对每位新用户以及每个应用更新提升性能。这种配置文件引导式优化 (PGO) 可让应用优化启动、减少互动卡顿,并在用户首次启动应用时即可提高整体的运行时性能。
由于ART虚拟机需要执行一段时间以后,才能统计出热点代码,而且由于每个用户的使用场景、时长不一样,最终统计出来的热点代码也不一定是最优的。Google 的思路就是让开发者自己统计热点代码,打包到apk中。Baseline Profile 其实就是一个文件,它里面会记录我们应用的热点代码,最终被放的APK的assets/dexopt/baseline.prof目录下。有了它,ART 虚拟机就可以进行相应的 AOT 编译了。
Google 更加推荐我们使用 Jetpack 当中的 Macrobenchmark。它是 Android 里的一个性能优化库,借助这个库,我们可以生成Baseline Profile文件。
优势
利用基准配置文件,自应用首次运行起,所有用户互动(例如应用启动、切换界面或滚动浏览内容)都会变得更加顺畅。通过提升应用的速度和响应能力,基准配置文件可以提高日活跃用户数和平均回访率。
建议的最低稳定版
Android Gradle 插件:com.android.tools.build:8.0.0
Macrobenchmark 库:androidx.benchmark:benchmark-macro-junit4:1.2.3
配置文件安装程序:androidx.profileinstaller:profileinstaller:1.3.1
使用root或Android13(API33)的测试机
使用
AS版本:Android Studio Iguana | 2023.2.1 RC 2
AGP:8.3.0-rc02版本
- 选择 File > New > New Module
- 在 Templates 面板中选择 Baseline Profile Generator 模板,并对其进行配置
- 生成基准配置文件baseline-prof.txt有两种方式
- 使用
./gradlew :app:generateReleaseBaselineProfile命令 - 运行Generate Baseline Profile for app
- 使用
方式1:使用./gradlew :app:generateReleaseBaselineProfile命令
同样官网教程中也有提示:
方式2. 运行Generate Baseline Profile for app
提示
Error: Target module's selected variant is debuggable. Please use Build Variants tools window to change the variant of Test.app.
app模块不能选debug,要选release。
点击运行在底部Run任务栏的Test Results里看到执行的也是:app:generateReleaseBaselineProfilegradle任务
两种方式都会在app\src\release\generated\baselineProfiles文件夹下生成baseline-prof.txt和startup-prof.txt文件(两个txt文件二进制一样)
问题1:针对Build Variants里:app模块变体的选择问题
方式1中,因为是针对Release这个变体运行的,不需要手动更改
方式2 run时,只有release才可生成基准配置文件,故要明确
问题2:两种方式生成的baseline-prof.txt文件对比发现,方式1生成的baseline-prof.txt的文件,部分行会多个S
- 启动效果
在StartupBenchmarks文件中,选择run
效果几乎没有
把baseline-prof.txt文件复制到app\src\main\下,再运行
启动效果提升12.2%
推荐做法:生成baseline-prof.txt文件使用 ./gradlew :app:generateReleaseBaselineProfile。 查看效果,在StartupBenchmarks文件中直接run
StartupBenchmarks文件measureRepeated()各参数解释
页面跳转效果
在BaselineProfileGenerator文件中新增goToOtherScreen()方法
新增PageJumpBenchmarks文件
执行./gradlew :app:generateReleaseBaselineProfile后,更新src\main\下的baseline-prof.txt文件,并运行PageJumpBenchmarks文件
可得到 在第 50、第 90、第 95 和第 99 百分位以毫秒 (frameDurationCpuMs) 为单位输出帧时长,如
list滚动效果类似,参考scrollList()方法和ScrollBenchmarks文件
五、参考
1.代码路径
3.官网教程