Compila un app bundle firmado
Compila la app web
Ejecuta tu build web de producción (en la mayoría de proyectos de Ionic con Angular, React y Vue,
npm run build) para que la carpeta configurada comowebDiren Capacitor esté al día.Sincroniza con Android
npx cap sync androidcopia el build web al proyecto nativo y actualiza los plugins nativos. Si te lo saltas, publicas el JavaScript de ayer.Abre Android Studio
Ejecuta
npx cap open android.Genera el bundle
Elige Build → Generate Signed Bundle/APK, selecciona Android App Bundle, elige o crea tu keystore, la variante release y haz clic en Create.
npm run build
npx cap sync android
npx cap open android¿Prefieres la línea de comandos o CI? npx cap build android genera un bundle firmado con --androidreleasetype AAB y las opciones del keystore. Pasa las contraseñas desde variables de entorno, no desde un archivo del repositorio:
npx cap build android --androidreleasetype AAB \
--keystorepath ../upload-keystore.jks --keystorealias upload \
--keystorepass "$KEYSTORE_PASS" --keystorealiaspass "$KEY_PASS"Clave de subida y firma de aplicaciones de Play
Google Play exige la firma de aplicaciones de Play para apps nuevas. El keystore que creas en el asistente de Android Studio (Create new) o que pasas a npx cap build es tu clave de subida; Google guarda la clave de firma de la app, que es distinta, después de tu primera subida.
Android Studio recomienda una validez de al menos 25 años para una clave nueva. Guarda el archivo .jks fuera de la carpeta android/ por si algún día regeneras el proyecto nativo, y haz copia junto con las dos contraseñas. Si pierdes la clave de subida, puedes pedir un restablecimiento en Play Console.
Si guardas opciones de build en la configuración de Capacitor, no pongas las contraseñas en el archivo que subes al repositorio. La configuración forma parte de él.
Código de versión y nivel de API objetivo
Capacitor no lee la versión de package.json. Los valores que ve Google Play están en android/app/build.gradle; sube versionCode antes de cada subida:
android {
defaultConfig {
versionCode 2
versionName "1.0.1"
}
}Desde el 31 de agosto de 2026, las apps nuevas y las actualizaciones deben apuntar a Android 16 (nivel de API 36). Capacitor fija targetSdkVersion en android/variables.gradle y cada versión mayor admite exactamente un valor: Capacitor 8 usa 36 y Capacitor 7 usa 35. No se admiten valores personalizados, así que el camino a la API 36 es actualizar a Capacitor 8 junto con tus plugins, no cambiar el número.
ext {
// ...
targetSdkVersion = 36
}Trampas de Ionic y Capacitor
- Live reload activado. Un
server.urlen la configuración de Capacitor hace que la app cargue la dirección de tu máquina de desarrollo. Los testers ven una pantalla en blanco. Quítalo antes del build de release. - Recursos web caducados. Generar el bundle en Android Studio sin ejecutar antes
npx cap sync androidpublica el build web anterior. - Plugins en otra versión mayor. Todos los paquetes
@capacitor/*y los plugins de la comunidad deben coincidir con la versión mayor de@capacitor/android. Si no, aparecen errores de build nativo o cierres en ejecución. - Peticiones en texto plano. Android bloquea por defecto el tráfico
http://sin cifrar. Los builds de producción deben llamar solo a APIs HTTPS. - Plugins nativos y páginas de 16 KB. Los plugins que incluyen bibliotecas
.sodeben admitir páginas de memoria de 16 KB. Play Console avisa de ello y, a partir del 1 de febrero de 2027, no se podrán publicar actualizaciones sin esa compatibilidad. - Probar solo en el navegador. El botón atrás, los permisos y los enlaces profundos se comportan distinto en la WebView de Android. Instala el build de release en un dispositivo real antes de subirlo.
Depura lo que ven los testers en la WebView
La mayoría de los problemas de un build de release de Capacitor están en la capa web, así que las herramientas del navegador que ya conoces son la mejor entrada. En un build de release están desactivadas: webContentsDebuggingEnabled es false por defecto, y los logs propios de Capacitor siguen loggingBehavior, cuyo valor por defecto es debug, de modo que los builds de release no registran nada.
Reprodúcelo en un build de debug
Ejecuta la app en un teléfono desde Android Studio, abre
chrome://inspecten Chrome en tu ordenador y elige la WebView. Tendrás la consola, el panel de red y los puntos de interrupción de tu código web.edge://inspectfunciona igual en Edge.Inspecciona un build de release solo en local
Si un error solo aparece en release, pon temporalmente
webContentsDebuggingEnabledentrueen un build que instales tú. No subas nunca ese build: hace que el contenido web de tu app se pueda depurar en cualquier dispositivo.Recoge los fallos nativos en Play Console
Los fallos en el código Java de Capacitor o en plugins nativos aparecen en Supervisar y mejorar → Android vitals → Fallos y ANR. Con R8 activado, el archivo de mapeo incluido en el
.aablos hace legibles.
const config: CapacitorConfig = {
// ...
android: {
// Never ship this to Google Play
webContentsDebuggingEnabled: true,
},
};Pide a los testers el modelo del dispositivo, la versión de Android y la versión de Android System WebView. Muchos errores exclusivos de la WebView dependen de ese último número, y todo lo que esté por debajo de android.minWebViewVersion queda fuera de lo que admite tu app.
Play Console en breve: de la prueba cerrada a producción
En cuanto tu bundle de Ionic / Capacitor esté compilado y firmado, el resto ocurre en Play Console y funciona igual con cualquier framework. Esta es la lista de comprobación; cada menú y cada pantalla están en la guía completa de Play Console.
- Termina la configuración de la app en el Panel: política de privacidad, acceso a la app, anuncios, clasificación de contenido, público objetivo, seguridad de los datos y ficha de Play Store.
- Crea una versión de prueba cerrada en Probar y publicar → Pruebas → Prueba cerrada: elige los países de tus testers, sube el
.aaby envíalo a revisión. - Añade testers con un Google Group en la pestaña Testers y comparte el enlace de opt-in. Funciona en cuanto el canal muestra Publicado.
- Mantén al menos 12 testers con opt-in durante 14 días seguidos. Las pruebas internas no cuentan, y quien sale y vuelve empieza sus 14 días de nuevo.
- Publica al menos una actualización durante la prueba y apunta qué encontraron los testers y qué cambiaste.
- Solicita acceso a producción desde el Panel y responde las tres secciones sobre tu prueba, tu app y tu preparación. La decisión es de Google; nadie puede garantizar la aprobación.
Cuenta con bajas: recluta más de 12 testers para que una baja no retrase tu calendario. Ver todos los pasos de Play Console.
La guía completa de Play Console
Canal cerrado, Google Group y enlace de opt-in, la regla de 12 testers / 14 días y la solicitud de producción, paso a paso en una sola página.
Envía correcciones y dónde encajan las actualizaciones en vivo
Vuelve a compilar la app web, sincroniza, sube versionCode y genera un nuevo bundle firmado para el mismo canal cerrado:
npm run build
npx cap sync android
npx cap open androidLa política de Google Play sobre uso inadecuado de dispositivos y redes prohíbe que una app se actualice fuera de Google Play, con una excepción para el código que se ejecuta en un intérprete o una máquina virtual, como JavaScript en una WebView. Por eso existen servicios de actualización en vivo para la capa web. El código nativo, los plugins y los permisos siempre necesitan un bundle nuevo a través de Google Play.
Durante la prueba cerrada, un versionCode nuevo en el canal cerrado es el camino directo: se revisa, los testers lo reciben por Google Play y queda en tu historial de versiones. Si además usas un servicio de actualización en vivo, resérvalo para correcciones reales y mantén sincronizado con él el build web del canal cerrado.
- Ojo con el mínimo de WebView.
android.minWebViewVersionvale60por defecto y no puede bajar de55. Los testers con problemas deberían actualizar primero Android System WebView desde Google Play. - Nada de contenido mixto.
android.allowMixedContentestá desactivado por defecto y no está pensado para producción. Sirve cada API y cada recurso por HTTPS y dejaserver.cleartexten su valor por defecto,false. - Sincroniza antes de cada build. Cada corrección necesita
npx cap sync androiddespués del build web, o el bundle nuevo seguirá llevando el JavaScript antiguo.
Preguntas frecuentes
¿Puedo usar Chrome DevTools en el teléfono de un tester?
No con el build que instaló desde Google Play, porque los builds de release no activan la depuración de la WebView. Pide los pasos para reproducirlo, instala tú la misma versión con la depuración activada e inspecciónala con chrome://inspect.
¿Por qué los testers ven una pantalla en blanco?
Normalmente porque el bundle aún contiene un server.url del live reload, o porque una petición falla por http:// sin cifrar. Revisa primero la configuración de Capacitor y el panel de red de un build de debug.
¿Puedo quedarme en Capacitor 7?
No para subidas nuevas tras la fecha límite de la API objetivo: cada versión principal de Capacitor admite exactamente un valor de targetSdkVersion; Capacitor 7 usa 35 y Google Play exige 36. Planifica la migración a Capacitor 8 con tus plugins antes de que empiece la prueba.
¿Necesito Android Studio para compilar el bundle?
No. npx cap build android compila un .aab firmado desde la línea de comandos con las opciones de tu keystore, lo que es más fácil de repetir en CI. En ambos casos, ejecuta antes el build web y npx cap sync android.
Fuentes
Los detalles técnicos se han comprobado con la documentación oficial de abajo. Los menús y los valores por defecto cambian entre versiones; ante la duda, manda la página oficial.
- Capacitor: CLI build command
- Capacitor: Setting the target SDK
- Capacitor: Deploying to Google Play
- Android Developers: Sign your app
- Android Developers: Target API level requirements
- Capacitor: Configuration (android options, server options)
- Capacitor: Debugging (chrome://inspect)
- Play Policy: Device and Network Abuse
- Play Console Help: App testing requirements for new personal developer accounts
- Play Console Help: Set up an open, closed, or internal test
- Play Console Help: Deobfuscate or symbolicate crash stack traces
¿Es tu primera vez con la regla de los 12 testers?
La guía general explica el requisito de Google, cómo avanza día a día una campaña de TestBunny y qué podemos y qué no podemos garantizar.
Leer la guía general