使用 Baseline Profiles 改善 Android 应用性能

什么是 Baseline Profiles

Baseline Profiles 能够防止对包括的代码途径履行解译和即时 (JIT)编译进程,从而让代码履行速度从初次发动开端进步约 30%。经过在运用或库中分发 Baseline Profiles,Android 运行时 (ART)能够经过预先 (AOT) 编译来优化包括的代码途径,从而针对每位新用户以及每个运用更新进步功能。这种配置文件引导的优化 (PGO) 可让运用优化发动、减少互动卡顿,并进步全体的运行时功能,从而让用户从初次发动开端便取得更好的运用体会。

Baseline Profiles 的优势

  1. 所有用户交互(例如运用发动、切换屏幕或翻滚内容)都会从初次运行开端变得愈加顺利。进步运用的速度和响应才干有助于进步日活跃用户数和均匀回访率。
  2. 引导式 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
   }
 }
}

profileBlocklambda 中,需要指定包括运用典型用户体会进程的互动。该库将运行profileBlock屡次;它会搜集调用的类和函数以进行优化,并生成设备端的 Baseline Profiles。

以运用发动进程为例,发动进程包括:

  1. 按主屏幕按钮以保证运用状态已重启
  2. 发动默许 activity 并等候第一帧出现
  3. 等候内容加载并出现,且用户能够与其交互
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)
}

相同也能够编写翻滚列表的进程,包括:

  1. 查找列表的界面元素
  2. 设置手势外边距避免触发系统导航
  3. 翻滚列表并等候界面稳定下来
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 改善 Android 应用性能

生成的 Baseline Profiles 在/build/outputs/中的managed_device_android_test_additional_output/文件夹。

使用 Baseline Profiles 改善 Android 应用性能

运用生成的 Baseline Profiles

  1. 复制生成的 Baseline Profiles 到src/main文件夹,偏重命名为baseline-prof.txt
    使用 Baseline Profiles 改善 Android 应用性能
  2. profileinstaller依赖项添加到:app模块。
dependencies {
 implementation("androidx.profileinstaller:profileinstaller:1.2.0")
}

Baseline Profiles 随运用打包发布,当用户装置运用时,Baseline Profiles 也会被编译,从而在初次运行运用时完成更好的功能。

Baseline Profiles 的运作办法

在开发运用或库时,需要考虑定义 Baseline Profiles,以包括烘托时刻或延迟时刻非常重要的常见用户交互流程。

  1. 系统会为运用生成 Profiles 规矩,并在运用中将其编译为二进制文件方式(能够在assets/dexopt/baseline.prof中找到)。然后能够照旧将相应 AAB 上传到 Google Play。
  2. Google Play 会处理该 Profiles 文件,然后将其与 APK 一起直接发布给用户。在运用装置期间,ART 会对 Profiles 文件中的办法履行 AOT 编译,以便进步这些办法的履行速度。假如 Profiles 文件包括运用发动或帧烘托期间运用的办法,用户可能会取得发动速度更快且卡顿更少的体会。
  3. 此流程可与 Cloud Profiles 汇总配合运用,以随着时刻的推移根据运用的实践运用情况对功能进行微调。
    使用 Baseline Profiles 改善 Android 应用性能

Cloud Profiles 能够供给另一种方式的 PGO,它们由 Google Play 商店进行汇总,并与Baseline Profiles 一起分发以进行装置时编译。尽管 Cloud Profiles 是由用户与运用的实践互动驱动的,但它们在更新后需要几天到几周的时刻才干分发,这就约束了它们的可用性。此外,Cloud Profiles 仅支持搭载 Android 9(API 级别 29)或更高版别的 Android 设备。

更多 Android 运用功能优化相关文章

《运用 Baseline Profiles 改善 Android 运用功能》

《运用 Macrobenchmark 测试 Android 运用功能》