Nicht signierte apk auf dem Gerät ohne Entwicklungsserver erstellen und installieren?

174

Da ich neu in React-Native bin, lassen Sie es mich wissen, wenn in Schritten etwas nicht stimmt.

Ich habe eine reaktionsfähige native Android-App mit dem Befehl gemäß Dokumentation erstellt

reagieren native Android

Während der Ausführung auf dem Gerät wurde der folgende Befehl verwendet

React-Native Run-Android

Das gibt mir die Ausgabe von 2 apk-Dateien in meinem Projektordner / android / app / build / output / apk

Geben Sie hier die Bildbeschreibung ein

Wenn ich jetzt diese apk nach der Installation installiere, frage ich nach einem Entwicklungsserver, der eine Verbindung herstellt, um die JS zu bündeln. Aber meine Anforderung ist, dass der Benutzer nicht mit dem Entwicklungsserver zu kämpfen hat, sondern nur die apk installieren muss und alles erledigt ist.

Ich habe einige Fragen zum Stackoverflow durchlaufen, bin aber nicht hilfreich, um eine nicht signierte Apk zu erstellen, für die kein Entwicklungsserver erforderlich ist.

Könnt ihr mir helfen, den Weg zu finden, wie man apk baut und nicht signiert, um native zu reagieren?

kAy_4337270
quelle
1
Führen Sie 'react-native start' aus, um Ihr js-Bundle im Entwicklungsmodus zu bedienen. Der Zweck ist, dass Sie js-Dateien im laufenden Betrieb bearbeiten können. Der Release-Modus benötigt keinen Server, da er das erforderliche Bundle enthält. Siehe Antwort unten
Kar

Antworten:

263

Sie müssen das Bundle für einen Debug-Build manuell erstellen.

Bundle-Debug-Build:

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

#React-Native 0.49.0+
react-native bundle --dev false --platform android --entry-file index.js --bundle-output ./android/app/build/intermediates/assets/debug/index.android.bundle --assets-dest ./android/app/build/intermediates/res/merged/debug

#React-Native 0-0.49.0
react-native bundle --dev false --platform android --entry-file index.android.js --bundle-output ./android/app/build/intermediates/assets/debug/index.android.bundle --assets-dest ./android/app/build/intermediates/res/merged/debug

So erstellen Sie die APKs nach dem Bündeln:

$ cd android
#Create debug build:
$ ./gradlew assembleDebug
#Create release build:
$ ./gradlew assembleRelease #Generated `apk` will be located at `android/app/build/outputs/apk`

PS Ein anderer Ansatz könnte darin bestehen, Gradle-Skripte zu ändern.

Dmitry Mugtasimov
quelle
3
Falls jemand Vermögenswerte vermisst: das hat bei mir funktioniert--assets-dest ./android/app/src/main/res/
Juan Solano
13
Und wenn ich dadurch beim Starten der App einen großen roten Bildschirm bekomme? (Hinweis: Ich führe dies direkt nach dem Auswerfen aus)
Simon Forsberg
3
Wie erstelle ich die neueste Version, da wir nicht index.android.js haben?
Vivek
9
Personen mit der neuesten Version ändern bitte den Einstiegspunkt in --entry-file index.js, danke.
Rishabh Bhatia
4
reaktionsnatives Bundle --dev false --plattform android --entry-file index.js --bundle-output ./android/app/build/intermediates/assets/debug/index.android.bundle --assets-dest. / android / app / build / intermediates / res / fusioniert / debug für die neue reaktionsfähige Version, in der die index.js für ios und android vereinheitlicht wird
ir2pid
104

Bitte befolgen Sie diese Schritte.

Bündeln Sie Ihre js:

Wenn Sie index.android.js im Projektstamm haben, führen Sie es aus

react-native bundle --dev false --platform android --entry-file index.android.js --bundle-output ./android/app/build/intermediates/assets/debug/index.android.bundle --assets-dest ./android/app/build/intermediates/res/merged/debug

Wenn Sie index.js im Projektstamm haben, führen Sie es aus

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

Debug apk erstellen:

cd android/
./gradlew assembleDebug

Dann finden Sie Ihre apk hier:

cd app/build/outputs/apk/
m4r00p
quelle
11
Und wenn ich dadurch beim Starten der App einen großen roten Bildschirm bekomme? (Hinweis: Ich führe dies direkt nach dem Auswerfen aus)
Simon Forsberg
2
@ SimonForsberg, wenn Sie reagieren ^ 0.5 verwenden, ändern Sie den Einstiegspunkt in index.js anstelle von App.js oder index.android.js, react-native bundle --dev false --platform android --entry-file index.js --bundle-output ./android/app/build/intermediates/assets/debug/index.android.bundle --assets-dest ./android/app/build/intermediates/res/merged/debug
d.bayo
3
Funktioniert nicht, dies befiehlt das Erstellen einer Apk, aber diese Apk läuft nicht ohne Packager-Server.
Vishal Chhodwani
1
Dies wird nicht funktionieren, da es einen
Entwickler-
1
Ich habe das gleiche Problem, wenn ich das Debug-APK generiere, könnte ich es installieren, aber ich brauche den Entwicklungsserver, und wenn ich das Release-APK verwende, kann ich es nicht auf meinem Telefon installieren, ich weiß nicht was ist falsch damit
aName
69

Neuestes Update

In Ihrem Stammprojektverzeichnis

Stellen Sie sicher, dass Sie bereits das Verzeichnis android / app / src / main / assets / haben. Wenn Sie kein Verzeichnis erstellen, erstellen Sie anschließend eine neue Datei und speichern Sie unter index.android.bundleund legen Sie Ihre Datei wie folgt ab: android / app / src / main / assets / index.android .bündeln

Danach führen Sie dies aus

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/

cd android && ./gradlew assembleDebug

Dann können Sie apkin app / build / output / apk / debug / app-debug.apk gelangen

Jeeva
quelle
Diese Antwort funktioniert wirklich, vielen Dank,
aName
Diese Antwort funktioniert wirklich, vielen Dank,
aName
@jeeva: Wie verbinde ich die Anwendung wieder mit dem Entwicklungsserver von React Native?
Mayur Baldha
Der Punkt, der erstellt index.android.bundlewird , ist wirklich wichtig, um den Entwicklungsserver nicht im Host zu verwenden.
Lee Elton
@ Mayur Balha: Sie können eine Verbindung über USB oder WLAN (verbunden im selben Netzwerk) herstellen. Wenn Sie in Ihrer Reaktions-App eine WiFi-Verbindung zum Server herstellen möchten, schütteln Sie Ihr Handy auf dem Emulator. Drücken Sie Win + R und klicken Sie dann auf Entwicklereinstellungen. Scrollen Sie nach unten Terminal geben Sie "ifconfig") wie 192.168.1.1:8080 ein und drücken Sie dann erneut OK, schütteln Sie oder drücken Sie Win + R für den Emulator. Drücken Sie reload.
Jeeva
29

Führen Sie bei mir im Projektverzeichnis die folgenden Befehle aus.

Für die Reaktion auf eine native alte Version (Sie sehen index.android.js im Stammverzeichnis):

mkdir -p android/app/src/main/assets && rm -rf android/app/build && 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 && cd android && ./gradlew clean assembleRelease && cd ../

Für die Reaktion auf eine native neue Version (Sie sehen nur index.js im Stammverzeichnis):

mkdir -p android/app/src/main/assets && rm -rf android/app/build && 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 && cd android && ./gradlew clean assembleRelease && cd ../

Die apk-Datei wird generiert unter:

  • Gradle <3.0: android / app / build / output / apk /
  • Gradle 3.0+: android / app / build / output / apk / release /
Nhan Cao
quelle
Können Sie bitte etwas näher darauf eingehen und wie löst es das Problem?
Priyal
Ich habe einen Fehler beim Öffnen in index.android.bundle erhalten und ihn durch Ihren Vorschlag behoben. Vielen Dank ... :)
Zephyr
6
Für mich ist es$ mkdir -p android/app/src/main/assets && rm -rf android/app/build && 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 && cd android && ./gradlew assembleDebug
Arif
Datei nicht gefunden: index.android.js in einem der Projektwurzeln
Anuj
1
Beachten Sie, dass --entry-file index.android.jsdies --entry-file index.jsfür neuere Projekte ersetzt werden muss, die sich index.jsnicht index.android.jsim Stammverzeichnis ihres Projektverzeichnisses befinden.
Daka
9

Nachdem Sie der ersten Antwort gefolgt sind , können Sie Ihre App mit ausführen

react-native run-android --variant=debug

Und Ihre App wird ohne den Packager ausgeführt

Abdellah Alaoui
quelle
1
Die einfachste Antwort war die effizienteste, sie funktionierte einwandfrei, verbrachte Tage damit, verschiedene Befehlszeilen und Tonnen von JS-Konfigurationen zu testen, und alles wurde in diesem Fall wieder aufgenommen
Nicolas Silva
6

Ab reaktionsnativ 0,57 funktioniert keine der zuvor bereitgestellten Antworten mehr, da sich die Verzeichnisse, in denen gradle erwartet, das Bundle und die Assets zu finden, geändert haben.

Einfacher Weg ohne reaktionsnatives Bundle

Der einfachste Weg, einen Debug-Build zu erstellen, besteht darin, den react-native bundleBefehl überhaupt nicht zu verwenden, sondern einfach Ihre app/build.gradleDatei zu ändern .

Fügen Sie innerhalb der project.ext.reactKarte in der app/build.gradleDatei den bundleInDebug: trueEintrag hinzu. Wenn Sie möchten, dass es sich nicht um einen --devBuild handelt (keine Warnungen und minimiertes Bundle), sollten Sie den devDisabledInDebug: trueEintrag auch derselben Karte hinzufügen .

Mit reaktionsnativem Bundle

Wenn Sie aus irgendeinem Grund den react-native bundleBefehl zum Erstellen des Bundles und dann ./gradlew assembleDebugzum Erstellen der APK mit dem Bundle und den Assets verwenden müssen oder möchten, müssen Sie sicherstellen, dass das Bundle und die Assets in den richtigen Pfaden platziert werden, wo gradle dies kann finde sie.

Ab reaktionsnativ 0,57 sind diese Pfade android/app/build/generated/assets/react/debug/index.android.jsfür das Bündel

und android/app/build/generated/res/react/debugfür die Vermögenswerte. Die vollständigen Befehle zum manuellen Bündeln und Erstellen der APK mit dem Bundle und den Assets lauten also:

react-native bundle --dev false --platform android --entry-file index.js --bundle-output ./android/app/build/generated/assets/react/debug/index.android.bundle --assets-dest ./android/app/build/res/react/debug

und dann

./gradlew assembleDebug

Bundle- und Assets-Pfad

Beachten Sie, dass sich die Pfade, in denen gradle nach dem Bundle und den Assets sucht, möglicherweise ändern. Um herauszufinden, wo sich diese Pfade befinden, sehen Sie sich die react.gradleDatei in Ihrem node_modules/react-nativeVerzeichnis an. Die Zeilen beginnen mit def jsBundleDir =und def resourcesDir =geben die Verzeichnisse an, in denen gradle nach dem Bundle bzw. den Assets sucht.

TheBaj
quelle
Die vorgeschlagenen Pfade stimmen nicht mit dem resultierenden react-native bundleBefehl überein . Und keine der Varianten führt dazu, dass das Bundle Teil der APK mit React Native 0.63 ist. Siehe die Beschreibung im Fehler, der an React Native CLI-Dokumente gemeldet wurde .
Radek Matěj
Aber danke für den Vorschlag mit bundleInDebug. Das ist der richtige Weg. Die Verwendung react-native bundlemacht keinen Sinn, wenn es Gradle-Skripte gibt, die sich um alles kümmern.
Radek Matěj
Die Pfade haben sich möglicherweise von "native native 0,57" bis jetzt geändert, daher weiß ich nicht, ob die Pfade noch auf dem neuesten Stand sind.
TheBaj
Ja, sie haben sich dramatisch verändert . Ihre Antwort kommt der optimalen Lösung immer noch am nächsten. Ich möchte nur einen Hinweis hinzufügen, dass keiner dieser Pfade mehr funktioniert.
Radek Matěj
4

Nur für den Fall, dass kürzlich jemand anderes auf dasselbe Problem stößt, verwende ich React Native 0.59.8 (ebenfalls mit RN 0.60 getestet) und kann einige der anderen Antworten bestätigen. Hier sind die Schritte:

  1. Deinstallieren Sie die neueste kompilierte Version Ihrer App, die Sie auf Ihrem Gerät installiert haben

  2. Lauf 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

  3. Lauf cd android/ && ./gradlew assembleDebug

  4. Holen Sie sich Ihre app-debug.apk in den Ordner android / app / build / output / apk / debug

Viel Glück!

HugoRMR
quelle
1
Funktioniert nicht !!!, es generiert die Debug-APK, aber die App benötigt noch den Dev-Server
aName
Dies kann in reaktionsnativen 0,59,8 nicht funktionieren, da gradle erwartet, dass sich das Bundle in android/app/build/generated/assets/react/debug/index.android.jsund die Assets in reaktionsnativen android/app/build/generated/res/react/debug0,57 befinden.
TheBaj
Funktioniert gut für die Reaktion native 0.60>
Moso Akinyemi
3

Für Windows-Benutzer, wenn alle Schritte ordnungsgemäß ausgeführt wurden: https://facebook.github.io/react-native/docs/signed-apk-android.html

Sie müssen nur ausführen: gradlew assembleRelease

Und Ihre Datei wird sein:

  • app-release.apk
  • app-release-unaligned.apk

Ort: E:\YourProjectName\android\app\build\outputs\apk

Dharam Mali
quelle
Sie können app-release.apk auf jedem Gerät installieren / freigeben
Dharam Mali
2
Normalerweise hat der Debug-Build eine andere Konfiguration als der Release-Build (z. B. verwendet er eine Staging-API). Dies hilft nicht, wenn Sie eine eigenständige APK möchten, die eine andere Build-Konfiguration als die Version verwendet
Josh
Diese APK dient nur zu Entwicklungs- / Testzwecken.
Dharam Mali
3

Ich bin auf native 5.5.4 reagieren, im Grunde musste ich manuell bündeln:

react-native bundle --dev false --platform android --entry-file index.js --bundle- 
output ./android/app/build/intermediates/assets/debug/index.android.bundle --assets- 
dest ./android/app/build/intermediates/res/merged/debug

Verbinden Sie dann Ihr Gerät über USB und aktivieren Sie das USB-Debugging. Überprüfen Sie das angeschlossene Gerät mit adb devices.

Zuletzt ausführen, react-native run-androidwodurch das Debug-Apk auf Ihrem Telefon installiert wird und Sie es problemlos mit dem Dev-Server ausführen können

Hinweis:

  • Ab 0,49,0 ist der Einstiegspunkt ein einzelner index.js
  • gradlew assembleRelease generiert nur die nicht signierten apks, die nicht installiert werden können
Shem Leong
quelle
3

Es kann möglich sein, eine nicht signierte apk-Version zu Testzwecken zu generieren, damit Sie sie auf Ihrem Handy ausführen können.

Anfangs habe ich die roten Bildschirmfehler bekommen, wie hier am meisten erwähnt. aber ich folgte dem gleichen, das hier erwähnt wurde und es funktionierte für mich.

Führen Sie diese vier Befehle auf Ihrer Konsole im Arbeitsverzeichnis aus

react-native bundle --dev false --platform android --entry-file index.js --bundle-output ./android/app/build/intermediates/assets/debug/index.android.bundle --assets-dest ./android/app/build/intermediates/res/merged/debug

cd android

gradlew assembleDebug

gradlew assembleRelease

Und dann wird die APK-Datei erstellt unter: android \ app \ build \ output \ apk \ debug \ app-debug.apk

user3195905
quelle
0

Ich habe eine Lösung gefunden, die buildTypes wie folgt ändert:

buildTypes {
  release {
    signingConfig signingConfigs.release
  }
}
Sumit Kumar Pradhan
quelle