Android 11 y las versiones posteriores admiten 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 app). En algunos casos, los perfiles de imágenes de arranque pueden afectar el rendimiento de la ejecución y el consumo de memoria en porcentajes de dos dígitos.
Obtén información del perfil de arranque
Los perfiles de imágenes de arranque se derivan de los perfiles de las apps que se ejecutan durante los recorridos críticos del usuario (CUJs). En una configuración de dispositivo específica, ART captura
(como parte de los perfiles JIT) los métodos y las clases de la ruta de clase de arranque que usan las
apps y, luego, registra esa información en el perfil de la app (por ejemplo,
/data/misc/profiles/cur/0/com.android.chrome/primary.prof), donde se
indexa mediante el archivo Dalvik EXecutable (DEX) de la ruta de clase de arranque (consulta el formato del perfil de ART).
Revisa los perfiles de la app registrados durante los CUJs para determinar qué parte de la ruta de clase de arranque se usa más y es más importante optimizar (para obtener un ejemplo, consulta el formato del perfil de ART). Incluir todos los métodos o clases afecta negativamente el rendimiento, por lo que debes enfocarte en las rutas de código de uso frecuente. Por ejemplo, si una sola app usa un método de la ruta de clase de arranque, no debería formar parte de los perfiles de arranque. Cada dispositivo debe configurar la selección de métodos o clases en función de la selección de CUJ y la cantidad de datos que se producen durante las pruebas.
Para agregar información de la ruta de clase de arranque de todos los perfiles de apps individuales en el dispositivo, ejecuta el comando adb shell cmd package snapshot-profile android. Puedes usar la información agregada como base para el procesamiento y la selección de métodos o clases sin agregar manualmente perfiles individuales (aunque puedes hacerlo si lo deseas).
Figura 1: Proceso para obtener perfiles de imágenes de arranque
Datos del perfil de imágenes de arranque
Los perfiles de imágenes de arranque incluyen los siguientes archivos y datos.
Perfil de la ruta de clase de arranque (
frameworks/base/config/boot-image-profile.txt. Determina qué métodos de la ruta de clase de arranque se optimizan y qué clase se incluye en la imagen.artde arranque.Lista de clases precargadas. Determina qué clases se precargan en Zygote.
Perfil de los componentes del servidor del sistema (
frameworks/base/services/art-profile). Determina qué métodos del servidor del sistema se optimizan o compilan, qué clase se incluye en la imagen.artde arranque y cómo se organizan los archivos DEX correspondientes.
Formato del perfil de ART
El perfil de ART captura información de cada uno de los archivos DEX cargados, incluida la información sobre los métodos que vale la pena optimizar y las clases que se usan durante el inicio. Cuando se habilita la creación de perfiles de imágenes de arranque, ART también incluye la ruta de clase de arranque y los archivos JAR del servidor del sistema en el perfil, y anota cada archivo DEX con el nombre del paquete que lo usa.
Por ejemplo, vuelca el perfil de imágenes de arranque sin procesar con el siguiente comando:
adb shell profman --dump-only --profile-file=/data/misc/profman/android.profEsto produce un resultado similar al siguiente:
=== 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, sucede lo siguiente:
core-oj.jarse usa encom.google.android.ext.servicesycom.android.systemui. Cada entrada muestra los dos paquetes que se usan desdecore-oj.jar.Ambos procesos usan el método con el índice DEX 520, pero solo el proceso
systemuiusa el método con el índice DEX 521. La misma lógica se aplica a las otras secciones del perfil (por ejemplo, las clases de inicio).
Durante el procesamiento de datos, filtra los métodos o las clases según el uso, y da prioridad a los procesos a nivel del sistema (por ejemplo, el servidor del sistema o systemui) o a los métodos que no se usan de uso frecuente, pero que son importantes (por ejemplo, los métodos que usa la app de la cámara).
El formato del perfil anota internamente cada método con varias marcas (inicio, posterior al inicio, popularidad, abi), que son más de las que se muestran en el formato de volcado. Para usar todos los indicadores, modifica las secuencias de comandos disponibles.
Recomendaciones
Usa los siguientes lineamientos para obtener los mejores resultados.
Implementa la configuración para generar perfiles de imágenes de arranque en varios dispositivos de prueba y agrega los resultados antes de generar el perfil de imágenes de arranque final. La herramienta
profmanadmite la agregación y la selección de varios perfiles de imágenes de arranque, pero solo funciona con la misma versión de la imagen de arranque (misma ruta de clase de arranque).Da prioridad de selección a los métodos o las clases que usan los procesos del sistema. Estos métodos o clases pueden usar código que no se usa con frecuencia en otras apps, pero que es fundamental para optimizar.
La forma de los datos de una sola ejecución del dispositivo se ve muy diferente en comparación con los dispositivos de prueba que ejecutan CUJs del mundo real. Si no tienes una gran flota de dispositivos de prueba, usa el mismo dispositivo para ejecutar varios CUJs y aumentar la confianza de que las optimizaciones del perfil de imágenes de arranque funcionarán bien en producción (este caso se describe a continuación).
Cómo configurar dispositivos
Para habilitar la configuración del perfil de arranque a través de las propiedades del sistema, usa uno de los siguientes métodos.
Opción 1: Configura las propiedades de forma manual (funciona hasta el reinicio):
adb rootadb shell stopadb shell setprop dalvik.vm.profilebootclasspath trueadb shell setprop dalvik.vm.profilesystemserver trueadb shell startOpción 2: Usa un
local.prop(efecto permanente hasta que se borra el archivo). Para ello, sigue estos pasos:Crea un archivo
local.propcon el siguiente contenido:dalvik.vm.profilebootclasspath=true dalvik.vm.profilesystemserver=trueEjecuta los siguientes comandos:
adb push local.prop /data/adb shell chmod 0750 /data/local.propadb reboot
Opción 3: Usa la configuración del dispositivo para establecer las siguientes propiedades del servidor:
adb shell device_config put runtime_native_boot profilebootclasspath true adb shell device_config put runtime_native_boot profilesystemserver true
Genera perfiles de imágenes de arranque
Usa las siguientes instrucciones para generar un perfil de imágenes de arranque básico con pruebas en un solo dispositivo.
Configura el dispositivo.
Configura el dispositivo como se describe en Cómo configurar dispositivos.
(Opcional) El nuevo formato de perfil tarda en limpiar y reemplazar los otros perfiles. Para acelerar la recopilación de perfiles, restablece todos los perfiles del dispositivo.
adb shell stopadb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"adb shell startEjecuta los CUJs en el dispositivo.
Captura el perfil con el siguiente comando:
adb shell cmd package snapshot-profile androidExtrae el perfil con el siguiente comando:
adb pull /data/misc/profman/android.profNavega a los archivos JAR de la ruta de clase de arranque con los siguientes comandos:
m distls $ANDROID_PRODUCT_OUT/boot.zipGenera el perfil de imágenes de arranque con el siguiente comando
profman.profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...Con los datos, ajusta el comando
profmancon las marcas 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, consulta la página de ayuda o el código fuente de
profman.