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 install en 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