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:
- Convertir bytecode de Java/Kotlin en DEX (formato ejecutable por ART).
- Ofuscar el código (reducir nombres de clases y métodos a caracteres como
a,b). - 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:
-
Actualiza
build.gradle:android { buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { coreLibraryDesugaringEnabled true } } -
Verifica dependencias no usadas:
Ejecuta./gradlew :app:dependenciesy busca bibliotecas marcadas como «(n)» (no usadas). Elimínalas o reemplázalas por versiones más ligeras. -
Prueba con
optimizeForSize:
Añade esto engradle.properties:android.enableR8.optimizeForSize=true
Nota: Puede aumentar el tiempo de compilación en un 5-15%.
-
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. 📱