El modelo APK — el problema
Un APK contiene todo: código para todas las arquitecturas de CPU (arm64, x86, armeabi), recursos para todas las densidades de pantalla (mdpi, hdpi, xhdpi, xxhdpi...), traducciones para todos los idiomas. El usuario descarga e instala todo eso aunque su teléfono solo necesite una fracción.
El resultado: APKs innecesariamente grandes, mayor tiempo de descarga y más espacio en el dispositivo.
Android App Bundle (AAB) — la solución
Un Android App Bundle (.aab) no es un formato instalable directamente. Es un paquete que subís a Google Play, y Play genera APKs optimizados para cada dispositivo específico:
- Un usuario con un Pixel 8 (arm64, xxhdpi, español) recibe solo los recursos que necesita
- Un usuario con un Galaxy A12 (armeabi-v7a, hdpi, inglés) recibe su propia versión optimizada
El ahorro de tamaño promedio según Google ronda el 15-20%, y puede ser mayor en apps con muchos recursos.
Diferencias clave
# APK
# ✓ Se puede instalar directamente (adb install, fuentes externas)
# ✓ No depende de Google Play para la instalación
# ✗ Contiene todo, para todos los dispositivos
# ✗ Tamaño mayor
# AAB
# ✓ Tamaño de descarga menor para cada usuario
# ✓ Soporte para dynamic feature modules
# ✓ Play App Signing integrado
# ✗ No se puede instalar directamente — Play lo convierte
# ✗ Requiere Google Play (o bundletool para testing local)
# Desde agosto 2021, Google Play REQUIERE AAB para nuevas apps.
# Las apps existentes pueden seguir usando APK pero se recomienda migrar.
Dynamic delivery — módulos opcionales
Con AAB podés dividir tu app en dynamic feature modules que se descargan a demanda:
// En tu app, solicitar la descarga de un módulo cuando el usuario lo necesita
val splitInstallManager = SplitInstallManagerFactory.create(context)
val request = SplitInstallRequest.newBuilder()
.addModule("modulo_camara") // nombre del feature module
.build()
splitInstallManager.startInstall(request)
.addOnSuccessListener { sessionId ->
// El módulo se está descargando
}
.addOnFailureListener { exception ->
// Error al iniciar la descarga
}
Cuándo usar feature modulesFuncionalidades grandes que no todos los usuarios usan: el editor de video, el módulo de AR, el escáner de documentos. Si la feature pesa 10MB y solo el 20% de los usuarios la usa, el 80% no tiene por qué descargarla.
Generar el AAB para Play Store
# Desde línea de comandos:
./gradlew bundleRelease
# El archivo queda en:
app/build/outputs/bundle/release/app-release.aab
# Desde Android Studio:
# Build → Generate Signed Bundle / APK
# → Android App Bundle → Next
# → Seleccionar keystore → Next
# → Elegir release → Finish
Cuándo todavía necesitás el APK
- Distribución fuera de Play Store: tiendas alternativas (Amazon, Samsung Galaxy Store), distribución enterprise, beta testing por email o link directo.
- Testing interno: instalar directamente con
adb installen dispositivos de desarrollo. - Dispositivos sin Play Store: algunos dispositivos enterprise o custom ROMs.
# Generar APK de release:
./gradlew assembleRelease
# Instalar directamente en dispositivo conectado:
adb install app/build/outputs/apk/release/app-release.apk
Probar el AAB localmente antes de subir
bundletool es la herramienta oficial de Google para trabajar con AABs localmente. Permite generar APKs para un dispositivo específico y simular cómo Play los entregaría:
# Instalar bundletool (descargar desde github.com/google/bundletool/releases)
# Generar APK set (todos los splits posibles):
java -jar bundletool.jar build-apks \
--bundle=app-release.aab \
--output=app.apks \
--ks=mi-app.keystore \
--ks-pass=pass:contraseña \
--ks-key-alias=mi-app-key \
--key-pass=pass:contraseña_clave
# Instalar en dispositivo conectado (solo los APKs que necesita):
java -jar bundletool.jar install-apks --apks=app.apks
# Ver el tamaño estimado de descarga para el dispositivo conectado:
java -jar bundletool.jar get-size total --apks=app.apks