Perfiles de imagen de arranque

Android 11 y versiones posteriores admiten la generación de perfiles de imagen 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. 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.

Obtén información del perfil de inicio

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

Revisa los perfiles de la app registrados durante los CUJ para determinar qué parte de la ruta de acceso de inicio se usa más y es más importante optimizar (para ver un ejemplo, consulta el 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 acceso de clases de inicio, este 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.

  • Es el 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 de arranque .art 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 generación de perfiles de imágenes de inicio, ART también incluye la ruta de acceso 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, ocurre lo siguiente:

  • com.google.android.ext.services y com.android.systemui usan core-oj.jar. Cada entrada enumera los dos paquetes que se usan desde 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 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 imagen de arranque en varios dispositivos de prueba y agrega los resultados antes de generar el perfil de imagen de arranque final. La herramienta profman admite la agregación y selección de varios perfiles de imagen de inicio, pero solo funciona con la misma versión de la imagen de inicio (mismo classpath 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 suelen usar, pero que aún es fundamental optimizar.

  • La forma de los datos de una sola ejecución de dispositivo se ve muy diferente en comparación con los dispositivos de prueba que ejecutan CUJ del mundo real. Si no tienes una gran flota de dispositivos de prueba, usa el mismo dispositivo para ejecutar varias 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).

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 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:

    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 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 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 la imagen de inicio 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.