Compila un app bundle de release
React Native empaqueta tu JavaScript dentro del build nativo de Android, así que el .aab de release sale de Gradle. Configura primero la firma (siguiente sección) y luego:
Revisa el nombre de paquete
applicationIdenandroid/app/build.gradlees definitivo en cuanto subes la app a Google Play. Asegúrate de que es el que quieres.Compila
Desde la raíz del proyecto ejecuta
npx react-native build-android --mode=releaseo llama a Gradle directamente como abajo. Ambos ejecutan la tareabundleReleasey empaquetan el JavaScript en la app.Encuentra el archivo
El bundle se guarda en
android/app/build/outputs/bundle/release/app-release.aab.Prueba el build de release
Desinstala la app de debug e instala la variante release en un dispositivo real con el segundo comando de abajo. Los fallos que solo ocurren en release aparecen aquí, no en Play Console.
cd android
./gradlew bundleReleasenpm run android -- --mode="release"No pongas org.gradle.configureondemand=true en gradle.properties. Puede hacer que el build de release no empaquete el JavaScript ni los recursos, y los testers reciben una app que no arranca.
Clave de subida y firma de aplicaciones de Play
Google Play exige la firma de aplicaciones de Play para apps nuevas: Google guarda la clave de firma de la app y tú firmas las subidas con una clave de subida. Genérala con keytool, que viene con el JDK:
keytool -genkeypair -v -storetype PKCS12 -keystore my-upload-key.keystore \
-alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000Mueve el archivo a android/app/ y guarda las credenciales en ~/.gradle/gradle.properties para que nunca acaben en git:
MYAPP_UPLOAD_STORE_FILE=my-upload-key.keystore
MYAPP_UPLOAD_KEY_ALIAS=my-key-alias
MYAPP_UPLOAD_STORE_PASSWORD=*****
MYAPP_UPLOAD_KEY_PASSWORD=*****Luego añade una configuración de firma release en android/app/build.gradle y úsala en el tipo de build release. El de la plantilla firma con la clave de debug hasta que lo cambies:
android {
signingConfigs {
release {
if (project.hasProperty('MYAPP_UPLOAD_STORE_FILE')) {
storeFile file(MYAPP_UPLOAD_STORE_FILE)
storePassword MYAPP_UPLOAD_STORE_PASSWORD
keyAlias MYAPP_UPLOAD_KEY_ALIAS
keyPassword MYAPP_UPLOAD_KEY_PASSWORD
}
}
}
buildTypes {
release {
// ...
signingConfig signingConfigs.release
}
}
}Código de versión y nivel de API objetivo
Cada subida necesita un versionCode mayor que todo lo que hayas subido antes. En un proyecto bare está en android/app/build.gradle; versionName es la etiqueta que ven los usuarios:
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). Los niveles de SDK están en el bloque ext de android/build.gradle (compileSdkVersion, targetSdkVersion). Las versiones nuevas de React Native los suben. Si tu versión es antigua, actualizar React Native suele ser más seguro que subir solo targetSdkVersion, porque tus bibliotecas nativas también tienen que ser compatibles.
Trampas de React Native
- Bundle firmado en debug. Si olvidas cambiar el tipo de build release a
signingConfigs.release, Play Console rechaza la subida por estar firmada en debug. - Sorpresas de R8/ProGuard. Con
enableProguardInReleaseBuilds = true, las bibliotecas que usan reflexión pueden fallar solo en release. Añade sus reglas de conservación enandroid/app/proguard-rules.proy prueba la release en un dispositivo. - Informes de fallos ilegibles. Hermes, el motor predeterminado, ejecuta bytecode precompilado; las trazas de release apuntan al bundle compilado. Guarda los source maps de cada build que subas para simbolizar lo que envían los testers.
- La app busca Metro. Un build de release que intenta conectarse al servidor de desarrollo no tiene el JavaScript empaquetado. Revisa el ajuste
configureondemandy vuelve a compilar. - Módulos nativos y páginas de 16 KB. Las bibliotecas con archivos
.sonativos deben 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. Actualízalas antes de empezar la prueba. - Keystore perdido. Haz copia del keystore y sus contraseñas. Puedes pedir un restablecimiento de la clave de subida en Play Console, pero lleva un tiempo que no quieres perder en mitad de la prueba.
Simboliza los fallos de los testers
Un fallo de JavaScript en un build de release te llega como una posición de bytecode de Hermes, por ejemplo p@1:132161, que por sí sola no dice nada. React Native genera source maps para los builds de release de Android por defecto; lo importante es guardar el mapa correcto de cada bundle que subes.
Archiva el source map
Después de cada build de release, copia el mapa de
android/app/build/generated/sourcemaps/react/release/y etiquétalo con el código de versión. Debe coincidir exactamente con el commit del build que falló: incluso un cambio pequeño desplaza los offsets.Ejecuta metro-symbolicate
Guarda el stack trace del tester en un archivo, o léelo directamente de
adb logcat, y pásalo pormetro-symbolicatecon ese mapa. La herramienta convierte los offsets de bytecode en nombres de archivo, líneas y funciones.Revisa las líneas nativas en Play Console
Los fallos en el código Java o Kotlin de los módulos nativos aparecen en Supervisar y mejorar → Android vitals → Fallos y ANR. Con R8 activado, el archivo de mapeo incluido en el
.aablos hace legibles sin subir nada más.
# From a saved stack trace
npx metro-symbolicate android/app/build/generated/sourcemaps/react/release/index.android.bundle.map < stacktrace.txt
# From a connected device
adb logcat -d | npx metro-symbolicate android/app/build/generated/sourcemaps/react/release/index.android.bundle.mapSi metro-symbolicate termina al instante sin mostrar nada, no recibió entrada: pasa el stack trace con una tubería o una redirección, no escribiéndolo en la terminal.
Play Console en breve: de la prueba cerrada a producción
En cuanto tu bundle de React Native 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.
Publica actualizaciones durante la prueba
En React Native: sube versionCode (y versionName), vuelve a compilar y sube el nuevo bundle al mismo canal cerrado.
cd android
./gradlew bundleReleaseDesinstala la app de debug antes de instalar la variante de release con npm run android -- --mode="release"; Android no reemplaza una app firmada con otra clave. Repite esta comprobación antes de cada subida, porque los problemas exclusivos de release, como reglas keep que faltan, nunca aparecen en debug.
Las actualizaciones de JavaScript over the air son una zona gris por la que preguntan muchos equipos. La política de Google Play sobre uso inadecuado de dispositivos y redes dice que una app no puede actualizarse fuera de Google Play, pero la restricción no se aplica al código que se ejecuta en una máquina virtual o un intérprete, como JavaScript. El código nativo, los permisos nuevos y los módulos nativos siempre necesitan un bundle nuevo a través de Google Play.
- El canal cerrado sigue siendo la vía principal. Un
versionCodenuevo en el canal cerrado llega a todos los testers con opt-in a través de Google Play y queda en tu historial de versiones. - No toques las dependencias nativas. Actualizar React Native o un módulo nativo a mitad de la prueba cambia mucho más que el error que corriges. Hazlo antes de la prueba o después del acceso a producción.
- Un mapa por versión. Cada build nuevo genera un source map nuevo. Guárdalo con el código de versión, o el próximo informe de fallo de esa versión no se podrá descifrar.
Preguntas frecuentes
¿Necesito Hermes para Google Play?
No, pero es el motor por defecto de React Native y el que usan la mayoría de las apps. Precompila JavaScript a bytecode, lo que acelera el arranque y también explica por qué los stack traces de release necesitan un source map para leerse.
¿Qué archivo subo a Play Console?
El bundle de android/app/build/outputs/bundle/release/app-release.aab. npx react-native build-android --mode=release ejecuta la tarea bundleRelease de Gradle y mete todo tu JavaScript dentro.
¿Por qué mi diseño queda bajo la barra de estado tras subir targetSdk?
Las apps que apuntan a Android 15 (nivel de API 35) o superior se dibujan de borde a borde. react-native-safe-area-context ya lo resuelve; sin esa biblioteca, añade márgenes de área segura en cada pantalla antes de que la vean los testers.
¿React Native admite páginas de memoria de 16 KB?
Sí, desde React Native 0.77. Las versiones anteriores y los módulos nativos que traen sus propios archivos .so puede que no. Actualiza antes de que empiece la prueba, no a mitad.
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.
- React Native: Publishing to Google Play Store
- Android Developers: Sign your app
- Android Developers: Target API level requirements
- Android Developers: Support 16 KB page sizes
- React Native: Debugging release builds
- React Native 0.77 release notes (16 KB pages, edge-to-edge)
- 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