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 clases de arranque. Android Runtime (ART) utiliza esta información para realizar optimizaciones en todo el sistema, algunas de las cuales son críticas para el rendimiento de Android e impactan la ejecución de todo el código no nativo (a nivel de sistema o 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 imágenes 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) los métodos y clases de classpath de arranque utilizados por las aplicaciones y 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 Dalvik EXecutable (DEX) de classpath de arranque (consulte Formato de perfil ART ).
Revise los perfiles de aplicaciones registrados durante las CUJ para determinar qué parte de la ruta de clase de arranque es más utilizada y más importante para optimizar (para ver un ejemplo, consulte Formato de perfil ART ). Incluir todos los métodos o clases afecta negativamente al rendimiento, así que concéntrese en las rutas de código más utilizadas. Por ejemplo, si una sola aplicación utiliza un método de la ruta de clases de inicio, no debería formar parte de los perfiles de inicio. Cada dispositivo debe configurar la selección de método/clase según 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 utilizar la información agregada como base para el procesamiento y la selección de método/clase sin agregar manualmente perfiles individuales (aunque puede hacerlo si lo desea).
Figura 1. Proceso para obtener perfiles de imagen de arranque
Datos del perfil de la imagen de arranque
Los perfiles de imagen de arranque incluyen los siguientes archivos y datos.
Perfil para la ruta de clase 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 de arranque.art
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 el perfil de imagen de arranque está habilitado, ART también incluye los archivos JAR del servidor del sistema y la ruta de clase de arranque en el perfil y anota cada archivo DEX con el nombre del paquete que lo utiliza.
Por ejemplo, vuelque el perfil de la imagen de inicio sin formato 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 encore-oj.jar
.Ambos procesos usan el método con índice DEX 520, pero solo el proceso
systemui
usa el método con í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 podrían 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, post-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
Utilice las siguientes pautas para obtener mejores resultados.
Implemente la configuración para generar perfiles de imagen de inicio en varios dispositivos de prueba y agregue los resultados antes de generar el perfil de imagen de inicio final. La herramienta
profman
admite la agregación y selección de múltiples perfiles de imagen de inicio, pero solo funciona con la misma versión de la imagen de inicio (la misma ruta de clase de inicio).Dar prioridad de selección a los métodos/clases que utilizan los procesos del sistema. Estos métodos/clases pueden utilizar código que otras aplicaciones no suelen utilizar, pero que sigue siendo fundamental optimizarlo.
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 la imagen de inicio funcionarán bien en producción (este escenario se describe a continuación).
Configurar dispositivos
Para habilitar la configuración del perfil de arranque a través de las propiedades del sistema, utilice uno de los siguientes métodos.
Opción 1: configurar accesorios manualmente (funciona hasta 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: utilizar 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: utilizar 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`
Generar perfiles de imagen de arranque
Utilice las siguientes instrucciones para generar un perfil de imagen de arranque básico mediante pruebas en un solo dispositivo.
Configure 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
Extraiga el perfil usando el siguiente comando:
adb pull /data/misc/profman/android.prof
Navegue hasta los archivos JAR de classpath de inicio usando los siguientes comandos:
m dist
ls $ANDROID_PRODUCT_OUT/boot.zip
Genere el perfil de imagen de arranque usando 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 los indicadores 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
profman
o el código fuente.-