Perfiles de imagen de arranque

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).

Perfil de imagen de arranque

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 .art de 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 .art de 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.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, sucede lo siguiente:

  • core-oj.jar se usa en com.google.android.ext.services y com.android.systemui. Cada entrada muestra 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 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 profman admite 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 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 borra 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 imágenes de arranque básico con pruebas en un solo dispositivo.

  1. Configura el dispositivo.

    1. Configura el dispositivo como se describe en Cómo configurar 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 CUJs 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 arranque con los siguientes comandos:

    m dist
    ls $ANDROID_PRODUCT_OUT/boot.zip
  5. Genera 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=...
  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.