Perfiles de imagen de arranque

Android 11 y las versiones posteriores admiten la generación de perfiles de imagen 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 inicio. 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 imagen de arranque pueden afectar el rendimiento de la ejecución y el consumo de memoria en porcentajes de dos dígitos.

Cómo obtener información del perfil de inicio

Los perfiles de imagen de arranque se derivan de los perfiles de apps ejecutadas 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 con el archivo ejecutable (DEX) de la ruta de acceso de inicio de Dalvik (consulta el formato de perfil de ART).

Revisa los perfiles de apps registrados durante los CUJ para determinar qué parte de la ruta de clase de inicio se usa más y es la más importante de optimizar (por ejemplo, consulta Formato de perfil de ART). La inclusión de todos los métodos o clases afecta negativamente el rendimiento, así que enfócate en las instrucciones de código más usadas. Por ejemplo, si una sola app usa un método de la ruta de clase de inicio, no debe ser parte de los perfiles de inicio. Cada dispositivo debe configurar la selección de método o clase según la selección de CUJ y la cantidad de datos que producen las pruebas.

Para agregar información de la ruta de acceso de clases de inicio 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 perfiles individuales de forma manual (aunque puedes hacerlo si lo deseas).

Perfil de la 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 imagen de inicio incluyen los siguientes archivos y datos.

  • Es el perfil de la ruta de acceso de clases de inicio (frameworks/base/config/boot-image-profile.txt). Determina qué métodos de la ruta de acceso de clases de inicio se optimizan, qué clase se incluye en la imagen .art de inicio y cómo se organizan los archivos DEX correspondientes.

  • Es la lista de clases cargadas previamente. Determina qué clases se cargan previamente 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 .art de inicio 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 se deben optimizar y las clases que se usan durante el inicio. Cuando se habilita la generación de perfiles de la imagen de inicio, ART también incluye la classpath de inicio 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, volca 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 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:

  • com.google.android.ext.services y com.android.systemui usan core-oj.jar. 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 podrían no usarse con frecuencia, pero que siguen siendo importantes (por ejemplo, los métodos que usa la app de la cámara).

El formato de perfil anota internamente cada método con varias marcas (inicio, inicio posterior, estado activo, ABI), que es más de lo que se muestra en el formato de solo volcado. Para aprovechar todos los indicadores, modifica las secuencias de comandos disponibles.

Recomendaciones

Usa los siguientes lineamientos para obtener mejores resultados.

  • Implementa la configuración para generar perfiles de imagen de arranque en varios dispositivos de prueba y agrega los resultados antes de generar el perfil de imagen de arranque final. La herramienta de 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 inicio).

  • Otorgar prioridad de selección a los métodos o clases que usan los procesos del sistema Estos métodos o clases pueden usar código que otras apps no usan con frecuencia, pero que sigue siendo fundamental para la optimización.

  • La forma de los datos de una ejecución de un solo dispositivo es muy diferente en comparación con los dispositivos de prueba que ejecutan CUJ reales. Si no tienes una gran flota de dispositivos de prueba, usa el mismo dispositivo para ejecutar varios CUJ y así aumentar la confianza de que las optimizaciones del perfil de la imagen de arranque funcionen bien en la producción (esta situación se describe a continuación).

Cómo configurar dispositivos

Para habilitar la configuración del perfil de inicio a través de las propiedades del sistema, usa uno de los siguientes métodos.

  • Opción 1: Configura los accesorios de forma manual (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 una 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:

    persist.device_config.runtime_native_boot.profilesystemserver
    persist.device_config.runtime_native_boot.profilebootclasspath`
    

Genera perfiles de imagen de arranque

Usa las siguientes instrucciones para generar un perfil de imagen de arranque básico a través de pruebas en un solo dispositivo.

  1. Configura el dispositivo.

    1. Configura el dispositivo como se describe en Cómo configurar dispositivos.

    2. (Opcional) El formato de perfil nuevo tarda un tiempo 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 acceso de clase de inicio con los siguientes comandos:

    m dist
    ls $ANDROID_PRODUCT_OUT/boot.zip
    
  5. Genera el perfil de imagen de arranque con el siguiente comando de profman.

    profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...
    
  6. Con 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.