Android 11 o superior admite la generación de perfiles de imágenes de arranque, que encapsulan información sobre el código de varios componentes a nivel del sistema, como el servidor del sistema y la ruta de clase de arranque. Android Runtime (ART) usa esta información para realizar optimizaciones en todo el sistema, algunas de las cuales son fundamentales para el rendimiento de Android y afectan la ejecución de todo el código no nativo (a nivel del sistema o de la aplicación). En algunos casos, los perfiles de imagen de arranque pueden afectar el rendimiento de ejecución y el consumo de memoria en porcentajes de dos dígitos.
Obtener información del perfil de arranque
Los perfiles de imagen de arranque se derivan de los perfiles de las aplicaciones ejecutadas durante los recorridos críticos del usuario (CUJ). En una configuración de dispositivo específica, ART captura (como parte de los perfiles JIT) las clases y los métodos de classpath de arranque utilizados por las aplicaciones, luego registra esa información en el perfil de la aplicación (por ejemplo, /data/misc/profiles/cur/0/com.android.chrome/primary.prof
), donde está indexado por el archivo EXecutable (DEX) Dalvik de classpath de arranque (ver formato de perfil ART ).
Revise los perfiles de aplicaciones registrados durante los CUJ para determinar qué parte de la ruta de clases de arranque se usa más y es más importante para optimizar (para obtener un ejemplo, consulte el formato de perfil ART ). La inclusión de todos los métodos o clases afecta negativamente al rendimiento, por lo tanto, concéntrese en las rutas de código más utilizadas. Por ejemplo, si una sola aplicación utiliza un método del classpath de arranque, no debería formar parte de los perfiles de arranque. Cada dispositivo debe configurar la selección de método/clase en función de la selección de CUJ y la cantidad de datos producidos por las pruebas.
Para agregar información de classpath de arranque de todos los perfiles de aplicaciones individuales en el dispositivo, ejecute el comando adb shell cmd package snapshot-profile android
. Puede usar la información agregada como base para el procesamiento y la selección de métodos/clases sin agregar perfiles individuales manualmente (aunque puede hacerlo si lo desea).
Figura 1. Proceso para obtener perfiles de imágenes de arranque
Datos de perfil de la imagen de arranque
Los perfiles de imagen de arranque incluyen los siguientes archivos y datos.
Perfil para el classpath de arranque (
frameworks/base/config/boot-image-profile.txt
). Determina qué métodos del classpath de arranque se optimizan, qué clase se incluye en la imagen.art
de arranque y cómo se distribuyen los archivos DEX correspondientes.Lista de clases precargadas . Determina qué clases están precargadas en Zygote.
Perfil para los componentes del servidor del sistema (
frameworks/base/services/art-profile
). Determina qué métodos del servidor del sistema se optimizan/compilan, qué clase se incluye en la imagen.art
de arranque y cómo se distribuyen los archivos DEX correspondientes.
formato de perfil ART
El perfil ART captura información de cada uno de los archivos DEX cargados, incluida información sobre los métodos que vale la pena optimizar y las clases utilizadas durante el inicio. Cuando la creación de perfiles de imagen de arranque está habilitada, ART también incluye los archivos JAR de classpath de arranque y del servidor del sistema en el perfil y anota cada archivo DEX con el nombre del paquete que lo usa.
Por ejemplo, descargue el perfil de imagen de arranque sin procesar con el siguiente comando:
adb shell profman --dump-only --profile-file=/data/misc/profman/android.prof
Esto produce una salida similar a:
=== 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: …
En el ejemplo anterior:
core-oj.jar
es utilizado porcom.google.android.ext.services
ycom.android.systemui
. Cada entrada enumera los dos paquetes utilizados decore-oj.jar
.Ambos procesos usan el método con el índice DEX 520, pero solo el proceso
systemui
usa el método con el índice DEX 521. El mismo razonamiento se aplica a las otras secciones del perfil (por ejemplo, las clases de inicio).
Durante el procesamiento de datos, filtre los métodos/clases según el uso, dando prioridad a los procesos a nivel del sistema (por ejemplo, el servidor del sistema o systemui
) o a los métodos que pueden no usarse comúnmente pero que aún son importantes (por ejemplo, los métodos utilizados por el aplicación de cámara).
El formato de perfil anota internamente cada método con múltiples indicadores (inicio, posterior al inicio, hotness, abi), que es más de lo que se muestra en el formato de solo volcado. Para hacer uso de todas las señales, modifique los scripts disponibles.
Recomendaciones
Use las siguientes pautas para obtener los mejores resultados.
Implemente la configuración para generar perfiles de imagen de arranque en varios dispositivos de prueba y agregue los resultados antes de generar el perfil de imagen de arranque final. La herramienta
profman
admite agregar y seleccionar varios perfiles de imagen de arranque, pero solo funciona con la misma versión de la imagen de arranque (la misma ruta de clase de arranque).Otorgue prioridad de selección a los métodos/clases que utilizan los procesos del sistema. Estos métodos/clases pueden usar código que otras aplicaciones no suelen usar, pero que sigue siendo fundamental para optimizar.
La forma de los datos de la ejecución de un solo dispositivo se ve muy diferente en comparación con los dispositivos de prueba que ejecutan CUJ del mundo real. Si no tiene una gran flota de dispositivos de prueba, use el mismo dispositivo para ejecutar varios CUJ para aumentar la confianza de que las optimizaciones del perfil de imagen de arranque funcionarán bien en producción (este escenario se describe a continuación).
Configuración de dispositivos
Para habilitar la configuración del perfil de inicio a través de las propiedades del sistema, use uno de los siguientes métodos.
Opción 1: configuración manual de accesorios (funciona para reiniciar):
adb root
adb shell stop
adb shell setprop dalvik.vm.profilebootclasspath true
adb shell setprop dalvik.vm.profilesystemserver true
adb shell start
Opción 2: usar un
local.prop
(efecto permanente hasta que se elimine el archivo). Para hacerlo:Cree un archivo
local.prop
con el contenido:dalvik.vm.profilebootclasspath=true dalvik.vm.profilesystemserver=true
Ejecute los siguientes comandos:
adb push local.prop /data/
adb shell chmod 0750 /data/local.prop
adb reboot
Opción 3: use la configuración del dispositivo para establecer las siguientes propiedades del lado del servidor:
persist.device_config.runtime_native_boot.profilesystemserver persist.device_config.runtime_native_boot.profilebootclasspath`
Generación de perfiles de imagen de arranque
Use las siguientes instrucciones para generar un perfil de imagen de arranque básico usando pruebas en un solo dispositivo.
Configura el dispositivo.
Configure el dispositivo como se describe en Configuración de dispositivos .
(Opcional) Se necesita tiempo para que el nuevo formato de perfil limpie y reemplace los otros perfiles. Para acelerar la recopilación de perfiles, restablezca todos los perfiles en el dispositivo.
adb shell stop
adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
adb shell start
Ejecute los CUJ en el dispositivo.
Capture el perfil usando el siguiente comando:
adb shell cmd package snapshot-profile android
Extrae el perfil usando el siguiente comando:
adb pull /data/misc/profman/android.prof
Navegue a los archivos JAR de classpath de arranque usando los siguientes comandos:
m dist
ls $ANDROID_PRODUCT_OUT/boot.zip
Genere el perfil de la imagen de arranque con el siguiente comando
profman
.profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...
Usando datos, modifique el comando
profman
usando las banderas de umbral de selección disponibles.-
--method-threshold
-
--class-threshold
-
--clean-class-threshold
-
--preloaded-class-threshold
-
--upgrade-startup-to-hot
-
--special-package
Para ver la lista completa, consulte la página de ayuda de
profman
o el código fuente.-