Casos de éxito

Cómo Reddit usó el optimizador R8 para lograr mejoras de rendimiento de alto impacto

Lectura de 4 min
Ver el perfil de Ben Weiss
Ben Weiss Ingeniero de relaciones con desarrolladores

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 obstáculos significativos para la participación y la retención de los usuarios. Durante su trabajo con el equipo de Relaciones con Desarrolladores de Android, el equipo de ingeniería de Reddit usó la puntuación 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 habilitar todo el poder de 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 los errores de ANR, y un aumento general en las calificaciones de Play Store. En este caso de éxito, se desglosa cómo Reddit logró estos resultados impresionantes.

Cómo el optimizador R8 ayudó a Reddit

El optimizador de R8 es una herramienta fundamental para optimizar el rendimiento en Android. Se deben seguir varios pasos para mejorar el rendimiento de la app.Veamos rápidamente los más importantes.

  • La eliminación de código muerto 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 incorporación de métodos reemplaza las llamadas de método por el código real, lo que mejora el rendimiento de la app.
  • Se aplican 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 que el código fuente sea legible por humanos, sino de que el código compilado funcione rápido. Por lo tanto, las abstracciones, como las interfaces o las jerarquías de clases, no importan aquí y se quitarán.
  • La reducción de identificadores cambia los nombres de las clases, los campos y los métodos por nombres más cortos y sin sentido. Por lo tanto, en lugar de MyDataModel, podrías terminar con una clase llamada a.
  • La reducción de recursos quita los recursos que no se usan, como archivos en formato XML y elementos de diseño, para reducir aún más el tamaño de la app.
image.png

Etapas principales de la optimización de R8

De los datos concretos a la satisfacción del usuario: Cómo identificar el éxito en producción

Reddit observó mejoras en el 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 les permitió comparar la nueva versión con las anteriores.

image.png

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 "La 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 tiempo de espera y un acceso más rápido al contenido. Menos errores de ANR generan una app más estable y confiable, lo que reduce la frustración de los usuarios. La renderización de fotogramas más fluida quita los tirones 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 vio reflejado claramente en la opinión de los usuarios.

Los indicadores de satisfacción de los usuarios sobre el éxito de la optimización se podían ver directamente en Google Play Store. Tras el lanzamiento de la versión optimizada con R8, el equipo observó un cambio drástico y positivo en la opinión y la participación de los usuarios.

image.png

Drew Heavner: "Habilitar todo el potencial de R8 llevó menos de 2 semanas"

Lo más impresionante es que esto se logró con un esfuerzo enfocado. Drew Heavner, ingeniero de software de Reddit que trabajó en esta iniciativa, señaló que implementar los cambios para habilitar todo el potencial de R8 llevó menos de dos semanas.

Confirmación de las mejoras: Análisis detallado con macrocomparativas

Después de observar las mejoras significativas 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 mejoras 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 aplicaba R8 y dos herramientas más de optimización del rendimiento fundamentales: 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 desarrollo. Se demostró que el código compilado generado con anticipación (AOT) 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, estos archivos dex se cargan 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 de esta fase, ya que permitió medir con precisión las interacciones de los usuarios en un entorno controlado. Para simular un recorrido del usuario típico, 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, todo lo 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 instancias de compilación justo a tiempo (JIT) y una disminución de un tercio en el tiempo de compilación JIT. Se mejoró la renderización de fotogramas, lo que generó un 19% más de fotogramas renderizados en el recorrido del usuario de referencia. Por último, el tamaño de la app se redujo en más de un tercio.

image.png

Mejoras en el rendimiento general de Reddit

Puedes medir el tiempo de compilación JIT con una métrica de sección de seguimiento de Macrobenchmark personalizada como esta:

val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")

Habilita la tecnología detrás de la transformación: R8

Para habilitar el modo completo de R8, configura el archivo app/build.gradle.kts estableciendo minifyEnabled y shrinkResources como 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 ir seguido de pruebas integrales de extremo a extremo, ya que las optimizaciones de rendimiento pueden generar comportamientos no deseados, que es mejor que detectes antes que los usuarios.

Como se mostró anteriormente en este artículo, R8 realiza optimizaciones exhaustivas para maximizar los beneficios de rendimiento. R8 realiza modificaciones sustanciales 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 caso de éxito potente 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 de los usuarios destaca el valor de la optimización del rendimiento.

Si siguen el plan establecido en este caso de éxito (usar herramientas como la puntuación de rendimiento de la app para identificar oportunidades, habilitar todo el potencial de optimización de R8, supervisar los datos del mundo real y usar comparativas para confirmar y profundizar la comprensión), otros desarrolladores pueden lograr mejoras similares.

Para comenzar a usar R8 en tu propia app, consulta la documentación y orientación oficiales recientemente actualizadas sobre cómo habilitar, configurar y solucionar problemas del optimizador de R8.

Escrito por:
Continuar leyendo