Descripción general de los perfiles de Baseline

Los Perfiles de Baseline mejoran la velocidad de ejecución del código en aproximadamente un 30% desde el primer lanzamiento, ya que evitan la interpretación y los pasos de compilación just-in-time (JIT) para las instrucciones de código incluidas.

Cuando se envía un perfil de Baseline a una app o biblioteca, Android Runtime (ART) puede optimizar las instrucciones de código especificadas a través de la compilación anticipada (AOT), lo que brinda mejoras de rendimiento para cada usuario nuevo y con cada actualización de la app. Esta optimización guiada por perfil (PGO) permite que las apps optimicen el inicio, reduzcan los bloqueos de interacción y mejoren el rendimiento general del entorno de ejecución para los usuarios finales desde el primer lanzamiento.

Estas mejoras en el rendimiento dan como resultado métricas mejoradas de la empresa, como retención de usuarios, transacciones y calificaciones. Puedes leer más sobre el efecto del rendimiento en las métricas empresariales en historias de Josh, Lyft, TikTok y Zomato.

Beneficios de los Perfiles de Baseline

Los Perfiles de Baseline permiten que todas las interacciones del usuario (como el inicio de la app, la navegación entre pantallas o el desplazamiento por el contenido) sean más fluidas desde la primera vez que se ejecutan. Cuando se aumenta la velocidad y la capacidad de respuesta de una app, los Perfiles de Baseline pueden generar más usuarios activos por día y un promedio más alto de la tasa de visitas recurrentes.

Los Perfiles de Baseline ayudan a guiar la optimización más allá del inicio de la app, ya que proporcionan interacciones comunes del usuario que mejoran el tiempo de ejecución de la app desde el primer lanzamiento. La compilación anticipada guiada no depende de los dispositivos de los usuarios y se puede realizar una vez por versión en una máquina de desarrollo en lugar de un dispositivo móvil. Cuando se envían versiones con un perfil de Baseline, las optimizaciones de las apps están disponibles mucho más rápido que si solo se basaran en los perfiles de Cloud.

Cuando no se usa un perfil de Baseline, todo el código de la app se compila de forma JIT en la memoria después de que se interpreta o se escribe en un archivo odex en segundo plano cuando el dispositivo está inactivo. Después de instalar o actualizar una app, los usuarios tienen una experiencia poco óptima desde la primera vez que la ejecutan hasta que se optimizan las nuevas instrucciones de código. Muchas apps miden un aumento del rendimiento de alrededor del 30% después de la optimización.

Perfiles de inicio

Los perfiles de inicio son similares a los perfiles de Baseline, pero la diferencia se encuentra en que se usan en el tiempo de compilación y no para la optimización en el dispositivo. Un perfil de inicio se usa para optimizar el diseño del archivo DEX con el objetivo de mejorar los tiempos de inicio. El código identificado en el perfil de inicio se coloca en el archivo classes.dex principal y el resto del código se coloca en archivos DEX separados. Esto mejora los tiempos de inicio porque se reduce la cantidad de fallas de la página durante el inicio de la app. Para obtener más información sobre el modo en que los perfiles de inicio y las optimizaciones del diseño DEX pueden mejorar los tiempos de inicio de la app, consulta Optimizaciones del diseño DEX y perfiles de inicio.

Comenzar

Para comenzar a optimizar el rendimiento en una app existente, consulta Cómo crear Perfiles de Baseline.

La cadena de dependencias proporciona actualizaciones de versiones estables y en desarrollo. Para generar e instalar un Perfil de Baseline, usa las siguientes versiones compatibles o las posteriores del complemento de Android para Gradle, la biblioteca de Macrobenchmark y el instalador de perfiles. Se necesitan estas dependencias en diferentes momentos y funcionan en conjunto como una cadena de herramientas con el objetivo de habilitar un Perfil de Baseline óptimo.

  • Complemento de Android para Gradle: com.android.tools.build:8.0.0
  • Biblioteca de Macrobenchmark: androidx.benchmark:benchmark-macro-junit4:1.2.3
  • Instalador de perfiles: androidx.profileinstaller:profileinstaller:1.3.1

Recomendamos usar la versión más reciente de AGP para crear y administrar perfiles de Baseline. Estas son las funciones principales que se incluyen con las diferentes versiones de AGP:

Versión de AGP Funciones
8.3
  • Compatibilidad completa con directorios de conjuntos de orígenes (módulos de biblioteca): Declara varios archivos de origen del perfil de Baseline y usa directorios que reconocen variantes, como src/free/generated/baselineProfiles/baseline-prof1.txt, ahora para módulos de biblioteca y de app.
  • Los perfiles de Baseline incluyen clases con expansión de sintaxis.
8.2
  • Reescritura de reglas en R8: D8 y R8 pueden transformar las reglas legibles de Baseline y del perfil de inicio para capturar por completo todas las reglas que necesitas para optimizar el rendimiento de la app. Aumenta la cobertura de métodos del perfil de Baseline en aproximadamente un 30% y aumenta el rendimiento de la app en aproximadamente un 15%.
  • Perfiles de inicio: Generan este nuevo tipo de perfil de Baseline para informar el diseño de código dentro de DEX. Aumenta el rendimiento del inicio en un 15% adicional, o mucho más en el caso de apps grandes.
8.0 Versión mínima recomendada: Usa el complemento de Gradle para el Perfil de Baseline para generar Perfiles de Baseline con una sola tarea de Gradle.
  • Compatibilidad completa con directorios de conjuntos de orígenes (módulos de app): Declara varios archivos de origen del perfil de Baseline y usa directorios con reconocimiento de variantes, como src/free/generated/baselineProfiles/baseline-prof1.txt.
7.4 Versión mínima admitida: Las apps pueden consumir perfiles de Baseline a partir de las bibliotecas y proporcionar su propio perfil de Baseline en el archivo src/main/baseline-prof.txt.
  • Los Perfiles de Baseline se empaquetan correctamente cuando se compila el APK a partir de un paquete de aplicación (error #230361284).
  • En el caso de las apps con más de un archivo .dex, los perfiles de Baseline se empaquetan correctamente para el archivo .dex principal.

Ejemplo de generación de perfiles

A continuación, se muestra una clase de ejemplo para crear un Perfil de Baseline para el inicio de la app, además de varios eventos de navegación y desplazamiento con la biblioteca recomendada de Macrobenchmark.

@OptIn(ExperimentalBaselineProfilesApi::class)
class BaselineProfileGenerator {
    @get:Rule
    val baselineProfileRule = BaselineProfileRule()

    @Test
    fun appStartupAndUserJourneys() {
        baselineProfileRule.collect(packageName = PACKAGE_NAME) {
            // App startup journey.
            startActivityAndWait()

            device.findObject(By.text("COMPOSE LAZYLIST")).clickAndWait(Until.newWindow(), 1_000)
            device.findObject(By.res("myLazyColumn")).also {
                it.fling(Direction.DOWN)
                it.fling(Direction.UP)
            }
            device.pressBack()
        }
    }
}

Puedes ver este código en contexto completo y más detalles como parte de nuestras muestras de rendimiento en GitHub.

Información que debes incluir

Cuando usas perfiles de Baseline en una app, puedes incluir el código de inicio de la app y las interacciones comunes del usuario, como la navegación entre pantallas o el desplazamiento. También puedes recopilar flujos completos, como el registro, el acceso o el pago. Los recorridos del usuario que consideres esenciales pueden beneficiarse de los perfiles de Baseline gracias a que se mejora el rendimiento del entorno de ejecución.

Si experimentas con diferentes enfoques para mejorar el rendimiento, considera incluir Perfiles de Baseline para ambos grupos de tu experimento. De esta manera, te aseguras de que todos los usuarios ejecuten código compilado de manera coherente, lo que facilita la interpretación de los resultados.

Las bibliotecas pueden proporcionar sus propios perfiles de Baseline y enviarlos con los lanzamientos para mejorar el rendimiento de la app. Por ejemplo, consulta la sección Cómo usar una sección de perfil de Baseline en el rendimiento de Jetpack Compose.

Cómo funcionan los Perfiles de Baseline

Mientras desarrollas tu app o biblioteca, procura definir perfiles de Baseline para abarcar interacciones comunes de los usuarios en las que el tiempo de renderización o la latencia resultan importantes. A continuación, se indica cómo funcionan:

  1. Se generan las reglas de perfil legibles por humanos para tu app y se compilan en formato binario en ella. Puedes encontrarlas en assets/dexopt/baseline.prof. Luego, podrás subir el AAB a Google Play como de costumbre.

  2. Google Play procesa el perfil y lo envía directamente a los usuarios junto con el APK. Durante la instalación, ART realiza una compilación anticipada (AOT) de los métodos en el perfil, lo que hace que esos métodos se ejecuten más rápido. Si el perfil contiene métodos usados en el inicio de la app o durante la renderización de fotogramas, el usuario podría experimentar tiempos de inicio más rápidos y menos bloqueos.

  3. Este flujo coopera con la agregación de los perfiles de Cloud para mejorar el rendimiento en función del uso real de la app a lo largo del tiempo.

Figura 1: En este diagrama, se muestra el flujo de trabajo del Perfil de Baseline desde la carga hasta la entrega a usuarios finales y cómo se relaciona ese flujo de trabajo con los perfiles de Cloud.

Perfiles de Cloud

Los perfiles de Cloud ofrecen una forma adicional de optimización guiada por perfil (PGO), agregada por Google Play Store y distribuida para la compilación en el momento de la instalación, junto con los Perfiles de Baseline.

Si bien las interacciones reales del usuario con la app controlan los perfiles de Cloud, estas tardan varias horas o días después de una actualización en distribuirse, lo que limita su disponibilidad. Hasta que los perfiles estén completamente distribuidos, el rendimiento de la app será poco óptimo para los usuarios de apps nuevas o actualizadas. Además, los perfiles de Cloud solo admiten dispositivos Android que ejecutan Android 9 (nivel de API 28) o versiones posteriores, y solo hacen un escalamiento correcto para apps que tienen una base de usuarios lo suficientemente grande.

Comportamiento de la compilación en las versiones de Android

Las versiones de la plataforma de Android usan diferentes enfoques de compilación de apps, cada uno con una compensación de rendimiento correspondiente. Los Perfiles de Baseline mejoran los métodos de compilación anteriores, ya que proporcionan un perfil para todas las instalaciones.

Versión de Android Método de compilación Enfoque de optimización
De 5 a 6 (nivel de API 21 a 23) AOT completa Toda la app se optimiza durante la instalación, lo que acorta los tiempos de espera para usarla, aumenta el uso de espacio en el disco y la memoria RAM, y aumenta los tiempos de carga de código desde el disco, lo que puede aumentar el tiempo de inicio en frío.
De 7 a 8.1 (nivel de API 24 a 27) AOT parcial (perfil de Baseline) androidx.profileinstaller instala los Perfiles de Baseline en la primera ejecución, cuando el módulo de la app define esta dependencia. ART puede mejorar aún más esta función agregando más reglas de perfil durante el uso de la app y compilándolas cuando el dispositivo esté inactivo. Esto optimiza el espacio en el disco y el tiempo de carga de código desde el disco, lo que reduce el tiempo de espera para la app.
9 (nivel de API 28) y versiones posteriores AOT parcial (perfil de Baseline + Cloud) Play usa los Perfiles de Baseline durante las instalaciones de apps para optimizar los APKs y los perfiles de Cloud (si están disponibles). Después de la instalación, los perfiles de ART se suben a Play, se agregan y, luego, se proporcionan como perfiles de Cloud a otros usuarios cuando instalan o actualizan la app.

Errores conocidos

A continuación, se muestran posibles problemas y soluciones, o problemas para los que aún se están desarrollando soluciones alternativas:

  • La generación de perfiles de Baseline no es compatible con los dispositivos de Firebase Test Lab, incluidos los dispositivos de Test Lab administrados por Gradle (problema #285187547).

  • Para proporcionar perfiles de Baseline para bibliotecas correctamente, usa el complemento de Gradle para perfiles de Baseline 1.2.3 o AGP 8.3, como mínimo (problema #313992099).

  • Si generas perfiles de Baseline con el comando ./gradlew app:generateBaselineProfile, también se ejecutan las comparativas del módulo de prueba y se descartan los resultados. Si esto sucede, solo puedes generar los perfiles de Baseline mediante la ejecución del comando con -P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile. Se solucionó este problema en AGP 8.2.

  • El comando para generar perfiles de Baseline para todos los tipos de compilación (./gradlew app:generateBaselineProfile) solo genera perfiles de Baseline para el tipo de compilación de lanzamiento. Se corrigió este problema en AGP 8.1.

  • Es posible que los canales de distribución de apps que no sean de Google Play Store no admitan el uso de Perfiles de Baseline en la instalación. Los usuarios de apps instaladas a través de estos canales no verán los beneficios hasta que se ejecute el dexopt en segundo plano (que sucede probablemente por la noche).

  • El uso compartido interno de apps de Play Store no admite los perfiles de Baseline. Sin embargo, el segmento de pruebas internas sí lo hace.

  • Las optimizaciones de batería en algunos dispositivos, como los de Huawei, pueden interferir en la instalación de perfiles. Para asegurarte de que tus perfiles se instalen de manera efectiva, inhabilita las optimizaciones de la batería en tus dispositivos de comparativas.

Recursos adicionales