Cómo Reddit usó el optimizador R8 para lograr mejoras de rendimiento de alto impacto
Lectura de 4 min
En el mundo actual de las aplicaciones para dispositivos móviles, una experiencia del usuario fluida no es solo una función, sino una necesidad. Los tiempos de carga lentos, las interfaces que no responden y la inestabilidad pueden ser barreras significativas para la participación y la retención de los usuarios. Durante su trabajo con el equipo de Relaciones con los desarrolladores de Android, el equipo de ingeniería de Reddit usó el nivel de rendimiento de la app para evaluar su app. Después de evaluar su rendimiento, identificaron un potencial de mejora significativo y decidieron tomar las medidas necesarias para aprovechar al máximo R8, el optimizador de apps para Android. Esta iniciativa enfocada generó mejoras notables en los tiempos de inicio, reducciones en los fotogramas lentos o congelados y en los errores de ANR, y un aumento general en las calificaciones de Play Store. En este caso de éxito, se explica cómo Reddit logró estos impresionantes resultados.
Cómo ayudó el optimizador R8 a Reddit
El optimizador de R8 es una herramienta fundamental para la optimización del rendimiento en Android. Mejorar el rendimiento de la app requiere varios pasos.Veamos rápidamente los más importantes.
- La eliminación de código no utilizado es el paso más importante para reducir el tamaño de una app. Aquí se quita el código sin usar de las dependencias de la app y de la app en sí.
- La inserción de métodos reemplaza las llamadas a métodos con el código real, lo que hace que la app tenga un mejor rendimiento.
- Se aplica la combinación de clases y otras estrategias para que el código sea más compacto. En este punto, ya no se trata de la legibilidad del código fuente para los humanos, sino de hacer que el código compilado funcione rápido. Por lo tanto, las abstracciones, como las interfaces o las jerarquías de clases, no son importantes aquí y se quitarán.
- La minificación de identificadores cambia los nombres de las clases, los campos y los métodos por nombres más cortos y sin significado. Por lo tanto, en lugar de
MyDataModel, es posible que termines con una clase llamada a. - La reducción de recursos quita los recursos que no se usan, como los archivos XML y los elementos de diseño, para reducir aún más el tamaño de la app.
Etapas principales de la optimización de R8
De los datos concretos a la satisfacción del usuario: cómo identificar el éxito en la producción
Reddit observó mejores resultados de rendimiento inmediatamente después de que se lanzó una nueva versión de la app para los usuarios. Con Android Vitals y Crashlytics, Reddit pudo capturar métricas de rendimiento en dispositivos reales con usuarios reales, lo que le permitió comparar el nuevo lanzamiento con las versiones anteriores.
Cómo R8 mejoró el rendimiento de la app de Reddit
El equipo observó un inicio en frío un 40% más rápido, una reducción del 30% en los errores de "Aplicación no responde" (ANR), una mejora del 25% en la renderización de fotogramas y una reducción del 14% en el tamaño de la app.
Estas mejoras son fundamentales para la satisfacción del usuario. Un inicio más rápido significa menos espera y acceso más rápido al contenido. Una menor cantidad de errores de ANR genera una app más estable y confiable, lo que reduce la frustración de los usuarios. La renderización de fotogramas más fluida elimina el bloqueo de la IU, lo que hace que el desplazamiento y las animaciones se sientan fluidos y responsivos. Este impacto técnico positivo también se observó claramente en la opinión de los usuarios.
Los indicadores de satisfacción del usuario sobre el éxito de la optimización se podían ver directamente en Google Play Store. Después del lanzamiento de la versión optimizada para R8, el equipo observó un cambio drástico y positivo en la opinión y la participación de los usuarios.
Drew Heavner: "Habilitar la herramienta de potencial completo de R8 en menos de 2 semanas"
Lo más impresionante es que esto se logró con un esfuerzo concentrado. Drew Heavner, ingeniero de software del personal de Reddit que trabajó en esta iniciativa, señaló que la implementación de los cambios para aprovechar todo el potencial de R8 llevó menos de dos semanas.
Confirmación de las ganancias: Un análisis detallado con macrobenchmarks
Después de observar las significativas mejoras en el mundo real, el equipo de ingeniería de Reddit y el equipo de Relaciones con Desarrolladores de Android de Google realizaron comparativas detalladas para confirmar científicamente las ganancias y experimentar con más optimizaciones. Para este análisis, el equipo de ingeniería de Reddit proporcionó dos versiones de su app: una sin optimizaciones y otra que aplicó R8 y dos herramientas más fundamentales de optimización del rendimiento: perfiles de Baseline y perfiles de inicio.
Los perfiles de Baseline trasladan de manera eficaz los pasos de compilación Just in Time (JIT) de los dispositivos de los usuarios a las máquinas de los desarrolladores. Se demostró que el código compilado con anticipación (AOT) generado reduce el tiempo de inicio y los problemas de renderización.
Cuando se empaqueta una app, el dexer d8 toma clases y métodos, y construye los archivos classes.dex de la app. Cuando un usuario abre la app, se cargan estos archivos dex, uno tras otro, hasta que se puede iniciar la app. Si proporcionas un perfil de inicio, le indicas a d8 qué clases y métodos debe empaquetar en los primeros archivos classes.dex. Esta estructura permite que la app cargue menos archivos, lo que, a su vez, mejora la velocidad de inicio.
Jetpack Macrobenchmark fue la herramienta principal para esta fase, ya que permitió medir con precisión las interacciones del usuario en un entorno controlado. Para simular el recorrido típico de un usuario, usaron la API de UIAutomator para crear una prueba que abriera la app, se desplazara hacia abajo tres veces y, luego, volviera a desplazarse hacia arriba.
Al final, lo único que se necesitó para escribir la comparativa fue lo siguiente:
uiAutomator {
startApp(REDDIT)
repeat(3) {
onView { isScrollable }.fling(Direction.DOWN) }
repeat(3) {
onView {isScrollable }.fling(Direction.UP)
}
}Los datos de referencia confirmaron las observaciones de campo y proporcionaron estadísticas más detalladas. La app completamente optimizada se inició un 55% más rápido y los usuarios pudieron comenzar a navegar un 18% antes. La app optimizada también mostró una reducción de dos tercios en las ocurrencias de compilación Just in Time (JIT) y una disminución de un tercio en el tiempo de compilación JIT. Se mejoró el procesamiento de fotogramas, lo que generó un 19% más de fotogramas procesados en el recorrido del usuario comparado. Por último, el tamaño de la app se redujo en más de un tercio.
Mejoras generales en el rendimiento de Reddit
Puedes medir el tiempo de compilación JIT con una métrica de sección de registro de Macrobenchmark personalizada como esta:
val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")Cómo habilitar la tecnología detrás de la transformación: R8
Para habilitar R8 en modo completo, configura tu archivo app/build.gradle.kts estableciendo minifyEnabled y shrinkResources en true en el tipo de compilación de lanzamiento.
android {
...
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"keep-rules.pro",
)
}
}
}Este paso debe seguirse de pruebas integrales de extremo a extremo, ya que las optimizaciones del rendimiento pueden generar un comportamiento no deseado, que es mejor detectar antes de que lo hagan los usuarios.
Como se mostró anteriormente en este artículo, R8 realiza optimizaciones exhaustivas para maximizar los beneficios de rendimiento. R8 realiza modificaciones importantes en el código, como cambiar el nombre, mover y quitar clases, campos y métodos. Si observas que estas modificaciones causan errores, debes especificar qué partes del código no debe modificar R8 declarándolas en reglas de conservación.
Sigue el ejemplo de Reddit en tu app
El éxito de Reddit con R8 sirve como un potente caso de estudio para cualquier equipo de desarrollo que busque generar un impacto significativo y con poco esfuerzo en el rendimiento de su app. La correlación directa entre las mejoras técnicas y el aumento posterior en la satisfacción del usuario subraya el valor de la optimización del rendimiento.
Si siguen el plan establecido en este caso de estudio (usar herramientas como la puntuación de rendimiento de la app para identificar oportunidades, habilitar el potencial de optimización completo de R8, supervisar los datos del mundo real y usar comparativas para confirmar y profundizar la comprensión), otros desarrolladores pueden lograr ganancias similares.
Para comenzar a usar R8 en tu propia app, consulta la documentación y la guía oficiales recién actualizadas sobre cómo habilitar, configurar y solucionar problemas del optimizador de R8.
-
Casos de éxitoMonzo es un banco digital del Reino Unido con 15 millones de clientes y en crecimiento. A medida que la app crecía, el equipo de ingeniería identificó el tiempo de inicio de la app como un área crítica para mejorar, pero le preocupaba que requiriera cambios significativos en su código base.
Ben Weiss, Tracy Agyemang • Lectura de 2 min -
Casos de éxitoLas regresiones de rendimiento son notoriamente difíciles de reproducir, lo que las convierte en un cuello de botella masivo para los desarrolladores de dispositivos móviles.
Alice Yuan, Arti Arutiunov, Nikita Ogorodnikov • Lectura de 4 min -
Casos de éxitoRecientemente, FotMob experimentó el mayor aumento en un solo día en Wear OS entre su público instalado en 5 años, con un promedio diario de 2 a 3 veces. ¿El secreto? Un flujo de instalación multidispositivo simple que ayuda a los usuarios a descubrir su app para Wear OS directamente desde su teléfono.
Garan Jenkin • Lectura de 3 minutos
Recibe la información más reciente sobre el desarrollo de Android en tu bandeja de entrada todas las semanas.