Perfiles de imagen de arranque

Android 11 o superior admite 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 aplicación). En algunos casos, los perfiles de imagen de arranque pueden afectar el rendimiento de ejecución y el consumo de memoria en porcentajes de dos dígitos.

Obtener información del perfil de arranque

Los perfiles de imagen de arranque se derivan de los perfiles de las aplicaciones ejecutadas durante los recorridos críticos del usuario (CUJ). En una configuración de dispositivo específica, ART captura (como parte de los perfiles JIT) las clases y los métodos de classpath de arranque utilizados por las aplicaciones, luego registra esa información en el perfil de la aplicación (por ejemplo, /data/misc/profiles/cur/0/com.android.chrome/primary.prof ), donde está indexado por el archivo EXecutable (DEX) Dalvik de classpath de arranque (ver formato de perfil ART ).

Revise los perfiles de aplicaciones registrados durante los CUJ para determinar qué parte de la ruta de clases de arranque se usa más y es más importante para optimizar (para obtener un ejemplo, consulte el formato de perfil ART ). La inclusión de todos los métodos o clases afecta negativamente al rendimiento, por lo tanto, concéntrese en las rutas de código más utilizadas. Por ejemplo, si una sola aplicación utiliza un método del classpath de arranque, no debería formar parte de los perfiles de arranque. Cada dispositivo debe configurar la selección de método/clase en función de la selección de CUJ y la cantidad de datos producidos por las pruebas.

Para agregar información de classpath de arranque de todos los perfiles de aplicaciones individuales en el dispositivo, ejecute el comando adb shell cmd package snapshot-profile android . Puede usar la información agregada como base para el procesamiento y la selección de métodos/clases sin agregar perfiles individuales manualmente (aunque puede hacerlo si lo desea).

Perfil de imagen de arranque

Figura 1. Proceso para obtener perfiles de imágenes de arranque

Datos de perfil de la imagen de arranque

Los perfiles de imagen de arranque incluyen los siguientes archivos y datos.

  • Perfil para el classpath de arranque ( frameworks/base/config/boot-image-profile.txt ). Determina qué métodos del classpath de arranque se optimizan, qué clase se incluye en la imagen .art de arranque y cómo se distribuyen los archivos DEX correspondientes.

  • Lista de clases precargadas . Determina qué clases están precargadas 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/compilan, qué clase se incluye en la imagen .art de arranque y cómo se distribuyen los archivos DEX correspondientes.

formato de perfil ART

El perfil ART captura información de cada uno de los archivos DEX cargados, incluida información sobre los métodos que vale la pena optimizar y las clases utilizadas durante el inicio. Cuando la creación de perfiles de imagen de arranque está habilitada, ART también incluye los archivos JAR de classpath de arranque y del servidor del sistema en el perfil y anota cada archivo DEX con el nombre del paquete que lo usa.

Por ejemplo, descargue 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 una salida similar a:

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

  • core-oj.jar es utilizado por com.google.android.ext.services y com.android.systemui . Cada entrada enumera los dos paquetes utilizados 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. El mismo razonamiento se aplica a las otras secciones del perfil (por ejemplo, las clases de inicio).

Durante el procesamiento de datos, filtre los métodos/clases según el uso, dando prioridad a los procesos a nivel del sistema (por ejemplo, el servidor del sistema o systemui ) o a los métodos que pueden no usarse comúnmente pero que aún son importantes (por ejemplo, los métodos utilizados por el aplicación de cámara).

El formato de perfil anota internamente cada método con múltiples indicadores (inicio, posterior al inicio, hotness, abi), que es más de lo que se muestra en el formato de solo volcado. Para hacer uso de todas las señales, modifique los scripts disponibles.

Recomendaciones

Use las siguientes pautas para obtener los mejores resultados.

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

  • Otorgue prioridad de selección a los métodos/clases que utilizan los procesos del sistema. Estos métodos/clases pueden usar código que otras aplicaciones no suelen usar, pero que sigue siendo fundamental para optimizar.

  • La forma de los datos de la ejecución de un solo dispositivo se ve muy diferente en comparación con los dispositivos de prueba que ejecutan CUJ del mundo real. Si no tiene una gran flota de dispositivos de prueba, use el mismo dispositivo para ejecutar varios CUJ para aumentar la confianza de que las optimizaciones del perfil de imagen de arranque funcionarán bien en producción (este escenario se describe a continuación).

Configuración de dispositivos

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

  • Opción 1: configuración manual de accesorios (funciona para reiniciar):

    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: usar un local.prop (efecto permanente hasta que se elimine el archivo). Para hacerlo:

    1. Cree un archivo local.prop con el contenido:

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

      adb push local.prop /data/
      adb shell chmod 0750 /data/local.prop
      adb reboot
      
  • Opción 3: use la configuración del dispositivo para establecer las siguientes propiedades del lado del servidor:

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

Generación de perfiles de imagen de arranque

Use las siguientes instrucciones para generar un perfil de imagen de arranque básico usando pruebas en un solo dispositivo.

  1. Configura el dispositivo.

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

    2. (Opcional) Se necesita tiempo para que el nuevo formato de perfil limpie y reemplace los otros perfiles. Para acelerar la recopilación de perfiles, restablezca todos los perfiles en el dispositivo.

      adb shell stop
      adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
      adb shell start
      
    3. Ejecute los CUJ en el dispositivo.

  2. Capture el perfil usando el siguiente comando:

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

    adb pull /data/misc/profman/android.prof
    
  4. Navegue a los archivos JAR de classpath de arranque usando los siguientes comandos:

    m dist
    ls $ANDROID_PRODUCT_OUT/boot.zip
    
  5. Genere 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. Usando datos, modifique el comando profman usando las banderas 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, consulte la página de ayuda de profman o el código fuente.