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 clases de arranque. Android Runtime (ART) utiliza esta información para realizar optimizaciones en todo el sistema, algunas de las cuales son críticas para el rendimiento de Android e impactan la ejecución de todo el código no nativo (a nivel de sistema o 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 imágenes 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) los métodos y clases de classpath de arranque utilizados por las aplicaciones y 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 Dalvik EXecutable (DEX) de classpath de arranque (consulte Formato de perfil ART ).

Revise los perfiles de aplicaciones registrados durante las CUJ para determinar qué parte de la ruta de clase de arranque es más utilizada y más importante para optimizar (para ver un ejemplo, consulte Formato de perfil ART ). Incluir todos los métodos o clases afecta negativamente al rendimiento, así que concéntrese en las rutas de código más utilizadas. Por ejemplo, si una sola aplicación utiliza un método de la ruta de clases de inicio, no debería formar parte de los perfiles de inicio. Cada dispositivo debe configurar la selección de método/clase según 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 utilizar la información agregada como base para el procesamiento y la selección de método/clase sin agregar manualmente perfiles individuales (aunque puede hacerlo si lo desea).

Perfil de imagen de arranque

Figura 1. Proceso para obtener perfiles de imagen de arranque

Datos del perfil de la imagen de arranque

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

  • Perfil para la ruta de clase 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 de arranque .art 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 el perfil de imagen de arranque está habilitado, ART también incluye los archivos JAR del servidor del sistema y la ruta de clase de arranque en el perfil y anota cada archivo DEX con el nombre del paquete que lo utiliza.

Por ejemplo, vuelque el perfil de la imagen de inicio sin formato 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 en core-oj.jar .

  • Ambos procesos usan el método con índice DEX 520, pero solo el proceso systemui usa el método con í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 podrían 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, post-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

Utilice las siguientes pautas para obtener mejores resultados.

  • Implemente la configuración para generar perfiles de imagen de inicio en varios dispositivos de prueba y agregue los resultados antes de generar el perfil de imagen de inicio final. La herramienta profman admite la agregación y selección de múltiples perfiles de imagen de inicio, pero solo funciona con la misma versión de la imagen de inicio (la misma ruta de clase de inicio).

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

  • 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 la imagen de inicio funcionarán bien en producción (este escenario se describe a continuación).

Configurar dispositivos

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

  • Opción 1: configurar accesorios manualmente (funciona hasta 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: utilizar 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: utilizar 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`
    

Generar perfiles de imagen de arranque

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

  1. Configure 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. Extraiga el perfil usando el siguiente comando:

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

    m dist
    ls $ANDROID_PRODUCT_OUT/boot.zip
    
  5. Genere el perfil de imagen de arranque usando 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 los indicadores 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 profman o el código fuente.