Comment puis-je générer un apk qui peut fonctionner sans serveur avec react-native?

211

J'ai construit mon application, je peux l'exécuter sur mon émulateur local (et aussi sur mon appareil Android au sein du même réseau en changeant de serveur de débogage).

Cependant, je veux créer un APK que je peux envoyer à quelqu'un sans accès au serveur de développement et je veux qu'il puisse tester l'application.

Je vois qu'il y a une section Utilisation du bundle hors ligne sur la section iOS de la documentation. Mais je n'arrivais pas à comprendre comment accomplir la même chose pour Android. Est-ce possible? Si c'est le cas, comment?

MISE À JOUR: Sur la réponse à cette question ( Android n'a pas pu charger le bundle JS ), il est dit que le bundle hors ligne peut être téléchargé depuis le serveur de développement. Mais lorsque j'obtiens le bundle du serveur de développement, les fichiers image ne peuvent pas être chargés.

Gokhan Sari
la source
vérifiez cet exemple simple pour générer un fichier apk: React Native Generate Release APK via Windows Command Prompt Android
sumit kumar pradhan

Réponses:

204

Suite à la réponse d'Aditya Singh, l'apk généré (non signé) ne s'installerait pas sur mon téléphone. J'ai dû générer un apk signé en utilisant les instructions ici .

Ce qui suit a fonctionné pour moi:

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

Placez le my-release-key.keystorefichier sous le android/app répertoire de votre dossier de projet. Modifiez ensuite le fichier ~/.gradle/gradle.propertieset ajoutez ce qui suit (remplacez **** par le mot de passe, l'alias et le mot de passe de clé corrects)

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

Si vous utilisez MacOS, vous pouvez stocker votre mot de passe dans le trousseau en utilisant les instructions ici au lieu de le stocker en texte clair.

Ensuite, modifiez app / build.gradle et assurez-vous que les éléments suivants sont présents (les sections avec signatureConfigs. SignatureConfig peuvent devoir être ajoutées):

...
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
        }
    }
}
...

Exécutez ensuite la commande cd android && ./gradlew assembleRelease,

Pour Windows 'cd android' puis exécutezgradlew assembleRelease commande, et trouvez votre apk signé sousandroid/app/build/outputs/apk/app-release.apk

Pedram
la source
10
Il s'agit de la réponse la plus récente et la plus précise. Merci.
Gokhan Sari
2
app-release.apk n'est pas en cours d'installation. quel serait le problème?
Balasubramanian
1
Je crée l'apk, télécharge sur google play, mais cela ne fonctionne pas ... un indice?
Italo Rodrigo
2
Je ne trouve pas le dossier android / app, où est-il situé?
DHLopez
6
Merci, ce n'était pas le cas, mais je l'ai trouvé parce que j'utilise expo pour les tests, et la création de l'application native npm a une structure différente, donc pour référence future, si quelqu'un rencontre ce problème, éjectez simplement votre projet et vous obtenez ces dossiers, drôle comment le tutoriel vous dit d'utiliser npm pour créer l'application, puis parle d'une structure qui n'existe pas lorsque vous l'utilisez
DHLopez
194

Vous devrez créer une clé pour signer l'apk. Utilisez ci-dessous pour créer votre clé:

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

Utilisez un mot de passe lorsque vous y êtes invité

Une fois la clé générée, utilisez-la pour générer la version installable:

 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/

Générez le build en utilisant gradle

 cd android && ./gradlew assembleRelease

Téléchargez l'APK sur votre téléphone. Le -rdrapeau remplacera l'application existante (si elle existe)

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

Une description plus détaillée est mentionnée ici: https://facebook.github.io/react-native/docs/signed-apk-android.html

MISE À JOUR : Basé sur les commentaires de @shashuec et @Fallen

si vous obtenez une erreur

ENOENT: aucun fichier ou répertoire de ce type, ouvrez 'android / app / src / main / assets / index.android.bundle'

exécutez mkdir android / app / src / main / assets

Aditya Singh
la source
4
Merci beaucoup pour ça, ça a marché pour moi. Le seul problème que j'ai eu était ce message: "Missing required arguments: bundle-output" dans la partie react-native-bundle, mais est résolu en supprimant les 2 symboles "\"
guinunez
59
Je suis étonné par la mauvaise documentation de Facebook où ils ont totalement omis la react-native bundlepartie. Merci pour votre réponse!
technophyle
2
Je travaille avec des fenêtres, fonctionne aussi avec cela gradlew.bat assembleRelease.
Tabares
12
Je reçois cette erreur Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES] . quand j'essaie d'installer l'apk.
developernaren
18
si vous obtenez l' erreur ENOENT: no such file or directory, open 'android/app/src/main/assets/index.android.bundle' runmkdir android/app/src/main/assets
shashuec
31

Vous devez simplement utiliser Android Studio pour ce processus. C'est simplement plus simple. Mais exécutez d'abord cette commande dans le répertoire de votre application native:

Pour une version plus récente de react-native (par exemple react native 0.49.0 et ainsi de suite ...)

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

Pour la version plus ancienne de react-native (0.49.0 et ci-dessous)

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/

Ensuite, utilisez Android Studio pour ouvrir le dossier `` Android '' dans votre répertoire d'application natif, il vous demandera de mettre à niveau Gradle et d'autres choses. allez dans build-> Générer un APK signé et suivez les instructions à partir de là. C'est vraiment simple.

Mike Axle
la source
J'utilise également Android Studio et Xcode pour créer des versions pour mes applications React Native ... mais la génération Android pourrait se faire avec un script tel que décrit par @Aditya Singh
WiRa
Ce n'est plus nécessaire proandroiddev.com/…
onmyway133
30

Exécutez cette commande:

react-native run-android --variant=release

Notez que cela --variant=releasen'est disponible que si vous avez configuré la signature avec cd android && ./gradlew assembleRelease.

Ahmed Ashraf
la source
@jasan J'ai trouvé un autre problème comme le vôtre ici: github.com/facebook/react-native/issues/11586 Cela peut résoudre le problème: cd android && ./gradlew installRelease
Ahmed Ashraf
J'ai essayé cd android && ./gradlew installReleaseet obtenu cette erreurTask 'assembleRelease.' not found in root project 'project'. Some candidates are: 'assembleRelease'.
ThomasReggi
Oui, vous devez générer le fichier Keystore. et modifiez le fichier gradle.Suivez ces instructions pour résoudre ce problème. facebook.github.io/react-native/docs/signed-apk-android.html
Ahmed Ashraf
21

pour React Native 0.49 et plus

vous devez aller dans le répertoire du projet sur le terminal et exécuter cette commande

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 moins de 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

Ensuite, utilisez Android Studio pour ouvrir le dossier `` Android '' dans votre répertoire d'application natif, il vous demandera de mettre à niveau Gradle et d'autres choses. allez dans build-> Générer un APK signé et suivez les instructions à partir de là. Ça va.

Yasin Ugurlu
la source
C'est un moyen facile de le faire si vous avez installé Android Studio (qui se chargera d'utiliser ou de créer le Keystore). Merci.
leosok
Hé .. avez une question rapide .. les étapes ci-dessus sont-elles nécessaires? Le doc natif de Rea ne le mentionne nulle part ..
pravin
1
@pravin ce n'est pas obligatoire, c'est une des méthodes de la génération apk.
Yasin Ugurlu
12

Si vous obtenez Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES].

J'ai essayé d'utiliser la méthode de @ Aditya pour générer un fichier APK non signé et l'installer, mais quand je suis allé l'installer sur ma tablette Android, cela m'a donné une erreur de Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES].

J'imagine que c'est parce que le fichier APK n'était pas signé et que la tablette n'était pas satisfaite de cela. Ainsi, après avoir généré le fichier bundle React Native, j'ai pu générer un fichier APK signé, comme d'habitude, via Android Studio.

Soit dit en passant, notre application est une application Android pleinement fonctionnelle qui existe déjà dans le Play Store et nous y ajoutons simplement React Native en morceaux de la taille d'une bouchée, car c'est génial.

Donc, pour résumer, voici mes étapes:

1) Générez le bundle React Native:

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) Générez un fichier APK signé à partir d'Android Studio.

3) Installez le fichier APK signé sur le périphérique USB:

adb -d install -r <path_to_signed_apk> 

L' -dindicateur indique simplement adbd'installer sur le périphérique USB connecté, dans le cas où vous avez également un émulateur en cours d'exécution. Si vous souhaitez installer sur n'importe quel émulateur, déposez le -ddrapeau.

4) Profit!

Joshua Pinter
la source
11

Essayez ci-dessous, il générera un app-debug.apk sur votre dossier racine / android / app / build / outputs / 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

puis allez dans le dossier android et exécutez

./gradlew assembleDebug

mon frère
la source
L'APK généré ici a besoin de Metro pour fonctionner ... donc je pense qu'il utilise toujours le serveur de développement
nerdlinger
11

Si quelqu'un veut construire sans clés playstore, cette commande serait très utile.

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

Une fois la construction terminée, vous pouvez trouver l'apk dans le fichier de version.

Akash Golui
la source
7

Accédez au répertoire du projet et exécutez la commande:

cd android && ./gradlew assembleRelease
Sidharth Taneja
la source
Cela générera une apk non signée si vous n'avez pas fait la configuration requise (comme Pedram l'a dit).
Gokhan Sari
Il créera le débogage, la libération et l'apk non signé dans le dossier généré. Mon intention était de partager la version apk.
Sidharth Taneja
6

Si vous obtenez une erreur impliquant index.android.js. C'est parce que vous utilisez la nouvelle version native de React (j'utilise la version 0.55.4) Remplacez simplement "index.android.js" par "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
la source
5

J'ai une autre solution: - Génération d'une clé de signature Vous pouvez générer une clé de signature privée à l'aide de keytool. Sous Windows, le keytool doit être exécuté à partir de C: \ Program Files \ Java \ jdkx.x.x_x \ bin.

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

Placez le fichier my-release-key.keystore sous le répertoire android / app dans votre dossier de projet.

Modifiez le fichier android / app / build.gradle dans votre dossier de projet et ajoutez la configuration de signature,

android {
....
signingConfigs { 
  release { 

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

  } 
}}}


buildTypes {release {signingConfig signingConfigs.release}}

et courir

gradlew assembleRelease

Cela vous donnera deux fichiers dans android \ app \ build \ outputs \ apk app-release.apk et app-release-unsigned.apk maintenant installez app-release.apk sur votre appareil Android.

Raman Bhasker
la source
Où est le dossier android \ app? Je ne le vois pas sous mon projet (je ne vois que node_modules, et à l'intérieur de celui-ci, il n'y a pas d'android / app)
DHLopez
1
@DHLopez vous devez utiliser le pur projet React Native pour avoir accès au dossier android. Si vous utilisez Expo, vous devez détacher le projet Expo en utilisant expo eject.
fxbayuanggara
5

J'espère que cela aidera les nouveaux débutants

Doc officiel ici

Si vous n'avez pas de magasin de clés à utiliser avant la commande, sinon, ignorez

Génération d'une clé de signature / d'un fichier de clés Vous pouvez générer une clé de signature privée à l'aide de keytool. Sous Windows, le keytool doit être exécuté à partir de C: \ Program Files \ Java \ jdkx.x.x_x \ bin.

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

vous obtiendrez un fichier comme my-release-key.keystore

Configuration des variables gradle Placez le fichier my-release-key.keystore sous le répertoire android / app dans votre dossier de projet. Modifier le fichier / Android gradle.properties et ajoutez la ligne suivante (remplacer ***** avec le mot de passe correct keystore, alias et mot de passe clé), enableAapt2 set faux est solution de contournement, en tant que version Android 3.0 gradle problème

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

puis ajoutez ces app / buid.gradle (app)

sous la configuration par défaut

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
            }
        }

et version de type Inside Build {}

 signingConfig signingConfigs.release

puis exécutez simplement cette commande dans le terminal de studio Android. Les commandes ci-dessous automatiseront surtout les réponses

si windows

cd android
gradlew assembleRelease

si linux / mac

$ cd android
$ ./gradlew assembleRelease

si vous avez une erreur, supprimez tout le dossier de construction et exécutez la commande

gradlew clean

que de nouveau

gradlew assembleRelease
Abhishek Garg
la source
1
omg gradle clean... J'ai du mal avec cela pendant un certain temps à obtenir ces erreurs de construction, merci beaucoup pour cette réponse !!
nerdlinger
5

Pour les dernières versions natives de Reaper pour regrouper le projet

Android

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
la source
3

La manière GUI dans Android Studio

  • Ouvrez la partie application Android de l'application React Native dans Android Studio (cela signifie simplement ouvrir le dossier android de votre projet react-native avec Android Studio)
  • Allez dans l'onglet "Build" en haut
  • Descendez dans "Build Bundle (s) / APK (s)"
  • Sélectionnez ensuite "Créer APK (s)"
  • Cela vous guidera à travers un processus de localisation de vos clés pour signer l'APK ou de création de vos clés si vous ne les avez pas déjà, ce qui est très simple. Si vous vous entraînez, vous pouvez générer ces clés et les enregistrer sur votre bureau.
  • Une fois ce processus terminé et si la construction a réussi, il y aura une fenêtre contextuelle ci-dessous dans Android Studio. Cliquez sur le lien à l'intérieur qui dit "localiser" (l'APK)
  • Cela vous amènera au fichier apk, déplacez-le sur votre appareil Android. Ensuite, accédez à ce fichier sur l'appareil Android et installez-le.
David Hudman
la source
0

L'utilisation d'Android Studio pour générer une apk signée pour le projet Android de React est également une option simple et efficace, ouvrez le projet Android de React dans Android Studio et générez une frappe et une apk signée.

Ahmad Sadiq
la source
-2

Reportez-vous à la documentation officielle de react-native sur Génération d'APK signé

Génération signée React-Native APK

Codemaker
la source
Ce n'est pas une bonne réponse, même si elle répond à la question de l'utilisateur, ce qu'elle ne fait pas. Ils veulent construire un APK de débogage autonome, pas une version.
user37309