Casos de éxito

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

Lectura de 4 min
Ben Weiss
Ingeniera 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 importantes 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ó 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 habilitar toda la potencia 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 ANR, y un aumento general en las calificaciones de Play Store. En este caso de éxito, se explica cómo Reddit logró estos resultados impresionantes.

Cómo el optimizador R8 ayudó a Reddit

El optimizador R8 es una herramienta fundamental para la optimización del rendimiento en Android. Realiza varios pasos para mejorar el rendimiento de la app.Echemos un vistazo rápido a los más impactantes.

  • 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í.
  • Method inlining reemplaza las llamadas a métodos con el código real, lo que hace que la app tenga un mejor rendimiento.
  • Class merging y otras estrategias se aplican para que el código sea más compacto. En este punto, ya no se trata de la legibilidad humana del código fuente, 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 importan aquí y se quitarán.
  • Identifier minification 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, es posible que termines con una clase llamada a.
  • La reducción de recursos quita los recursos sin usar, como los archivos XML y los 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 datos concretos a la satisfacción del usuario: Identificación del éxito en producción

Reddit observó resultados de rendimiento mejorados 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 el nuevo lanzamiento con las versiones 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 "Aplicación no responde" (ANR), una mejora del 25% en el procesamiento de fotogramas y una reducción del 14% en el tamaño de la app.

Estas mejoras son cruciales para la satisfacción del usuario. Un inicio más rápido significa menos espera y un acceso más rápido al contenido. Menos ANR generan una app más estable y confiable, lo que reduce la frustración del usuario. El procesamiento de fotogramas más fluido 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 fue claramente visible en el sentimiento del usuario.

Los indicadores de satisfacción del usuario del éxito de la optimización fueron directamente visibles en Google Play Store. Después del lanzamiento de la versión optimizada de R8, el equipo observó un cambio drástico y positivo en el sentimiento y la participación de los usuarios.

image.png

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 enfocado. Drew Heavner, el ingeniero de software sénior de Reddit que trabajó en esta iniciativa, señaló que la implementación de los cambios para habilitar todo el potencial de R8 tomó menos de dos semanas.

Confirmación de las ganancias: Un 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 ganancias y experimentar con más optimizaciones. Para este análisis, la 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 BaselinePerfiles de inicio.

Los perfiles de Baseline quitan de manera efectiva los pasos de compilación Just in Time (JIT) de los dispositivos de los usuarios y los colocan en las máquinas de los desarrolladores. Se demostró que el código compilado Ahead Of Time (AOT) generado reduce el tiempo de inicio y los problemas de procesamiento.

Cuando se empaqueta una app, el dexer d8 toma clases y métodos, y construye los archivos classes.dex de tu 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 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, lo que permitió una medición precisa de las interacciones del usuario en un entorno controlado. Para simular un recorrido típico del usuario, usaron la API de UIAutomator para crear una prueba que abriera la app, se desplazara hacia abajo tres veces y, luego, volviera a subir.

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 la comparativa confirmaron las observaciones de campo y proporcionaron estadísticas más detalladas. La app completamente optimizada comenzó 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. Mejoró el procesamiento de fotogramas, lo que generó un 19% más de fotogramas procesados durante el recorrido del usuario comparado. Por último, el tamaño de la app se redujo en más de un tercio.

image.png

Mejoras generales del 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")

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

Para habilitar R8 en modo completo, configura el 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 ir seguido de pruebas holísticas de extremo a extremo, ya que las optimizaciones de rendimiento pueden generar un comportamiento no deseado, que es mejor detectar antes que los usuarios.

Como se mostró anteriormente en este artículo, R8 realiza optimizaciones extensas 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 las reglas de conservación.

Sigue el ejemplo de Reddit en tu app

El éxito de Reddit con R8 sirve como un caso de éxito poderoso para cualquier equipo de desarrollo que busque generar un impacto significativo y de bajo 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 destaca el valor de la optimización del rendimiento.

Si siguen el plan establecido en este caso de éxito (usar herramientas como el Nivel de rendimiento de la app para identificar oportunidades, habilitar todo el potencial de optimización de R8, supervisar 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 recientemente actualizadas sobre cómo habilitar, configurar y solucionar problemas del optimizador R8.

Escrito por:

Seguir leyendo