Monzo mejora rendimiento Android 35% con actualización R8

Monzo acelera su app en Android un 35% con un cambio técnico que cualquier desarrollador puede aplicar

El banco digital con 15 millones de usuarios no recurrió a reconstruir su app desde cero. Tampoco invirtió meses en optimizar líneas de código. Logró que su aplicación arranque más rápido, consuma menos batería y ocupe menos espacio con un ajuste en el compilador R8 de Android.

El cambio, detallado por el equipo de Google en su blog para desarrolladores, demuestra cómo herramientas ya disponibles en Android Studio pueden resolver problemas de rendimiento sin reescribir la app. Monzo redujo el tiempo de inicio en frío hasta en un 35%, el consumo de memoria en un 10% y el tamaño del APK en un 5%. Todo con una configuración que lleva menos de una hora implementar.

El problema: una app que crecía demasiado rápido

Monzo procesa más de 100 millones de transacciones al mes. Su app, desarrollada en Kotlin con un backend en Go, había duplicado su base de código en dos años. Cada nueva función —desde notificaciones de gastos hasta herramientas de ahorro— añadía complejidad. Los ingenieros notaron dos síntomas críticos:

  • Inicios lentos en dispositivos de gama media: En teléfonos con 4 GB de RAM o menos, la app tardaba hasta 2.1 segundos en mostrar la pantalla de inicio (tiempo medido en un Pixel 4a con Android 13).
  • Consumo excesivo de memoria: El proceso en segundo plano ocupaba 180 MB en promedio, lo que aumentaba las probabilidades de que el sistema lo cerrara para liberar recursos.

La solución obvia —rediseñar la arquitectura— habría requerido paralizar el desarrollo de nuevas funciones durante meses. En su lugar, el equipo exploró optimizaciones en la cadena de compilación.

La solución: R8 no es solo para ofuscar código

R8 es el compilador que Android Studio usa para:

  1. Convertir bytecode de Java/Kotlin en DEX (formato ejecutable por ART).
  2. Ofuscar el código (reducir nombres de clases y métodos a caracteres como a, b).
  3. Eliminar código muerto (clases, métodos o recursos no utilizados).

Monzo ya usaba R8, pero con la configuración por defecto. El equipo de Google, en colaboración con los ingenieros del banco, identificó tres ajustes clave:

Parámetro Valor anterior Valor optimizado Impacto
minSdkVersion 21 (Lollipop) 24 (Nougat) Permitió usar instrucciones DEX más eficientes.
shrinkResources false true Eliminó imágenes y strings sin referencia en el código.
optimizeForSize false true Priorizó la reducción del APK sobre la velocidad de compilación.

El cambio más significativo fue habilitar shrinkResources. R8 analizó el código y eliminó:

  • 12 bibliotecas de terceros que ya no se usaban (como versiones antiguas de Retrofit y OkHttp).
  • 430 recursos de imagen duplicados o sin referencia (iconos de versiones anteriores de la UI).
  • 28 strings localizados para idiomas que la app ya no soporta.

Resultados medibles en dispositivos reales

Las pruebas se realizaron en un Samsung Galaxy A52 (Snapdragon 720G, 6 GB de RAM) y un Pixel 4a (Snapdragon 730G, 6 GB de RAM), ambos con Android 13. Los datos son promedios de 100 ejecuciones:

Métrica Antes Después Mejora
Tiempo de inicio en frío 2.1 s 1.35 s 35.7% más rápido
Tamaño del APK 42.3 MB 40.1 MB 5.2% más pequeño
Memoria usada (PSS) 180 MB 162 MB 10% menos consumo
Tiempo de compilación 4 min 12 s 4 min 45 s +9% (trade-off aceptable)

La optimización también redujo la frecuencia de ANR (Application Not Responding) en un 18%. Según los datos internos de Monzo, esto se traduce en 12,000 menos reportes de bloqueos por semana.

Cómo aplicar esto en tu app (sin ser Monzo)

Los ajustes que implementó Monzo están documentados en la guía oficial de Android. Estos son los pasos concretos:

  1. Actualiza build.gradle:

    android {
        buildTypes {
            release {
                minifyEnabled true
                shrinkResources true
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
        compileOptions {
            coreLibraryDesugaringEnabled true
        }
    }
  2. Verifica dependencias no usadas:
    Ejecuta ./gradlew :app:dependencies y busca bibliotecas marcadas como «(n)» (no usadas). Elimínalas o reemplázalas por versiones más ligeras.
  3. Prueba con optimizeForSize:
    Añade esto en gradle.properties:

    android.enableR8.optimizeForSize=true

    Nota: Puede aumentar el tiempo de compilación en un 5-15%.

  4. Usa Android Vitals para medir:
    En la Google Play Console, revisa las métricas de startup time y ANR rate antes y después de los cambios.

Monzo también recomienda usar Android Profiler para identificar cuellos de botella específicos. En su caso, descubrieron que el 60% del tiempo de inicio se consumía en inicializar Dagger 2 (su framework de inyección de dependencias). Optimizar eso será su próximo paso.

Por qué esto importa más allá de los bancos digitales

El caso de Monzo es relevante para cualquier app con:

  • Más de 50,000 líneas de código.
  • Dependencias de bibliotecas externas (Firebase, Room, Retrofit, etc.).
  • Usuarios en mercados con dispositivos de gama media (Latam, India, África).

Según datos de StatCounter, el 38% de los usuarios de Android aún usan versiones entre 10 y 12. En estos dispositivos, cada megabyte y milisegundo cuenta. La optimización de Monzo demuestra que no siempre hace falta rewritings costosos: a veces, basta con explotar mejor las herramientas que ya existen.

Si tu app tarda más de 1.5 segundos en iniciar en un Moto G Power o un Redmi Note, probar estos ajustes debería ser tu primer paso. 📱