什么是 Baseline Profiles
Baseline Profiles 能够防止对包括的代码途径履行解译和即时 (JIT)编译进程,从而让代码履行速度从初次发动开端进步约 30%。经过在运用或库中分发 Baseline Profiles,Android 运行时 (ART)能够经过预先 (AOT) 编译来优化包括的代码途径,从而针对每位新用户以及每个运用更新进步功能。这种配置文件引导的优化 (PGO) 可让运用优化发动、减少互动卡顿,并进步全体的运行时功能,从而让用户从初次发动开端便取得更好的运用体会。
Baseline Profiles 的优势
- 所有用户交互(例如运用发动、切换屏幕或翻滚内容)都会从初次运行开端变得愈加顺利。进步运用的速度和响应才干有助于进步日活跃用户数和均匀回访率。
- 引导式 AOT 编译不依赖于用户设备,能够在开发机器(而非移动设备)上为每个版别履行一次。与单纯依赖 Cloud Profiles 相比,能够更快速地完成运用优化。
创建 Baseline Profiles
作为运用开发者,你能够运用Jetpack Macrobenchmark 库和BaselineProfileRule
为每个运用版别自动生成配置文件。用于生成配置文件的进口点是collectBaselineProfile
函数。
@RunWith(AndroidJUnit4::class)
class BaselineProfileGenerator {
@get:Rule
val rule = BaselineProfileRule()
@Test
fun generate() {
rule.collectBaselineProfile("com.example.app") {
// TODO Add interactions for the typical user journeys
}
}
}
在profileBlock
lambda 中,需要指定包括运用典型用户体会进程的互动。该库将运行profileBlock
屡次;它会搜集调用的类和函数以进行优化,并生成设备端的 Baseline Profiles。
以运用发动进程为例,发动进程包括:
- 按主屏幕按钮以保证运用状态已重启
- 发动默许 activity 并等候第一帧出现
- 等候内容加载并出现,且用户能够与其交互
fun MacrobenchmarkScope.startApplicationJourney() {
pressHome()
startActivityAndWait()
val contentList = device.findObject(By.res("snack_list"))
// Wait until a snack collection item within the list is rendered
contentList.wait(Until.hasObject(By.res("snack_collection")), 5_000)
}
相同也能够编写翻滚列表的进程,包括:
- 查找列表的界面元素
- 设置手势外边距避免触发系统导航
- 翻滚列表并等候界面稳定下来
fun MacrobenchmarkScope.scrollSnackListJourney() {
val snackList = device.findObject(By.res("snack_list"))
// Set gesture margin to avoid triggering gesture navigation
snackList.setGestureMargin(device.displayWidth / 5)
snackList.fling(Direction.DOWN)
device.waitForIdle()
}
履行 BaselineProfileGenerator 的 generate 办法,查看运行结果如下:
生成的 Baseline Profiles 在/build/outputs/
中的managed_device_android_test_additional_output/
文件夹。
运用生成的 Baseline Profiles
- 复制生成的 Baseline Profiles 到
src/main
文件夹,偏重命名为baseline-prof.txt
。 - 将
profileinstaller
依赖项添加到:app
模块。
dependencies {
implementation("androidx.profileinstaller:profileinstaller:1.2.0")
}
Baseline Profiles 随运用打包发布,当用户装置运用时,Baseline Profiles 也会被编译,从而在初次运行运用时完成更好的功能。
Baseline Profiles 的运作办法
在开发运用或库时,需要考虑定义 Baseline Profiles,以包括烘托时刻或延迟时刻非常重要的常见用户交互流程。
- 系统会为运用生成 Profiles 规矩,并在运用中将其编译为二进制文件方式(能够在
assets/dexopt/baseline.prof
中找到)。然后能够照旧将相应 AAB 上传到 Google Play。 - Google Play 会处理该 Profiles 文件,然后将其与 APK 一起直接发布给用户。在运用装置期间,ART 会对 Profiles 文件中的办法履行 AOT 编译,以便进步这些办法的履行速度。假如 Profiles 文件包括运用发动或帧烘托期间运用的办法,用户可能会取得发动速度更快且卡顿更少的体会。
- 此流程可与 Cloud Profiles 汇总配合运用,以随着时刻的推移根据运用的实践运用情况对功能进行微调。
Cloud Profiles 能够供给另一种方式的 PGO,它们由 Google Play 商店进行汇总,并与Baseline Profiles 一起分发以进行装置时编译。尽管 Cloud Profiles 是由用户与运用的实践互动驱动的,但它们在更新后需要几天到几周的时刻才干分发,这就约束了它们的可用性。此外,Cloud Profiles 仅支持搭载 Android 9(API 级别 29)或更高版别的 Android 设备。
更多 Android 运用功能优化相关文章
《运用 Baseline Profiles 改善 Android 运用功能》
《运用 Macrobenchmark 测试 Android 运用功能》