Para brindar la mejor experiencia del usuario, debes optimizar tu app para que sea lo más pequeña y rápida posible. Nuestro optimizador de apps, llamado R8, optimiza tu app quitando el código y los recursos sin usar, reescribiendo el código para optimizar el rendimiento del tiempo de ejecución y mucho más. Para tus usuarios, esto significa lo siguiente:
- Iniciar la app más rápido
- Menos uso de memoria
- Mejora del rendimiento de la renderización y del tiempo de ejecución
- Menos ANR
Descripción general de la optimización de R8
R8 usa un proceso de varias fases para optimizar tu app en cuanto a tamaño y velocidad. Las operaciones clave incluyen lo siguiente:
Reducción de código (también conocida como eliminación de código no utilizado): R8 identifica y quita el código inaccesible de tu aplicación y sus dependencias de biblioteca. Mediante el análisis de los puntos de entrada de tu app (como
ActivitiesoServicesdefinidos en el manifiesto), R8 compila un gráfico de código al que se hace referencia y quita todo lo que no se haga referencia.Optimizaciones lógicas: R8 reescribe tu código para mejorar la eficiencia de la ejecución y reducir la sobrecarga. Las técnicas clave incluyen lo siguiente:
Inserción de métodos: R8 reemplaza un sitio de llamada de método con el cuerpo real del método llamado. Esto elimina la sobrecarga de una llamada a función y permite que R8 realice más optimizaciones.
Combinación de clases: R8 combina conjuntos de clases e interfaces en una sola clase. Esto reduce la cantidad de clases en la app, disminuye la presión de la memoria y mejora la velocidad de inicio.
Ofuscación (también conocida como minimización): Para reducir el tamaño del archivo DEX , R8 acorta los nombres de las clases, los campos y los métodos (por ejemplo,
com.example.MyActivitypodría convertirse ena.b.a).
Desde la versión 8.12.0 del complemento de Android para Gradle (AGP), R8 también optimiza los recursos como parte de sus fases de optimización. Para obtener más información, consulta Reducción de recursos optimizada.
Habilita la optimización
Para habilitar la optimización de la app, establece isMinifyEnabled = true (para la optimización de código)
y isShrinkResources = true (para la optimización de recursos) en la secuencia de comandos de compilación a nivel de la app de tu compilación de lanzamiento
build's, como se muestra en el siguiente código. Te recomendamos que siempre habilites ambos parámetros de configuración. También te recomendamos que habilites la optimización de la app solo en la versión final de la app que pruebes antes de publicarla (por lo general, la compilación de lanzamiento), ya que las optimizaciones aumentan el tiempo de compilación de tu proyecto y pueden dificultar la depuración debido a la forma en que modifica el código.
Kotlin
android { buildTypes { release { // Enables code-related app optimization. isMinifyEnabled = true // Enables resource shrinking. isShrinkResources = true proguardFiles( // Default file with automatically generated optimization rules. getDefaultProguardFile("proguard-android-optimize.txt"), ... ) ... } } ... }
Groovy
android { buildTypes { release { // Enables code-related app optimization. minifyEnabled = true // Enables resource shrinking. shrinkResources = true // Default file with automatically generated optimization rules. proguardFiles getDefaultProguardFile('proguard-android-optimize.txt') ... } } }
Optimiza la reducción de recursos para apps aún más pequeñas
La versión 8.12.0 del complemento de Android para Gradle (AGP) presenta la reducción de recursos optimizada, cuyo objetivo es integrar la optimización de recursos y código para crear apps aún más pequeñas y rápidas.
Antes de la reducción de recursos optimizada, Android Asset Packaging Tool (AAPT2) generaba reglas de conservación que trataban de manera efectiva la reducción de recursos por separado del código, y, a menudo, retenían código o recursos inaccesibles que se hacían referencia entre sí.
Con la reducción de recursos optimizada, los recursos se consideran como parte del código del programa, lo que forma el gráfico de referencia. Cuando no se hace referencia a una colección de código o recursos, no está protegida por una regla de conservación y se puede quitar.
Habilita la reducción de recursos optimizada
Para habilitar la nueva canalización de reducción de recursos optimizada para AGP 8.12 o 8.13, agrega lo siguiente al archivo gradle.properties de tu proyecto:
android.r8.optimizedResourceShrinking=true
Si usas AGP 9.0.0 o una versión posterior, no necesitas establecer android.r8.optimizedResourceShrinking=true. La reducción de recursos optimizada se aplica automáticamente cuando isShrinkResources = true está habilitada en la configuración de compilación.
Verifica y configura los parámetros de configuración de optimización de R8
Para habilitar R8 para que use sus capacidades de optimización completas, quita la
siguiente línea del archivo gradle.properties de tu proyecto, si existe:
android.enableR8.fullMode=false # Remove this line from your codebase.
Ten en cuenta que habilitar la optimización de la app dificulta la comprensión de los seguimientos de pila, en especial si R8 cambia el nombre de las clases o los métodos. Para obtener seguimientos de pila que correspondan correctamente a tu código fuente, consulta Recupera el seguimiento de pila original.
Si R8 está habilitado, también debes crear perfiles de inicio para obtener un rendimiento de inicio aún mejor.
Si habilitas la optimización de la app y esta causa errores, estas son algunas estrategias para corregirlos:
- Agrega reglas de conservación para mantener intacto parte del código.
- Adopta optimizaciones de forma incremental.
- Actualiza tu código para usar bibliotecas que sean más adecuadas para la optimización.
Si te interesa optimizar la velocidad de compilación, consulta Configura cómo se ejecuta R8 para obtener información sobre cómo configurar R8 según tu entorno.
Mejora la optimización de R8
Los beneficios de rendimiento de R8 se correlacionan directamente con la cantidad de tu base de código que R8 puede optimizar. Para obtener los máximos beneficios de R8, habilita R8 en modo completo y refina las reglas de conservación para permitir la optimización máxima de clases, campos y métodos.Para ayudarte con esto, usa el Analizador de configuración de R8.
El Analizador de configuración de R8 te permite hacer lo siguiente:
- Supervisar las métricas que proporciona el informe del Analizador de configuración de R8 para hacer un seguimiento de la calidad general de la configuración de R8 y mejorarla
- Encontrar las reglas de conservación más amplias (aquellas que impiden la mayor optimización)
- y comprender qué optimización impiden para refinarlas
El Analizador de configuración de R8 está disponible en la versión 9.3.0-alpha05 de AGP o en la versión 9.3.7-dev de R8. Para obtener más información, consulta Analiza la configuración de R8.
Cambios en el comportamiento de las versiones de AGP y R8
En la siguiente tabla, se describen las funciones clave que se introdujeron en varias versiones del complemento de Android para Gradle (AGP) y el compilador R8.
| Versión de AGP | Funciones introducidas |
|---|---|
| 9.1 |
Clases reempaquetadas de forma predeterminada: R8 reempaqueta las clases (las mueve al paquete sin nombre, en el nivel superior) para compactar aún más DEX, lo que elimina la necesidad de especificar la opción -repackageclasses. Para obtener información sobre cómo funciona y cómo inhabilitarla, consulta las opciones globales.
|
| 9.0 |
Reducción de recursos optimizada: Habilitada de forma predeterminada (controlada con android.r8.optimizedResourceShrinking). La reducción de recursos optimizada ayuda a integrar la reducción de recursos con la canalización de optimización de código, lo que genera apps más pequeñas y rápidas. Al optimizar las referencias de código y recursos de forma simultánea, identifica y quita los recursos a los que se hace referencia exclusivamente desde el código sin usar. Esta es una mejora significativa con respecto a los procesos de optimización separados anteriores.Esto es especialmente útil para las apps que comparten recursos y código sustanciales en diferentes verticales de factores de forma, con mejoras medidas de más del 50% en el tamaño de la app. La reducción de tamaño resultante genera descargas más pequeñas, instalaciones más rápidas y una mejor experiencia del usuario con un inicio más rápido, una renderización mejorada y menos ANR. Filtrado de reglas de biblioteca: Se quitó la compatibilidad con las opciones globales (por ejemplo, -dontobfuscate) en las reglas de consumidor de biblioteca, y las apps las filtrarán. Para obtener más información, consulta Agrega opciones globales.Verificaciones de nulos de Kotlin: Optimizadas de forma predeterminada (controladas con -processkotlinnullchecks). Esta versión también introdujo mejoras significativas en la velocidad de compilación. Para obtener más información, consulta Opciones globales para optimización adicional.Optimiza paquetes específicos: Puedes usar packageScope para optimizar paquetes específicos. Esto se encuentra en asistencia experimental. Para obtener más información, consulta Optimiza paquetes especificados con packageScope.Optimizadas de forma predeterminada: Se quitó la compatibilidad con getDefaultProguardFile("proguard-android.txt"), ya que incluye -dontoptimize, que se debe evitar. En su lugar, usa "proguard-android-optimize.txt". Si necesitas inhabilitar la optimización de forma global en tu app, agrega la marca manualmente a un archivo ProGuard.
|
| 8.12 |
Reducción de recursos optimizada: Se agregó la compatibilidad inicial (controlada con android.r8.optimizedResourceShrinking). La reducción de recursos optimizada ayuda a integrar la reducción de recursos con la canalización de optimización de código. Debes habilitarla de forma manual en esta versión de AGP.Retrazado de Logcat: Compatibilidad con el retrazado automático en la ventana Logcat de Android Studio. |
| 8.6 |
Retrazado mejorado: Incluye el retrazado del nombre de archivo y el número de línea de forma predeterminada para todos los niveles de minSdk (anteriormente, se requería minSdk 26+ en la versión 8.2).Actualizar R8 ayuda a garantizar que los seguimientos de pila de las compilaciones ofuscadas sean fáciles y claros de leer. Esta versión mejora la forma en que se asignan los números de línea y los archivos fuente, lo que facilita que herramientas como Logcat de Android Studio vuelvan a trazar automáticamente las fallas al código fuente original. |
| 8.0 |
Modo completo de forma predeterminada: El modo completo de R8 proporciona una optimización mucho más potente. Se activa de manera predeterminada. Puedes inhabilitarlo con android.enableR8.fullMode=false.
|
| 7.0 |
Modo completo disponible: Se introdujo como una función de participación con android.enableR8.fullMode=true. El modo completo aplica optimizaciones más potentes haciendo suposiciones más estrictas sobre cómo tu código usa la reflexión y otras funciones dinámicas. Si bien reduce el tamaño de la app y mejora el rendimiento, es posible que requiera reglas de conservación adicionales para evitar que se quite el código necesario.
|