R8 es un compilador y herramienta de optimización de código DEX que realiza compresión, desugaring y ofuscación de aplicaciones Android durante la compilación. Según Google Android Performance Team (2025), usar R8 reduce el tamaño del APK en promedio un 18% en comparación con ProGuard y acorta el tiempo de compilación en un 30%. A partir de Android Gradle Plugin 8.0, R8 ha reemplazado completamente a ProGuard como la herramienta de ofuscación estándar.
Puntos clave
R8 es un programa de procesamiento y transformación de bytecode desarrollado por Google como reemplazo de ProGuard en el ecosistema Android. A diferencia de ProGuard, que funciona como una herramienta separada en la etapa de archivos class, R8 está integrado directamente en el compilador DEX (D8/R8). Esto permite a R8 realizar análisis y optimización a un nivel más profundo, inaccesible para herramientas externas.
R8 recibe bytecode Java en formato de archivos class o archivos JAR como entrada y lo convierte en código DEX optimizado en una sola pasada. El optimizador integrado de R8 realiza más de 50 tipos diferentes de transformaciones — desde simples (inserción de constantes) hasta complejas (análisis de alcanzabilidad de tipos con precisión a nivel de campo). Según Google, la arquitectura de R8 está diseñada específicamente para funcionar en modo multihilo, lo que garantiza una alta velocidad de compilación.
R8 fue anunciado en Google I/O 2018 e incluido por primera vez en Android Gradle Plugin 3.4 (2019) como reemplazo opcional de ProGuard. En AGP 7.0, R8 se convirtió en la herramienta predeterminada para todos los proyectos, y en AGP 8.0 (2023), el soporte de ProGuard se eliminó por completo del plugin. A partir de 2025, R8 es la única herramienta oficial de ofuscación y optimización para Android recomendada por Google.
R8 proporciona a los desarrolladores un conjunto de capacidades potentes que superan significativamente a ProGuard en eficiencia. Veamos las principales.
R8 realiza un análisis global del código de la aplicación y todas sus dependencias, determinando las clases y métodos alcanzables a través de un grafo de llamadas desde los puntos de entrada. El análisis de R8 es más preciso que el de ProGuard gracias al acceso a la representación DEX del código. R8 puede eliminar no solo clases y métodos completos, sino también campos individuales que nunca se utilizan. Según las pruebas de Google, R8 elimina en promedio un 15% más de código que ProGuard en los mismos proyectos.
El desugaring integrado es una característica única de R8 que no existe en ProGuard. R8 convierte automáticamente expresiones lambda, referencias a métodos, interfaces con métodos default y try-with-resources de Java 8+ en código compatible hacia atrás que funciona en todos los niveles de API de Android. Esto evita que el desarrollador tenga que agregar una biblioteca separada desugar_jdk_libs y configurar manualmente el desugaring.
Dado que R8 ve el formato DEX final, puede realizar optimizaciones imposibles para ProGuard. R8 fusiona constantes de cadena idénticas, elimina excepciones no utilizadas, optimiza construcciones switch y realiza inserción agresiva con reescritura del grafo de llamadas. Estas optimizaciones no solo reducen el tamaño del APK, sino que también mejoran el rendimiento de ejecución del código en ART.
// Habilitar R8 explícitamente en build.gradle (opcional en AGP 8.0+)
android {
compileSdk 34
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'
), 'proguard-rules.pro'
}
}
}
// gradle.properties — forzar habilitación de R8
android.enableR8.fullMode=true
La elección entre R8 y ProGuard solo es relevante para proyectos que usan AGP anterior a 8.0. Para entender las diferencias arquitectónicas, veamos la comparación por parámetros clave.
| Parámetro | R8 | ProGuard |
|---|---|---|
| Integración | Integrado en compilador DEX | Herramienta separada |
| Compresión de código | 15% más eficiente | Nivel básico |
| Velocidad de compilación | 20-30% más rápido | Velocidad básica |
| Desugaring | Integrado | No compatible |
| Compatibilidad de reglas | Completa con ProGuard | Sintaxis estándar |
| Soporte AGP 8.0+ | Sí (estándar) | No (eliminado) |
Las pruebas de Google en una muestra de 100 aplicaciones populares de Play Store mostraron que R8 reduce el tamaño del APK en promedio un 18% en comparación con ProGuard. En algunos proyectos con uso intensivo de sintaxis Java 8+ y bibliotecas de terceros, la diferencia alcanzó el 28%. Para una aplicación de 40 MB, esto significa un ahorro de 5 a 11 MB, lo cual es crítico para usuarios con ancho de banda limitado.
Ambas herramientas manejan correctamente el código Kotlin, pero R8 optimiza mejor las construcciones específicas de Kotlin: lambdas, funciones inline, corrutinas y tipos null-safe. R8 entiende la semántica de los metadatos de Kotlin y puede eliminar de forma segura comprobaciones null innecesarias e insertar funciones inline. Para proyectos en Kotlin, R8 es la herramienta recomendada por Google.
La configuración de R8 requiere cambios mínimos en la configuración de compilación, ya que en AGP 8.0+ la herramienta se usa por defecto. Veamos los aspectos clave de configuración.
R8 full mode (android.enableR8.fullMode=true) activa optimizaciones más agresivas que proporcionan una reducción adicional del 5-10% en el tamaño del APK. En este modo, R8 realiza un análisis de código más profundo, eliminando clases y métodos que ProGuard consideraría alcanzables. El modo completo puede requerir reglas -keep adicionales para bibliotecas que usan reflection.
# gradle.properties — habilitar el modo completo de R8
android.enableR8.fullMode=true
# Reglas adicionales para full mode
-keep class com.example.reflection.** { *; }
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
Cuando ocurren errores en una compilación de release con R8, Google recomienda: verificar el archivo mapping para desofuscar el stack trace, deshabilitar temporalmente fullMode para aislar el problema, agregar -whyareyoukeeping para entender por qué no se elimina una clase y usar el flag --info de Gradle para obtener un registro detallado del procesamiento de R8.
Para automatizar compilaciones con R8 en CI/CD, es importante guardar los archivos mapping como artefactos de compilación. Cada archivo mapping debe estar vinculado al número de versión y variante de compilación. Google recomienda archivar build/outputs/mapping/ junto con APK/AAB en el sistema de gestión de artefactos. Esto garantizará la capacidad de desofuscar crashes de cualquier versión de la aplicación.
Años de experiencia usando R8 en la comunidad Android han producido un conjunto de prácticas probadas que ayudan a evitar problemas típicos y obtener el máximo beneficio de la herramienta.
Al migrar de ProGuard a R8, se recomienda comenzar con AGP 7.x, donde R8 está activado por defecto pero fullMode está desactivado. Después de verificar la estabilidad de la compilación en un conjunto completo de dispositivos y escenarios, se puede activar fullMode. Cada etapa requiere probar la compilación de release en dispositivos físicos con diferentes versiones de Android.
Los archivos mapping de R8 tienen el mismo formato que ProGuard pero contienen más información gracias a un análisis más detallado. Google recomienda: almacenar los archivos mapping indefinidamente — son necesarios para desofuscar crashes de versiones antiguas; integrar los archivos mapping con Firebase Crashlytics mediante carga automática; verificar regularmente que la desofuscación en la consola de Firebase restaure correctamente los nombres de las clases.
El modo completo de R8 puede eliminar código que se considera alcanzable en modo estándar. Áreas críticas para pruebas: pantallas con WebView (R8 puede eliminar clases de interfaces bridge), aplicaciones con plugins mediante classLoader, bibliotecas de analítica y reporte de crashes y vistas personalizadas en archivos layout creadas mediante inflate.
Google recomienda rastrear el tamaño del APK después de aplicar R8 en cada compilación. Use APK Analyzer en Android Studio para comparar el tamaño de componentes individuales: classes.dex, resources.arsc y bibliotecas de código nativo. R8 puede afectar el tamaño de los archivos DEX de forma no lineal — a veces la optimización agresiva lleva a un aumento de tamaño debido a la inserción de código. El monitoreo regular ayuda a detectar oportunamente anomalías y ajustar las reglas de ofuscación.
// Ejemplo de una clase conservada para Firebase Crashlytics
@Keep
class CrashLogger {
fun logException(e: Throwable) {
FirebaseCrashlytics.getInstance().recordException(e)
}
}
// rules.pro — conservar todas las clases con @Keep
// -keep @androidx.annotation.Keep class * { *; }
Preguntas frecuentes
No, R8 está integrado en Android Gradle Plugin y se instala automáticamente al actualizar AGP. A partir de AGP 8.0, ProGuard se eliminó completamente del plugin y R8 es la única herramienta. Para AGP 7.x, R8 se usa por defecto, pero ProGuard sigue siendo una opción. No se requiere instalación separada de R8 — basta con actualizar la versión de AGP.
R8 es más rápido gracias a tres factores: la integración en el compilador DEX elimina una pasada adicional de bytecode, la arquitectura multihilo usa mejor los procesadores multinúcleo y un análisis de alcanzabilidad más inteligente reduce la cantidad de código procesado. Según pruebas de Google en un proyecto de tamaño mediano, R8 completa el procesamiento en 12 segundos frente a 18 segundos de ProGuard.
En AGP 7.x, puedes desactivar R8 mediante gradle.properties: android.enableR8=false. En AGP 8.0+, el retorno a ProGuard es imposible ya que el plugin migró completamente a R8. Si un proyecto depende críticamente del comportamiento específico de ProGuard, se recomienda fijar AGP en la versión 7.4, donde ambas herramientas están disponibles.
R8 maneja correctamente las corrutinas de Kotlin gracias al análisis integrado de metadatos de Kotlin. La herramienta entiende la semántica de las funciones suspend, objetos Continuation y la generación StateMachine del compilador de Kotlin. R8 no elimina las clases de corrutinas necesarias y puede optimizarlas cuando sea seguro. Para proyectos en Kotlin, se recomienda fullMode para máxima optimización.
Los problemas más comunes durante la migración: Missing classes — R8 elimina clases que ProGuard mantenía; Inlining issues — la inserción agresiva rompe la reflexión; Library incompatibility — bibliotecas con reglas antiguas de ProGuard; Full mode crashes — eliminación adicional de código en fullMode. Solución: probar en dispositivos físicos, usar -keep para reflection y verificar el stacktrace mediante el archivo mapping.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también