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
命令。您可以使用聚合信息作为处理和方法/类选择的基础,而无需手动聚合单个配置文件(当然,如果需要,您也可以手动聚合)。
图 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.jar
由com.google.android.ext.services
和com.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
(永久有效,直到文件被删除)。为此,请执行以下操作创建包含以下内容的
local.prop
文件dalvik.vm.profilebootclasspath=true dalvik.vm.profilesystemserver=true
运行以下命令
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`
生成启动映像配置文件
使用以下说明在单个设备上使用测试生成基本的启动映像配置文件。
设置设备。
按照配置设备中的说明配置设备。
(可选)新的配置文件格式需要一些时间来清理和替换其他配置文件。要加快配置文件收集速度,请重置设备上的所有配置文件。
adb shell stop
adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
adb shell start
在设备上运行 CUJ。
使用以下命令捕获配置文件
adb shell cmd package snapshot-profile android
使用以下命令提取配置文件
adb pull /data/misc/profman/android.prof
使用以下命令导航到启动类路径 JAR 文件
m dist
ls $ANDROID_PRODUCT_OUT/boot.zip
使用以下
profman
命令生成启动映像配置文件。profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...
使用数据,使用可用的选择阈值标志调整
profman
命令。--method-threshold
--class-threshold
--clean-class-threshold
--preloaded-class-threshold
--upgrade-startup-to-hot
--special-package
要查看完整列表,请参阅
profman
帮助页面或源代码。