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 errores de ANR
Descripción general de la optimización de R8
R8 usa un proceso de varias fases para optimizar el tamaño y la velocidad de tu app. Las operaciones clave incluyen las siguientes:
Reducción de código (también conocida como eliminación de código obsoleto): 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 vuelve a escribir tu código para mejorar la eficiencia de la ejecución y reducir la sobrecarga. Las técnicas clave incluyen las siguientes:
Inlining de métodos: R8 reemplaza un sitio de llamada a un método por 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, 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, establece isMinifyEnabled = true (para la optimización del código) y isShrinkResources = true (para la optimización de recursos) en la secuencia de comandos de compilación de la versión de lanzamiento a nivel de la app, como se muestra en el siguiente código. Te recomendamos que siempre habilites ambos parámetros de configuración. También recomendamos habilitar la optimización de la app solo en la versión final 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.
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 que las apps sean aún más pequeñas
La versión 8.12.0 del complemento de Gradle para Android (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 activar la nueva canalización optimizada de reducción de recursos para una versión del AGP anterior a la 9.0.0, 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 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:
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 causa 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.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 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 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: Se agregó compatibilidad inicial (desactivada de forma predeterminada). Habilita el uso de isShrinkResources). La reducción de recursos funciona en conjunto con R8 para identificar y quitar los recursos sin usar de manera eficaz.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. 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.
|