启动映像配置文件

Android 11 或更高版本支持生成启动映像配置文件,其中封装了有关各种系统级组件(例如系统服务器和启动类路径)代码的信息。Android 运行时 (ART) 使用此信息执行系统范围的优化,其中一些优化对于 Android 的性能至关重要,并且会影响所有非原生代码(系统或应用级别)的执行。在某些情况下,启动映像配置文件可以将执行性能和内存消耗提高两位数百分比。

获取启动配置文件信息

启动映像配置文件源自关键用户历程 (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 命令。您可以使用聚合信息作为处理和方法/类选择的基础,而无需手动聚合单个配置文件(当然,如果需要,您也可以手动聚合)。

Boot image profile

图 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: …

在上面的示例中

  • core-oj.jarcom.google.android.ext.servicescom.android.systemui 使用。每个条目列出了从 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 帮助页面或源代码。