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 que no se usan, 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
- Uso de memoria reducido
- Mejoras en el rendimiento del tiempo de ejecución y la renderizació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 las siguientes:
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. Al analizar los puntos de entrada de tu app (como
ActivitiesoServicesdefinidos en el manifiesto), R8 compila un gráfico del código al que se hace referencia y quita todo lo que no se referencia.Optimizaciones lógicas: R8 reescribe tu código para mejorar la eficiencia de la ejecución y reducir la sobrecarga. Algunas técnicas clave son las siguientes:
Intercalación de métodos: R8 reemplaza un sitio de llamada de método por el cuerpo real del método llamado. Esto elimina la sobrecarga de una llamada a la 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, lo que disminuye la presión de la memoria y mejora la velocidad de inicio.
Ofuscación (también conocida como reducció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, usa el DSL adecuado según la versión del AGP de tu proyecto. 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 del proyecto y pueden dificultar la depuración debido a la forma en que modifican el código.
Para versiones del AGP 9.3 y posteriores
Para habilitar la optimización de la app para AGP 9.3 y versiones posteriores, haz lo siguiente:
- Establece
enable = trueen el bloqueoptimizationdel archivo de compilación a nivel de la app de la compilación de lanzamiento. - Agrega tus reglas de conservación a un archivo con el sufijo
.keepen el conjunto de orígenessrc/<variant>/keepRules. Por ejemplo,src/main/keepRules/custom-rules.keep
Kotlin
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
Groovy
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
DSL heredado para versiones de AGP anteriores a la 9.3
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 el script de compilación a nivel de la app de tu compilación de lanzamiento. Te recomendamos que siempre habilites ambos parámetros de configuración.
DSL heredado (Kotlin)
android {
buildTypes {
release {
// Enables code optimizations.
isMinifyEnabled = true
// Enables resource shrinking.
isShrinkResources = true
proguardFiles(
// Default file with automatically generated optimization rules.
getDefaultProguardFile("proguard-android-optimize.txt"),
...
)
...
}
}
...
}
DSL heredada (Groovy)
android {
buildTypes {
release {
// Enables code optimizations.
minifyEnabled = true
// Enables resource shrinking.
shrinkResources = true
// Default file with automatically generated optimization rules.
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
...
}
}
}
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 aprovechar al máximo los beneficios de R8, sigue estas prácticas recomendadas:
- Habilita R8 en el modo completo
- Habilita la ofuscación, la optimización y la reducción
- Habilita la reducción de recursos y la reducción de recursos optimizada
- Define mejor las reglas de conservación para permitir la optimización máxima de clases, campos y métodos.
Para ayudarte a definir mejor las reglas de conservación, usa el Analizador de configuración de R8.
El Analizador de configuración de R8 te permite hacer lo siguiente:
- Supervisa 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.
- Encuentra las reglas de conservación más amplias, es decir, las que impiden la mayor cantidad de optimizaciones.
- y comprender qué optimización impiden para refinarlos.
El Analizador de configuración de R8 está disponible en la versión 9.3.0-alpha05 del AGP o en la versión 9.3.7-dev de R8. Para obtener más información, consulta Cómo analizar la configuración de R8.
Optimiza la reducción de recursos para que las apps sean aún más pequeñas
La versión 8.12.0 de AGP introduce 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 la reducción de recursos de forma independiente del código, lo que a menudo conservaba código o recursos inaccesibles que se referenciaban 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 optimizada de reducción de recursos para AGP 8.12 o 8.13, agrega lo siguiente al archivo gradle.properties de tu proyecto:
Si usas AGP 9.0.0 o una versión posterior, no necesitas configurar android.r8.optimizedResourceShrinking=true. La reducción de recursos optimizada se aplica automáticamente cuando isShrinkResources = true está habilitado 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:
bash 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 los nombres de las clases o los métodos. Para obtener seguimientos de pila que correspondan correctamente a tu código fuente, consulta Cómo recuperar 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 genera errores, estas son algunas estrategias para corregirlos:
- Agrega reglas de conservación para mantener intacto parte del código.
- Adopta las optimizaciones de forma incremental.
- Actualiza tu código para usar bibliotecas más adecuadas para la optimización.
Si te interesa optimizar la velocidad de compilación, consulta Cómo configurar la ejecución de R8 para obtener información sobre cómo configurar R8 según tu entorno.
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 presentadas |
|---|---|
| 9.3 |
DSL simplificado: El nuevo bloque `optimization {}` requiere menos configuración. La reducción de recursos optimizada siempre está habilitada y las reglas de conservación predeterminadas de Android son opcionales.
Conjunto de orígenes`keepRules`: Si usas el nuevo DSL, debes colocar tus reglas de conservación en el conjunto de orígenes src/<variant>/keepRules, en archivos con el sufijo .keep. Los conjuntos de fuentes también son compatibles con el DSL heredado.
Reglas de consumo de KMP (Kotlin Multiplatform): KMP ya no requiere la configuración de publish = true y admite el conjunto de orígenes src/<variant>/keepRules con la extensión .keep.
Ten en cuenta que el DSL heredado aún se admite. |
| 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 el DEX, lo que elimina la necesidad de especificar la opción -repackageclasses. Para obtener información sobre cómo funciona y cómo inhabilitar esta opción, consulta Opciones globales.
|
| 9.0 |
Reducción de recursos optimizada: Está habilitada de forma predeterminada (se controla 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 importantes 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 errores de ANR. Filtrado de reglas de biblioteca: Se quitó la compatibilidad con las opciones globales (por ejemplo, -dontobfuscate) en las reglas de consumidor de la biblioteca, y las apps las filtrarán. Para obtener más información, consulta Cómo agregar opciones globales.Verificaciones de nulos de Kotlin: Se optimizan de forma predeterminada (se controlan 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 una optimización adicional.Optimiza paquetes específicos: Puedes usar packageScope para optimizar paquetes específicos. Esta función se encuentra en fase de compatibilidad experimental. Para obtener más información, consulta Cómo optimizar paquetes especificados con packageScope.Optimizado 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 de forma manual a un archivo de ProGuard.
|
| 8.12 |
Reducción de recursos optimizada: Se agregó 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 habilitarlo manualmente en esta versión de AGP.Retrazado de Logcat: Compatibilidad con el retrazado automático en la ventana de Logcat de Android Studio |
| 8.6 |
Mejora del rastreo inverso: Incluye el rastreo inverso 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 o superior en la versión 8.2).La actualización de R8 ayuda a garantizar que los seguimientos de pila de las compilaciones ofuscadas sean fáciles de leer y estén disponibles. 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 rastrear automáticamente las fallas hasta el código fuente original. |
| 8.0 |
Modo completo predeterminado: El modo completo de R8 proporciona una optimización mucho más potente. Se activa de manera predeterminada. Puedes inhabilitar la función con android.enableR8.fullMode=false.
|
| 7.0 |
Modo completo disponible: Se introdujo como una función opcional con android.enableR8.fullMode=true. El modo completo aplica optimizaciones más potentes, ya que realiza 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.
|