启动映像配置文件

Android 11 或更高版本支持生成启动映像配置文件,该文件封装了各种系统级组件(例如系统服务器和启动类路径)的代码信息。Android 运行时 (ART) 会使用这些信息来执行系统范围的优化,其中一些优化对 Android 的性能至关重要,并会影响所有非原生代码(系统或应用级)的执行。在某些情况下,启动映像配置文件对执行性能和内存占用的影响可以达到 10% 及以上。

获取启动配置文件信息

启动映像配置文件来自于在关键用户历程 (CUJ) 中执行的应用的配置文件。在特定的设备配置中,ART 会(作为 JIT 配置文件的一部分)捕获应用使用的启动类路径方法和类,然后在应用配置文件(例如 /data/misc/profiles/cur/0/com.android.chrome/primary.prof)中记录这些信息,以便启动类路径 Dalvik EXecutable (DEX) 文件将其编入索引(请参阅ART 配置文件格式)。

检查在 CUJ 期间记录的应用配置文件,以确定启动类路径的哪个部分被使用得最多、最需要优化(如需查看示例,请参阅 ART 配置文件格式)。添加所有方法或类会对性能产生不良影响,因此请重点关注最常用的代码路径。例如,如果启动类路径中的某个方法只有一个应用使用,则不应将它添加到启动配置文件中。每台设备都应根据 CUJ 期间的选择以及测试产生的数据量来配置方法/类的选择。

要汇总设备上各个应用配置文件中的启动类路径信息,请运行 adb shell cmd package snapshot-profile android 命令。您可以根据汇总信息来进行处理并选择方法/类,而无需手动汇总各个配置文件(不过,如果您愿意的话,也可以这样做)。

启动映像配置文件

图 1. 获得启动映像配置文件的流程

启动映像配置文件数据

启动映像配置文件包含以下文件和数据。

  • 启动类路径的配置文件 (frameworks/base/config/boot-image-profile.txt):决定了要优化启动类路径中的哪些方法、要在启动 .art 映像中包含哪个类,以及如何布局相应的 DEX 文件。

  • 预加载类列表:决定了要在 Zygote 中预加载哪些类。

  • 系统服务器组件的配置文件 (frameworks/base/services/art-profile):决定了要优化/编译系统服务器中的哪些方法、要在启动 .art 映像中包含哪个类,以及如何布局相应的 DEX 文件。

ART 配置文件格式

ART 配置文件会从每个加载的 DEX 文件中捕获信息,包括值得优化的方法以及在启动期间使用的类的信息。启用启动映像配置文件创建功能后,ART 还会将启动类路径和系统服务器 JAR 文件添加到配置文件中,并用使用各 DEX 文件的软件包的名称为相应 DEX 文件添加注解。

例如,使用以下命令转储原始启动映像配置文件:

adb shell profman --dump-only --profile-file=/data/misc/profman/android.prof

这会生成类似如下的输出:

=== Dex files  ===
=== profile ===
ProfileInfo [012]

core-oj.jar:com.google.android.ext.services [index=0] [checksum=e4e3979a]
        hot methods: 520[], 611[] …
        startup methods: …
        classes: …
...
core-oj.jar:com.android.systemui [index=94] [checksum=e4e3979a]
        hot methods: 520[], 521[]…
        startup methods: …
        classes: …

在上述示例中:

  • com.google.android.ext.servicescom.android.systemui 使用了 core-oj.jar。每个条目都列出了 core-oj.jar 中使用的两个软件包。

  • 两个进程都通过 DEX 索引 520 使用该方法,但只有 systemui 进程通过 DEX 索引 521 使用了该方法。同样的原则也适用于配置文件的其他部分(例如启动类)。

在数据处理过程中,应根据使用情况来过滤方法/类,优先纳入系统级进程(例如系统服务器或 systemui)或可能不太常用但仍然很重要的方法(例如相机应用使用的方法)。

配置文件格式本身会用多个标记(启动、启动后、热度、abi)为每个方法添加注解,其数量多于转储专用格式中显示的标记。要充分利用所有这些标记,请修改可用脚本。

建议

请遵循以下准则,以获得最佳结果。

  • 将用于生成启动映像配置文件的配置部署到多个测试设备并汇总测试结果,然后再生成最终启动映像配置文件。profman 工具支持汇总和选择多个启动映像配置文件,但只能用于同一版本的启动映像(同一个启动类路径)。

  • 优先选择系统进程使用的方法/类。这些方法/类使用的代码可能不常被其他应用使用,但仍然很有必要优化。

  • 与执行真实 CUJ 的测试设备相比,在单个设备上运行得出的数据形状看上去会有很大不同。如果您没有大量的测试设备,请使用同一台设备运行多个 CUJ,以更好地确保启动映像配置文件优化措施将在生产环境中发挥良好作用(下文将对此场景进行说明)。

配置设备

可使用下列方法通过系统属性启用启动配置文件配置。

  • 方法 1:手动设置属性(适用于重新启动):

    adb root
    adb shell stop
    adb shell setprop dalvik.vm.profilebootclasspath true
    adb shell setprop dalvik.vm.profilesystemserver true
    adb shell start
    
  • 方法 2:使用 local.prop(只要不删除该文件,则永久有效)。为此,请执行以下操作:

    1. 使用以下内容创建 local.prop 文件:

      dalvik.vm.profilebootclasspath=true
      dalvik.vm.profilesystemserver=true
      
    2. 运行以下命令:

      adb push local.prop /data/
      adb shell chmod 0750 /data/local.prop
      adb reboot
      
  • 方法 3:使用设备配置设置以下服务器端属性:

    persist.device_config.runtime_native_boot.profilesystemserver
    persist.device_config.runtime_native_boot.profilebootclasspath`
    

生成启动映像配置文件

按照以下说明,在单个设备上进行测试,生成基本启动映像配置文件。

  1. 设置设备。

    1. 按照配置设备中的说明配置设备。

    2. (可选)新的配置文件格式需要一段时间来清除并替换其他配置文件。如需加快配置文件收集速度,请重置设备上的所有配置文件。

      adb shell stop
      adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
      adb shell start
      
    3. 在设备上运行 CUJ。

  2. 使用以下命令捕获配置文件:

    adb shell cmd package snapshot-profile android
    
  3. 使用以下命令提取配置文件:

    adb pull /data/misc/profman/android.prof
    
  4. 使用以下命令导航到启动类路径 JAR 文件:

    m dist
    ls $ANDROID_PRODUCT_OUT/boot.zip
    
  5. 使用以下 profman 命令生成启动映像配置文件。

    profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...
    
  6. 根据数据,使用可用的选择阈值标记来微调 profman 命令。

    • --method-threshold
    • --class-threshold
    • --clean-class-threshold
    • --preloaded-class-threshold
    • --upgrade-startup-to-hot
    • --special-package

    如需查看完整列表,请参阅 profman 帮助页面或源代码。