8 min de lectura

Cómo publicar una app Flutter en Play Store paso a paso (2026)

Del keystore al primer lanzamiento: firma en build.gradle.kts, versión en pubspec, AAB, API 36, prueba cerrada de 14 días y errores típicos.

Portada: Publica tu app Flutter en Play Store, con clave de carga .jks, firma en Gradle, App Bundle .aab y nivel de API 36

Tu app ya corre en el emulador y quieres verla en la tienda. Para publicar una app Flutter en Play Store (o, como muchos lo buscan, subir una app Flutter a Play Store) necesitas cuatro cosas: un nombre de paquete definitivo, una clave de carga configurada en Gradle, un Android App Bundle firmado en release y la app creada en Play Console. Aquí tienes cada paso con los archivos de la plantilla actual de Flutter (build.gradle.kts), los requisitos de Google Play de 2026 y los errores que más frenan la primera subida.

Antes de compilar: revisa tu proyecto

Hay ajustes que conviene hacer antes del primer bundle, porque después cuesta cambiarlos.

1. El applicationId se elige una sola vez

La plantilla crea applicationId = "com.example.tu_app" en android/app/build.gradle.kts, con un TODO para que pongas el tuyo. La documentación de Flutter es clara: una vez subida la app a Play Store, no puedes cambiar el Application ID. Usa un dominio invertido que controles, como com.tuempresa.tuapp. Si lo cambias, actualiza también namespace y mueve MainActivity.kt a la carpeta del nuevo paquete, con su línea package corregida.

2. Manifest: nombre visible y permiso de Internet

En android/app/src/main/AndroidManifest.xml revisa android:label (el nombre bajo el ícono) y el permiso de red. La plantilla no incluye INTERNET en el manifest principal: Flutter solo lo permite durante el desarrollo, por eso la app funciona en debug y falla en release. Si usas red, agrégalo:

<uses-permission android:name="android.permission.INTERNET"/>

Aprovecha también para cambiar el ícono por defecto, con el paquete flutter_launcher_icons o a mano en las carpetas mipmap-.

3. Versión y nivel de API objetivo

La versión vive en el pubspec.yaml:

version: 1.0.0+1

Lo que va antes del + es el versionName (lo que ve el usuario) y el número después del + es el versionCode, el número interno que debe subir en cada versión. También puedes fijarlos al compilar con --build-name y --build-number.

Desde el 31 de agosto de 2026, las apps nuevas y las actualizaciones deben apuntar a Android 16 (nivel de API 36) o superior; se puede pedir una extensión hasta el 1 de noviembre de 2026. En la versión estable actual de Flutter, flutter.targetSdkVersion ya vale 36. Revísalo si reemplazaste targetSdk = flutter.targetSdkVersion por un número fijo o usas un Flutter antiguo.

4. Páginas de memoria de 16 KB

Google Play exige que las apps que apuntan a API 35 o superior admitan páginas de memoria de 16 KB en dispositivos de 64 bits, y desde el 1 de febrero de 2027 no podrás lanzar actualizaciones que no lo cumplan. El motor de Flutter ya es compatible y la versión estable usa NDK r28, que alinea a 16 KB por defecto. El riesgo está en los plugins con código nativo: mantenlos al día y atiende cualquier aviso de compatibilidad en Play Console.

Crea la clave de carga (upload keystore)

Google Play usa dos claves: tú firmas el bundle con tu clave de carga y Google firma los APK que descargan los usuarios con la clave de firma de la app, que custodia con la firma de apps de Play (las apps nuevas se inscriben automáticamente). La diferencia completa la explicamos en firma de apps de Google Play.

Crea el keystore con el comando de la documentación de Flutter (macOS o Linux):

keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA \
        -storetype JKS -keysize 2048 -validity 10000 -alias upload

En Windows (PowerShell):

keytool -genkey -v -keystore $env:USERPROFILE\upload-keystore.jks `
        -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 `
        -alias upload

Si la terminal no encuentra keytool, viene con el Java de Android Studio: ejecuta flutter doctor -v, copia la ruta que aparece tras "Java binary at:" y cambia java por keytool.

Guarda el .jks y sus contraseñas en un gestor de contraseñas y en un respaldo. Nunca lo subas a Git.

Configura key.properties y la firma en Gradle

Crea android/key.properties:

storePassword=<tu-contraseña>
keyPassword=<tu-contraseña>
keyAlias=upload
storeFile=/Users/<usuario>/upload-keystore.jks

En Windows la ruta va con doble barra invertida (C:\\Users\\<usuario>\\upload-keystore.jks). Agrega android/key.properties al .gitignore.

En android/app/build.gradle.kts, carga el archivo antes del bloque android:

import java.util.Properties
import java.io.FileInputStream

val keystoreProperties = Properties()
val keystorePropertiesFile = rootProject.file("key.properties")
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}

Y dentro de android, define la firma antes de buildTypes:

signingConfigs {
    create("release") {
        keyAlias = keystoreProperties.getProperty("keyAlias")
        keyPassword = keystoreProperties.getProperty("keyPassword")
        storeFile = keystoreProperties.getProperty("storeFile")?.let { file(it) }
        storePassword = keystoreProperties.getProperty("storePassword")
    }
}
buildTypes {
    release {
        signingConfig = signingConfigs.getByName("release")
    }
}

Lo clave es reemplazar la línea de la plantilla signingConfig = signingConfigs.getByName("debug") dentro de release. En proyectos antiguos con build.gradle (Groovy) la idea es la misma, con signingConfigs.release. Al terminar, ejecuta flutter clean.

Genera el AAB con flutter build appbundle

flutter build appbundle

El comando compila en release por defecto y deja el bundle en build/app/outputs/bundle/release/, con tu código para armeabi-v7a, arm64-v8a y x86-64. Puedes probarlo con bundletool o subiéndolo a una prueba interna. Más detalles en qué es un AAB.

Publicar app Flutter en Play Store: pasos en Play Console

Con el bundle listo, pasa a Play Console (la cuenta de desarrollador cuesta 25 USD, un solo pago):

  1. Ve a Página principal > Crear app. Elige idioma, nombre, si es app o juego y si es gratuita o pagada.
  2. Agrega un correo de contacto, acepta las declaraciones y las Condiciones de la firma de apps de Play, y pulsa Crear app.
  3. En el Panel, sigue Configura la app: política de privacidad, seguridad de los datos, clasificación del contenido, público objetivo y demás declaraciones.
  4. Completa la ficha de Play Store: nombre (30 caracteres), descripción breve (80), descripción completa (4.000), ícono, gráfico de funciones y capturas. Si no tienes capturas, créalas gratis con el generador de screenshots para Google Play.
  5. En Prueba y lanza > Pruebas, crea una versión, sube el .aab, escribe las notas y pulsa Siguiente. Si aparece un Resumen de errores, resuélvelo: los errores bloquean; las advertencias, no.

Cuentas personales: prueba cerrada obligatoria

Si tu cuenta personal se creó después del 13 de noviembre de 2023, Producción sigue desactivada hasta que hagas una prueba cerrada con al menos 12 verificadores que participen de forma continua durante 14 días. Después solicitas acceso a producción desde el Panel; según Google, esa revisión suele tardar siete días o menos. Cómo conseguir testers y un calendario de 14 días: prueba cerrada de Google Play.

Con el acceso aprobado (o con una cuenta de organización), crea la versión en Prueba y lanza > Producción y pulsa Iniciar lanzamiento. Google advierte que, en algunas cuentas, la revisión puede tardar hasta siete días o más en casos excepcionales.

Errores comunes al subir una app Flutter a Play Store

ErrorCausa probableSolución
Play Console dice que el bundle está firmado en modo de depuraciónrelease sigue con signingConfigs.getByName("debug")Apunta release a tu firma, flutter clean y recompila
Keystore file ... not found for signing config 'release'Ruta de storeFile mal escrita (en Windows, sin \\)Usa la ruta absoluta del .jks
Play rechaza el código de versión porque ya se usóNo subiste el número tras el +Usa version: 1.0.0+2 o --build-number
Error de nivel de API objetivotargetSdk fijo por debajo de 36Vuelve a flutter.targetSdkVersion o pon 36
La app no carga datos en producciónFalta INTERNET en el manifest principalAgrega el permiso y genera otra versión

Preguntas frecuentes

¿Puedo subir un APK de Flutter en vez de un AAB?

Para apps nuevas, no: desde agosto de 2021 Google Play exige Android App Bundle. El APK (flutter build apk --split-per-abi) sirve para otras tiendas o para instalar a mano.

¿Necesito una Mac para publicar en Play Store?

No. Para Android basta Windows, macOS o Linux con Flutter y Android Studio. La Mac solo es indispensable para compilar la versión de iOS.

¿Qué pasa si pierdo el upload-keystore.jks?

Con la firma de apps de Play, Google puede restablecer tu clave de carga, porque la clave de firma de la app la guarda Google. Aun así, haz respaldo para no depender de ese trámite.

¿Cada actualización necesita un versionCode nuevo?

Sí. Sube el número tras el + del pubspec.yaml, firma con la misma clave de carga y genera el bundle otra vez.

Prepara tu ficha con AppConsol

El código es la mitad del trabajo; la otra mitad es la ficha. En AppConsol tienes gratis generadores de screenshots, íconos, feature graphic, política de privacidad y términos y condiciones para Google Play y App Store. Entra a AppConsol y deja lista tu app Flutter para su primera publicación.

Sigue aprendiendo