¿Cómo puedo generar un apk que pueda ejecutarse sin servidor con react-native?

211

He creado mi aplicación, puedo ejecutarla en mi emulador local (y también en mi dispositivo Android dentro de la misma red cambiando el servidor de depuración).

Sin embargo, quiero crear un APK que pueda enviar a alguien sin acceso al servidor de desarrollo y quiero que puedan probar la aplicación.

Veo que hay una sección Uso de paquete sin conexión en la sección iOS de la documentación. Pero no pude descubrir cómo lograr lo mismo para Android. es posible? ¿Si es así, cómo?

ACTUALIZACIÓN: En la respuesta a esta pregunta ( Android no pudo cargar el paquete JS ) se dice que el paquete fuera de línea se puede descargar desde el servidor de desarrollo. Pero cuando obtengo el paquete del servidor de desarrollo, los archivos de imagen no se pueden cargar.

Gokhan Sari
fuente
consulte este sencillo ejemplo para generar un archivo apk: React Native Generate Release APK a través del símbolo del sistema de Windows Android
sumit kumar pradhan

Respuestas:

204

Después de la respuesta de Aditya Singh, el apk generado (sin firmar) no se instalaba en mi teléfono. Tuve que generar un apk firmado usando las instrucciones aquí .

Lo siguiente funcionó para mí:

$ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

Coloque el my-release-key.keystorearchivo debajo del android/app directorio en su carpeta de proyecto. Luego edite el archivo ~/.gradle/gradle.propertiesy agregue lo siguiente (reemplace **** con la contraseña correcta del almacén de claves, el alias y la contraseña clave)

MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
MYAPP_RELEASE_KEY_ALIAS=my-key-alias
MYAPP_RELEASE_STORE_PASSWORD=****
MYAPP_RELEASE_KEY_PASSWORD=****

Si usa MacOS, puede almacenar su contraseña en el llavero siguiendo las instrucciones aquí en lugar de almacenarla en texto sin formato.

Luego edite app / build.gradle y asegúrese de que haya lo siguiente (es posible que sea necesario agregar las secciones con SignatureConfigs SignatureConfig):

...
android {
    ...
    defaultConfig { ... }
    signingConfigs {
        release {
            if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
                storeFile file(MYAPP_RELEASE_STORE_FILE)
                storePassword MYAPP_RELEASE_STORE_PASSWORD
                keyAlias MYAPP_RELEASE_KEY_ALIAS
                keyPassword MYAPP_RELEASE_KEY_PASSWORD
            }
        }
    }
    buildTypes {
        release {
            ...
            signingConfig signingConfigs.release
        }
    }
}
...

Luego ejecuta el comando cd android && ./gradlew assembleRelease,

Para Windows 'cd android' y luego ejecute el gradlew assembleReleasecomando, y encuentre su apk firmado enandroid/app/build/outputs/apk/app-release.apk

Pedram
fuente
10
Esta es la respuesta más actualizada y precisa. Gracias.
Gokhan Sari
2
app-release.apk no se está instalando. ¿Cuál sería el problema?
Balasubramanian
1
Creo el apk, lo subo a Google Play, pero no funciona ... ¿alguna pista?
Italo Rodrigo
2
No puedo encontrar la carpeta de Android / aplicación, ¿dónde se encuentra?
DHLopez
66
Gracias, no lo fue, pero descubrí que era porque estoy usando expo para las pruebas, y la aplicación nativa de creación npm tiene una estructura diferente, así que para referencia futura, si alguien tiene este problema, simplemente expulse su proyecto y luego obtendrá esas carpetas, es curioso cómo el tutorial te dice que uses npm para crear la aplicación, y luego habla sobre una estructura que no existe cuando la usas
DHLopez
194

Deberá crear una clave para firmar el apk. Use a continuación para crear su clave:

 keytool -genkey -v -keystore my-app-key.keystore -alias my-app-alias -keyalg RSA -keysize 2048 -validity 10000

Use una contraseña cuando se le solicite

Una vez que se genera la clave, úsela para generar la compilación instalable:

 react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/

Genera la construcción usando gradle

 cd android && ./gradlew assembleRelease

Sube el APK a tu teléfono. La -rbandera reemplazará la aplicación existente (si existe)

adb install -r ./app/build/outputs/apk/app-release-unsigned.apk

Aquí se menciona una descripción más detallada: https://facebook.github.io/react-native/docs/signed-apk-android.html

ACTUALIZACIÓN : Basado en comentarios de @shashuec y @Fallen

si recibes un error

ENOENT: no existe tal archivo o directorio, abra 'android / app / src / main / assets / index.android.bundle'

ejecute mkdir android / app / src / main / assets

Aditya Singh
fuente
44
Muchas gracias por esto, funcionó para mí. El único problema que recibí fue este mensaje: "Faltan argumentos obligatorios: salida de paquete" en la parte reaccionar paquete nativo, pero se resuelve eliminando los símbolos 2 "\"
guinunez
59
Estoy sorprendido por la pobre documentación de Facebook donde omitieron totalmente la react-native bundleparte. ¡Gracias por tu respuesta!
technophyle
2
Estoy trabajando con Windows, también funciona con esto gradlew.bat assembleRelease.
Tabares
12
Me sale este error Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES] . cuando trato de instalar el apk.
developernaren
18
si obtiene un error de ENOENT: no such file or directory, open 'android/app/src/main/assets/index.android.bundle' ejecuciónmkdir android/app/src/main/assets
shashuec
31

Deberías usar Android Studio para este proceso. Es simplemente más simple. Pero primero ejecute este comando en su directorio de aplicaciones nativas react:

Para la versión más nueva de react-native (por ejemplo, react native 0.49.0 y así sucesivamente ...)

react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res

Para la versión anterior de react-native (0.49.0 y menos)

react-native bundle --platform android --dev false --entry-file index.android.js   --bundle-output android/app/src/main/assets/index.android.bundle   --assets-dest android/app/src/main/res/

Luego, use Android Studio para abrir la carpeta 'android' en su directorio de aplicaciones nativas, le pedirá que actualice Gradle y algunas otras cosas. vaya a construir-> Generar APK firmado y siga las instrucciones desde allí. Es realmente sencillo.

Mike Axle
fuente
También uso Android Studio y Xcode para crear versiones de lanzamiento para mis aplicaciones React Native ... pero la generación de Android podría hacerse con un script como lo describe @Aditya Singh
WiRa
Esto ya no es necesario proandroiddev.com/…
onmyway133
30

Ejecute este comando:

react-native run-android --variant=release

Tenga en cuenta que --variant=releasesolo está disponible si ha configurado la firma con cd android && ./gradlew assembleRelease.

Ahmed Ashraf
fuente
@jasan Encontré otro problema como el tuyo aquí: github.com/facebook/react-native/issues/11586 Esto puede solucionar el problema: cd android && ./gradlew installRelease
Ahmed Ashraf
Intenté cd android && ./gradlew installReleasey obtuve este errorTask 'assembleRelease.' not found in root project 'project'. Some candidates are: 'assembleRelease'.
ThomasReggi
Sí, debe generar el archivo Keystore. y edite el archivo gradle. Siga esas instrucciones para solucionar este problema. facebook.github.io/react-native/docs/signed-apk-android.html
Ahmed Ashraf
21

para React Native 0.49 y más

deberías ir al directorio del proyecto en la terminal y ejecutar ese comando

1 - mkdir android/app/src/main/assets
2 - react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res

si es inferior a 0,49

  1 - mkdir android/app/src/main/assets
  2 - react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res

Luego, use Android Studio para abrir la carpeta 'android' en su directorio de aplicaciones nativas, le pedirá que actualice Gradle y algunas otras cosas. vaya a construir-> Generar APK firmado y siga las instrucciones desde allí. Que bien.

Yasin Ugurlu
fuente
Esta es una manera fácil de hacerlo si tiene instalado Android Studio (que se encargará de usar o crear el almacén de claves). Gracias.
leosok
Hola ... tengo una pregunta rápida ... ¿se requieren los pasos anteriores? El reaccionan doc nativa no menciona en ninguna parte ..
pravin
1
@pravin no es obligatorio, es uno de los métodos de generación de apk.
Yasin Ugurlu
12

Si consigues Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES].

Intenté usar el método de @ Aditya para generar un archivo APK sin firmar e instalarlo, pero cuando fui a instalarlo en mi tableta Android, me dio un error de Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES] .

Me imagino que esto se debe a que el archivo APK no estaba firmado y la tableta no estaba contenta con esto. Entonces, después de generar el archivo de paquete React Native pude generar un archivo APK firmado, como es normal, a través de Android Studio.

Por cierto, nuestra aplicación es una aplicación de Android completamente funcional que ya existe en Play Store y solo estamos agregando React Native en pedazos pequeños, porque es increíble.

Para resumir, aquí están mis pasos:

1) Generar paquete nativo React:

react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output android/<your-package-name>/src/main/assets/index.android.bu‌​ndle --assets-dest android/<your-package-name>/src/main/res/ 

2) Genere un archivo APK firmado desde Android Studio.

3) Instale el archivo APK firmado en el dispositivo USB:

adb -d install -r <path_to_signed_apk> 

La -dbandera solo le indica adbque se instale en el dispositivo USB conectado, en caso de que también tenga un emulador ejecutándose. Si desea instalar en cualquier emulador, suelte la -dbandera.

4) Beneficio!

Joshua Pinter
fuente
11

Pruebe a continuación, generará una aplicación-debug.apk en su carpeta raíz / android / app / build / salidas / apk / debug

react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res

luego ve a la carpeta de Android y ejecuta

./gradlew assembleDebug

hermano
fuente
El APK generado aquí necesita Metro para ejecutarse ... así que creo que todavía está usando el servidor de desarrollo
nerdlinger
11

Si alguien quiere construir sin las teclas de Play Store, entonces este comando sería muy útil.

# react-native run-android --variant=release

Después de completar la compilación, puede encontrar el apk en el archivo de compilación de lanzamiento.

Akash Golui
fuente
7

Vaya al directorio del proyecto y ejecute el comando:

cd android && ./gradlew assembleRelease
Sidharth Taneja
fuente
Esto generará un apk sin firmar si no realizó la configuración requerida (como le dijo Pedram).
Gokhan Sari
Creará depuración, lanzamiento y apk sin firmar en la carpeta generada. Mi intención era compartir la versión apk.
Sidharth Taneja
6

Si obtiene un error relacionado con index.android.js. Esto se debe a que está utilizando la nueva versión nativa de React (estoy usando 0.55.4) Simplemente reemplace "index.android.js" por "index.js"

react-native bundle --platform android --dev false --entry-file index.js   --bundle-output android/app/src/main/assets/index.android.bundle   --assets-dest android/app/src/main/res/
Usman Kazmi
fuente
5

Tengo otra solución: - Generar una clave de firma Puede generar una clave de firma privada usando keytool. En Windows, Keytool debe ejecutarse desde C: \ Archivos de programa \ Java \ jdkx.x.x_x \ bin.

$ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

Coloque el archivo my-release-key.keystore en el directorio android / app en la carpeta de su proyecto.

Edite el archivo android / app / build.gradle en su carpeta de proyecto y agregue la configuración de firma,

android {
....
signingConfigs { 
  release { 

      storeFile file('my-release-key.keystore') 
      storePassword 'yourpassword' 
      keyAlias 'my-key-alias' 
      keyPassword 'yourpassword' 

  } 
}}}


buildTypes {release {signingConfig signingConfigs.release}}

y correr

gradlew assembleRelease

Esto le dará dos archivos en android \ app \ build \ salidas \ apk app-release.apk y app-release-unsigned.apk ahora instalan app-release.apk en su dispositivo Android.

Raman Bhasker
fuente
¿Dónde está la carpeta android \ app? No lo veo en mi proyecto (solo veo node_modules, y dentro de él, no hay android / aplicación)
DHLopez
1
@DHLopez tienes que usar el proyecto puro React Native para tener acceso a la carpeta de Android. Si está utilizando Expo, debe separar el proyecto Expo mediante la expulsión de la exposición.
fxbayuanggara
5

Esperemos que ayude a los nuevos principiantes.

Documento oficial aquí

Si no tiene un almacén de claves que usar antes del comando, omita

Generación de una clave de firma / archivo de almacén de claves Puede generar una clave de firma privada utilizando keytool. En Windows, Keytool debe ejecutarse desde C: \ Archivos de programa \ Java \ jdkx.x.x_x \ bin.

$ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

obtendrá un archivo como my-release-key.keystore

Configuración de variables de gradle Coloque el archivo my-release-key.keystore en el directorio android / app en la carpeta de su proyecto. Editar los archivos de Android / gradle.properties y agregue el siguiente (***** reemplazan con la contraseña correcta del almacén de claves, alias y contraseña de clave), enableAapt2 conjunto es falsa solución, como la versión Android 3.0 Gradle problema

MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
MYAPP_RELEASE_KEY_ALIAS=my-key-alias
MYAPP_RELEASE_STORE_PASSWORD=*****
MYAPP_RELEASE_KEY_PASSWORD=*****

android.enableAapt2=false

luego agregue estas aplicaciones / buid.gradle (aplicación)

debajo de la configuración predeterminada

signingConfigs {
        release {
            if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
                storeFile file(MYAPP_RELEASE_STORE_FILE)
                storePassword MYAPP_RELEASE_STORE_PASSWORD
                keyAlias MYAPP_RELEASE_KEY_ALIAS
                keyPassword MYAPP_RELEASE_KEY_PASSWORD
            }
        }

y versión de tipo Inside Build {}

 signingConfig signingConfigs.release

luego simplemente ejecute este comando en la terminal de Android Studio. A continuación, los comandos se automatizarán por encima de todas las respuestas

si ventanas

cd android
gradlew assembleRelease

si linux / mac

$ cd android
$ ./gradlew assembleRelease

si tiene algún error, elimine toda la carpeta de compilación y ejecute el comando

gradlew clean

que otra vez

gradlew assembleRelease
Abhishek Garg
fuente
1
Dios mío gradle clean... He estado luchando con esto durante un tiempo para obtener esos errores de compilación, ¡muchas gracias por esta respuesta!
nerdlinger
5

Para las últimas versiones nativas de reacción para agrupar el proyecto

Androide

react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/

iOS

react-native bundle --entry-file index.js --platform ios --dev false --bundle-output ios/main.jsbundle --assets-dest ios

Phani Sai
fuente
3

La forma de GUI en Android Studio

  • Haga que la aplicación de Android parte de la aplicación React Native se abra en Android Studio (esto solo significa abrir la carpeta de Android de su proyecto react-native con Android Studio)
  • Vaya a la pestaña "Crear" en la parte superior
  • Vaya a "Build Bundle (s) / APK (s)"
  • Luego seleccione "Crear APK (s)"
  • Esto lo guiará a través del proceso de ubicar sus claves para firmar el APK o crear sus claves si aún no las tiene, lo cual es muy sencillo. Si solo está practicando, puede generar estas claves y guardarlas en su escritorio.
  • Una vez que el proceso se haya completado y si la compilación fue exitosa, habrá una ventana emergente a continuación en Android Studio. Haga clic en el enlace que dice "localizar" (el APK)
  • Eso lo llevará al archivo apk, muévalo a su dispositivo Android. Luego navegue a ese archivo en el dispositivo Android e instálelo.
David Hudman
fuente
0

Usar android studio para generar apk firmado para el proyecto de android de react también es una opción buena y fácil, abrir el proyecto de android de react en android studio y generar pulsaciones de teclas y apk firmado.

Ahmad Sadiq
fuente
-2

Consulte la documentación oficial de react-native en Generating Signed APK

React-Native Generating Signed APK

Codemaker
fuente
Esta no es una buena respuesta, incluso si aborda la pregunta del usuario que no lo hace. Quieren crear un APK de depuración independiente, no uno de lanzamiento.
user37309