Perfiles de imagen de arranque

Android 11 y las versiones posteriores admiten la generación de perfiles de imágenes de inicio, que encapsulan información sobre el código de varios componentes a nivel del sistema, como el servidor del sistema y la ruta de acceso de inicio de la clase. 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 (CUJ). En una configuración de dispositivo específica, ART captura (como parte de los perfiles de JIT) los métodos y las clases de la ruta de acceso de inicio 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 por el archivo ejecutable de Dalvik (DEX) de la ruta de acceso de inicio (consulta Formato del perfil de ART).

Revisa los perfiles de la app registrados durante los CUJ para determinar qué parte de la ruta de acceso de inicio es la más utilizada y la más importante para optimizar (para ver un ejemplo, consulta 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 más utilizadas. Por ejemplo, si un solo método del classpath de inicio es utilizado por una sola app, no debería formar parte de los perfiles de inicio. Cada dispositivo debe configurar la selección de métodos o clases según la selección de CUJ y la cantidad de datos que se producen durante las pruebas.

Para agregar información de la ruta de acceso de inicio de la clase de todos los perfiles de app 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).

Perfil de imagen de arranque

Figura 1: Proceso para obtener perfiles de imágenes de inicio

Datos del perfil de la imagen de arranque

Los perfiles de imágenes de arranque incluyen los siguientes archivos y datos.

  • Perfil para la ruta de acceso de inicio de la clase (frameworks/base/config/boot-image-profile.txt). Determina qué métodos de la ruta de acceso de inicio de la clase se optimizan y qué clase se incluye en la imagen de .art de inicio.

  • Lista de clases precargadas. Determina qué clases se cargan previamente 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 o compilan, qué clase se incluye en la imagen de .art de arranque y cómo se disponen 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 generación de perfiles de imágenes de inicio, ART también incluye los archivos JAR de la ruta de acceso de clases de inicio y 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 la imagen de arranque sin procesar con el siguiente comando:

adb shell profman --dump-only --profile-file=/data/misc/profman/android.prof

Esto 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, se muestra lo siguiente:

  • core-oj.jar es utilizado por com.google.android.ext.services y com.android.systemui. Cada entrada enumera los dos paquetes que se usan de core-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. 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 prioriza los procesos a nivel del sistema (por ejemplo, el servidor del sistema o systemui) o los métodos que tal vez no se usen con frecuencia, pero que siguen siendo importantes (por ejemplo, los métodos que usa la app de la cámara).

Internamente, el formato de perfil anota 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 aprovechar todos los indicadores, modifica las secuencias de comandos disponibles.

Recomendaciones

Sigue 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 final de la imagen de arranque. La herramienta profman admite la agregación y selección de varios perfiles de imágenes de arranque, pero solo funciona con la misma versión de la imagen de arranque (la misma ruta de acceso de arranque de la clase).

  • Dar 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 otras apps no suelen usar, pero que sigue siendo fundamental 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 CUJ del mundo real. Si no tienes una gran cantidad de dispositivos de prueba, usa el mismo dispositivo para ejecutar varios CUJ y aumentar la confianza de que las optimizaciones del perfil de la imagen 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 manualmente las propiedades (funciona hasta el reinicio):

    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: Usa un local.prop (efecto permanente hasta que se borre el archivo). Para ello, sigue estos pasos:

    1. Crea un archivo local.prop con el siguiente contenido:

      dalvik.vm.profilebootclasspath=true
      dalvik.vm.profilesystemserver=true
      
    2. Ejecuta los siguientes comandos:

      adb push local.prop /data/
      adb shell chmod 0750 /data/local.prop
      adb 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 imagen de arranque básico con pruebas en un solo dispositivo.

  1. Configura el dispositivo.

    1. Configura el dispositivo como se describe en Configuración de dispositivos.

    2. (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 stop
      adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
      adb shell start
    3. Ejecuta los CUJ en el dispositivo.

  2. Captura el perfil con el siguiente comando:

    adb shell cmd package snapshot-profile android
  3. Extrae el perfil con el siguiente comando:

    adb pull /data/misc/profman/android.prof
  4. Navega a los archivos JAR de la ruta de clase de inicio con los siguientes comandos:

    m dist
    ls $ANDROID_PRODUCT_OUT/boot.zip
  5. Genera 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=...
  6. Con los datos, ajusta el comando profman con 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.