Android konnte das JS-Bundle nicht laden

201

Ich versuche, AwesomeProject auf meinem Nexus5 (Android 5.1.1) auszuführen.

Ich kann das Projekt erstellen und auf dem Gerät installieren. Aber wenn ich es starte, wird auf einem roten Bildschirm angezeigt

JS-Bundle kann nicht heruntergeladen werden. Haben Sie vergessen, den Entwicklungsserver zu starten oder Ihr Gerät anzuschließen?

In reaktivem nativem iOS kann ich jsbundle offline laden. Wie kann ich dasselbe für Android tun? (Oder zumindest, wo kann ich die Serveradresse konfigurieren?)

Aktualisieren

Führen Sie zum Ausführen mit einem lokalen Server die folgenden Befehle in Ihrem reaktionsnativen Projektstammverzeichnis aus

  1. react-native start > /dev/null 2>&1 &
  2. adb reverse tcp:8081 tcp:8081

Bitte werfen Sie einen Blick auf die Antwort von dsissitka, um weitere Einzelheiten zu erfahren.

Um ohne Server zu laufen, bündeln Sie die jsfile in der apk, indem Sie Folgendes ausführen:

  1. Erstellen Sie einen Assets-Ordner unter android/app/src/main
  2. curl "http://localhost:8081/index.android.bundle?platform=android" -o "android/app/src/main/assets/index.android.bundle"

Bitte werfen Sie einen Blick auf die Antwort von kzzzf für weitere Details.

Matthew
quelle
Stll hat das Problem noch nicht herausgefunden. In der Zwischenzeit können Sie es auf Ihrem Simulator ausprobieren. Es funktioniert perfekt für meine Genymotion.
Bryan
Wenn ich versuche, die beiden Befehle für die Ausführung mit dem lokalen Server einzugeben, wird in Powershell die Fehlermeldung "Das kaufmännische Und (&) ist nicht zulässig" angezeigt. Ich gehe davon aus, dass ich mich beim Ausführen des Befehls im Stammverzeichnis meines App-Verzeichnisses befinden sollte.
user2236165
1
Bedeutet dies, dass das Debuggen über USB unter Android 4.1 unmöglich ist, da adb reversees nicht unterstützt wird?
Bonh
Ich möchte erwähnen, dass adb reverse tcp:8081 tcp:8081Sie ADB 1.0.32 Version benötigen, um ausführen zu können , reverseOption ist nicht in 1.0.31
jvalen

Antworten:

109

So bündeln Sie die JS-Datei in Ihre apk, während auf Ihrem Server ( react-native start) das Bundle im Assets-Verzeichnis Ihrer App ausgeführt wird:

curl "http://localhost:8081/index.android.bundle?platform=android" -o "android/app/src/main/assets/index.android.bundle"

Mit der nächsten Version (0.12) werden wir den react-native bundleBefehl korrigieren, mit Android-Projekten wie erwartet zu arbeiten.

kzzzf
quelle
Danke! Wie kann ich reactInstanceManager anweisen, das gebündelte Asset zu verwenden? Oder geschieht die Magie einfach automatisch?
Matthew
9
Fehler beim Erstellen der Datei Warnung: android / app / src / main / assets / index.android.bundle: Keine solche Datei oder Warnung: Verzeichnis
almeynman
2
Warnung: Fehler beim Erstellen der Datei. Warnung: android / app / src / main / assets / index.android.bundle: Keine solche Datei oder Warnung: Verzeichniscurl: (23) Fehler beim Schreiben des Textkörpers (0! = 16167)
Shivang
3
@Shivang: Erstellen Sie die Verzeichnis-Assets in android / app / src / main. Ich hatte diesen Fehler, weil er noch nicht existierte.
Piscator
1
Dies ist der beste und einfachste Weg, wenn wir die App zu Testzwecken lokal verteilen. (via Stoff) danke
Dinesh Anuruddha
90

Folgendes hat es für mich unter Ubuntu 14.04 funktioniert:

cd (App Dir)
react-native start > /dev/null 2>&1 &
adb reverse tcp:8081 tcp:8081

Update : Siehe

Update 2 : @scgough Wir haben diesen Fehler erhalten, weil React Native (RN) kein JavaScript vom Entwickler-Server abrufen konnte, der auf unseren Workstations ausgeführt wird. Sie können hier sehen, warum dies passiert:

https://github.com/facebook/react-native/blob/42eb5464fd8a65ed84b799de5d4dc225349449be/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevServerHelper.java#L116-

Wenn Ihre RN-App erkennt, dass Sie Genymotion oder den Emulator verwenden, versucht sie, das JavaScript von GENYMOTION_LOCALHOST (10.0.3.2) oder EMULATOR_LOCALHOST (10.0.2.2) abzurufen. Andernfalls wird davon ausgegangen, dass Sie ein Gerät verwenden, und es wird versucht, das JavaScript von DEVICE_LOCALHOST (localhost) abzurufen. Das Problem ist, dass der Entwicklungsserver auf dem lokalen Host Ihrer Workstation und nicht auf dem Gerät ausgeführt wird. Damit es funktioniert, müssen Sie entweder:

dsissitka
quelle
5
Laufen AdB Reverse TCP: 8081 TCP: 8081 auf OSX funktioniert auch
Shyamal
Es klappt! Vielen Dank. Wissen Sie, ob es eine Möglichkeit gibt, jscodelocation auf apk-Ressourcen zu verweisen, genau wie bei main.jsbundle von iOS?
Matthew
@dsissitka kann ich nur fragen, damit es hier im Thread aufgezeichnet wird - was macht das genau?
Scgough
@ Matthew Angst nicht. Es tut uns leid!
Dsissitka
Was ist, wenn wir auf Android 4.2 laufen und diesen Fehler erhalten: stackoverflow.com/questions/31525431/…
Augustin Riedinger
39

Ok, ich glaube, ich habe herausgefunden, worum es hier geht. Es hatte mit der Version von zu tun, die watchmanich lief.

Führen Sie in einer neuen Shell Folgendes aus brew update : brew unlink watchman dann:brew install watchman

Jetzt können Sie react-native startvon Ihrem Projektordner aus ausführen

Ich lasse diese Shell geöffnet, erstelle ein neues Shell-Fenster und starte: react-native run-androidaus meinem Projektordner. Mit der Welt ist alles in Ordnung.

ps. Ich war ursprünglich auf Version 3.2 von Watchman. Dies hat mich auf 3.7 aktualisiert.

pps. Ich bin neu in diesem Bereich, daher ist dies möglicherweise nicht der schnellste Weg zur Lösung, aber es hat bei mir funktioniert.

* MEHR INFO FÜR DAS LAUFEN / DEBUGGEN EINES GERÄTS *

Wenn Sie Ihre App auf Ihrem Android-Gerät anstatt auf einem Emulater bereitstellen, wird möglicherweise ein roter Todesbildschirm mit einem Fehler angezeigtUnable to load JS Bundle . Sie müssen den Debug-Server für Ihr Gerät so einstellen, dass Ihr Computer reagiert ... entweder seinen Namen oder seine IP-Adresse.

  1. Drücken Sie die MenuGerätetaste
  2. Wählen Dev Settings
  3. Wählen Sie Debug server host for deviceoderChange Bundle Location
  4. Geben Sie die IP-Adresse Ihres Computers ein und laden Sie JS neu, sowie den Reaktionsport, z 192.168.1.10:8081

Weitere Informationen: http://facebook.github.io/react-native/docs/running-on-device-android.html

scgough
quelle
@ jacobross85 Ich bin froh, dass es geholfen hat! Gib mir eine Gegenstimme, wenn du Lust dazu hast ;-)
scgough
1
Musste laufen, brew uninstall watchmanbevor es die neueste Version für mich installieren würde.
Amozoss
Ich habe ein bisschen mehr Informationen für diejenigen hinzugefügt, die auf einem Android-Gerät debuggen, anstatt auf einem Emulator.
Scgough
Lief bereits die neueste Version von Watchman, aber das hat es für mich behoben. Weeeeird
pfac
1
Danke für diesen Bruder, es ist wirklich hilfreich. Deshalb gebe ich dir die Gegenstimme.
Priyank Jotangiya
17

Führen Sie in Ihrem Projektverzeichnis aus

react-native start

Es gibt Folgendes aus:

$ react-native start
 ┌────────────────────────────────────────────────────────────────────────────┐ 
   Running packager on port 8081.                                             
                                                                              
   Keep this packager running while developing on any JS projects. Feel       
   free to close this tab and run your own packager instance if you           
   prefer.                                                                    
                                                                              
   https://github.com/facebook/react-native                                  │ 
                                                                              
 └────────────────────────────────────────────────────────────────────────────┘ 
Looking for JS files in
   /home/user/AwesomeProject 


React packager ready.

[11:30:10 PM] <START> Building Dependency Graph
[11:30:10 PM] <START> Crawling File System
[11:30:16 PM] <END>   Crawling File System (5869ms)
[11:30:16 PM] <START> Building in-memory fs for JavaScript
[11:30:17 PM] <END>   Building in-memory fs for JavaScript (852ms)
[11:30:17 PM] <START> Building in-memory fs for Assets
[11:30:17 PM] <END>   Building in-memory fs for Assets (838ms)
[11:30:17 PM] <START> Building Haste Map
[11:30:18 PM] <START> Building (deprecated) Asset Map
[11:30:18 PM] <END>   Building (deprecated) Asset Map (220ms)
[11:30:18 PM] <END>   Building Haste Map (759ms)
[11:30:18 PM] <END>   Building Dependency Graph (8319ms)
Pēteris Caune
quelle
1
Ich habe auch das Problem, das das OP gemeldet hat. Ich führe das Projekt react-native run-androidaus dem Projektordner aus. Es baut OK im Terminal, aber sobald die App auf meinem Gerät geöffnet wird, werde ich rot Unable to download JS bundle
angezeigt und
6
Sie müssen adb reverse tcp: 8081 tcp: 8081
Matthew
1
Ich lief adb reverse tcp: 8081 tcp: 8081 und ich bekomme Fehler: geschlossen Fehler: geschlossen
JacobRossDev
1
Ich habe das gleiche Problem, Fehler: geschlossen. Hilfe bitte?
Eusthace
Stellen Sie sicher, dass Ihre IP-Adresse in den "Dev-Einstellungen" korrekt ist, wenn Sie mit Android arbeiten. Wenn Sie mit einer dynamischen IP arbeiten, kann sich dies über Nacht ändern.
Sam Purcell
13

Eine einfache Lösung, die für mich mit Ubuntu 14.04 funktioniert.

react-native run-android

Der Emulator (bereits gestartet) gibt Folgendes zurück: JS-Bundle kann nicht heruntergeladen werden; Starten Sie den JS-Server erneut:

react-native start

Klicken Sie im Emulator auf JS neu laden. Es hat bei mir funktioniert. Hoffe es wird helfen

Raphael_b
quelle
Funktioniert eigentlich. Von allen Antworten ist dies die einfachste Lösung. Ich kann nicht glauben, dass dies nicht im offiziellen Dokument steht.
Bluecollarcoder
Beim OP wird auf einem Gerät ausgeführt, nicht auf dem Emulator. Diese Schritte funktionieren auf einem Gerät ohne zusätzliche Einrichtung nicht. Siehe akzeptierte Antwort.
Davidgoli
8

In der App auf Android habe ich Menü (Befehl + M in Genymotion) -> Dev Settings -> Debug Server Host & Port für Gerät geöffnet

Setzen Sie den Wert auf: localhost: 8081

Es hat bei mir funktioniert.

Daniel Masarin
quelle
Vielen Dank! Arbeitete für mich
Howard
7

Nachdem ich hier eine Kombination der Antworten ausprobiert habe, funktioniert dies für mich.

Ich benutze Genymotion als meinen Emulator.

1 Starten Sie den Genymotion-Emulator.

2 Von einem Terminal

cd AwesomeProject
react-native run-android # it loads in genymotion and fails with bundle error
react-native start > /dev/null 2>&1 & # from dsissitka
adb reverse tcp:8081 tcp:8081 # from dsissitka

3 Laden Sie vom Emulator neu.

Es lädt!

Ich kann jetzt anfangen mich zu entwickeln.

ooolala
quelle
immer bekommen "Fehler: geschlossen" zweimal auf "adb reverse"
Almeynman
Zu Ihrer Information: Ich mache jetzt das oben Gesagte mit der Antwort "Daniel Masarin", den Debug-Server-Host auf meine WiFi-Adresse mit Port 8081 einzustellen. Er funktioniert mit RN v 0.17.0
ooolala
Vielen Dank, das funktioniert für mich :) auf oben API 21+ funktioniert nur so
Ashwini Bhat
4

Löschen Sie die App von Ihrem Handy! Ich habe mehrere Schritte versucht, aber das hat es schließlich geschafft.

  1. Wenn Sie zuvor versucht haben, Ihre App auszuführen, dies jedoch fehlgeschlagen ist, löschen Sie sie von Ihrem Android-Gerät.
  2. Lauf $ react-native run-android
  3. Öffnen Sie das React Rage Shake-Menü in Ihrer App auf Ihrem Android-Gerät und gehen Sie zu Dev Settingsund dann zu Debug server host & port for device. Geben Sie dort Ihre Server-IP (IP Ihres Computers) und Ihren Host ein 8081, z 192.168.50.35:8081. Auf einem Mac finden Sie die IP Ihres Computers unter System Preferences -> Network -> Advanced... -> TCP/IP -> IPv4 Address.
  4. Öffnen Sie das Rage Shake-Menü erneut und klicken Sie auf Reload JS.
Andru
quelle
2

Ich habe nicht genug Ruf, um einen Kommentar abzugeben, aber dies bezieht sich auf die Antwort von dsissitka. Es funktioniert auch unter Windows 10.

Um es noch einmal zu wiederholen, sind die Befehle:

cd (App Dir)
react-native start > /dev/null 2>&1 &
adb reverse tcp:8081 tcp:8081
Sean Saito
quelle
2

Hier sind die einfachen Schritte, um Ihre App auf Android (Release) auszuführen:

1. Wechseln Sie zu Ihrem Anwendungsstamm.

2. Führen Sie diesen Befehl aus.

reaktionsnatives Bundle - Plattform android --dev false - Eintragsdatei index.android.js - Bundle-Ausgabe android / app / src / main / assets / index.android.bundle --assets-dest android / app / src / main / res

Alle Ihre Dateien werden kopiert.

3. Erstellen Sie eine signierte APK.

Öffnen Sie Android Studio.

Erstellen> Signierte APK generieren> [Erforderliche Details eingeben, Tastendruck muss vor diesem Schritt generiert werden]

Ihre APK sollte fehlerfrei generiert werden. Installieren Sie auf Ihrem Gerät und dies sollte ohne Probleme funktionieren.

Sie können auch Ihr Gerät anschließen und direkt auf das Run-Symbol in Android Studio klicken, um es zu testen.


Tastenanschlag erzeugen:

  1. Gehen Sie zu C: \ Programme \ Java \ jdkx.x.x_x \ bin

  2. Lauf

keytool -genkey -v -keystore d: \ my_private_key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

Sie werden wahrscheinlich aufgefordert, einige Details einzugeben. Tun Sie es und Sie haben Ihre Keystroke-Datei ( my_private_key.keystore ), mit der Sie Ihre apk signieren können.

Edison D'souza
quelle
nachdem react-native bundleich Fehler bekommen habe: Doppelte Ressourcen
Amir Shabani
1

Ich habe dies unter Linux erhalten, nachdem ich den react-native run-androidProzess abgebrochen hatte . Der Knotenserver wird anscheinend noch ausgeführt. Wenn Sie ihn das nächste Mal ausführen, wird er nicht ordnungsgemäß ausgeführt und Ihre App kann keine Verbindung herstellen.

Die Lösung hier besteht darin, den Knotenprozess zu beenden, der in einem Xterm ausgeführt wird, den Sie beenden können, indem ctrl-cSie dieses Fenster öffnen (einfacher), oder Sie können ihn lsof -n -i4TCP:8081dann verwenden kill -9 PID.

Dann react-native run-androidwieder laufen .

Travis Reeder
quelle
1

Überprüfen Sie Ihre WLAN-Verbindung.

Eine andere Möglichkeit könnte sein, dass Sie entweder nicht mit WLAN verbunden sind, mit dem falschen Netzwerk verbunden sind oder die IP-Adresse in Ihren Entwicklungseinstellungen falsch ist. Aus irgendeinem Grund trennte sich mein Android vom WLAN und ich bekam diesen Fehler unwissentlich.

Kelsey
quelle
Danke, das war es. Standardmäßig wird der Debug-Server im lokalen Netzwerk erreicht. Wenn Sie keinen WLAN-Zugang haben, können Sie ihn daher nicht erreichen.
Paul
1

Läuft auf dem Gerät

Ich habe eine andere Antwort gefunden.

  • adb reverse: funktioniert nur unter Android 5.0+ (API 21).
  • Eine andere: Öffnen Sie das Entwicklermenü, indem Sie das Gerät schütteln, gehen Sie zu Dev Settings , gehen Sie zu Debug Server Host für Gerät , geben Sie die IP-Adresse Ihres Computers und den Port des lokalen Dev Server ein
Mike Nguyen
quelle
1

Ein Update

Jetzt unter Windows muss kein reaktionsnativer Start mehr ausgeführt werden. Der Packager wird automatisch ausgeführt.

Jagadish Upadhyay
quelle
1

Eine wichtige Sache, um zu überprüfen, ob bisher niemand etwas erwähnt hat: Überprüfen Sie Ihre lokale Firewall und stellen Sie sicher, dass sie ausgeschaltet ist .

Siehe meine Antwort hier: https://stackoverflow.com/a/41400708/1459275

Niltoid
quelle
0

Ich verwende nur Ubuntu und Android und konnte es nicht zum Laufen bringen. Ich habe eine wirklich einfache Lösung gefunden, die darin besteht, Ihre Datei package.json zu aktualisieren und diese Zeilen zu ändern:

"scripts": {
    "start": "node node_modules/react-native/local-cli/cli.js start"
  },

zu

"scripts": {
    "start": "adb reverse tcp:8081 tcp:8081 && node node_modules/react-native/local-cli/cli.js start"
  },

Und dann führen Sie den Server durch Eingabe aus

npm run start

Dadurch wird sichergestellt, dass das Android-Gerät auf Ihrem Computer nach dem Knotenserver sucht und nicht lokal auf dem Telefon.

IonicBurger
quelle
0

Die erste Frage betraf das erneute Laden der Anwendung in ein physisches Gerät.

Wenn Sie die Anwendung auf einem physischen Gerät (dh über adb) debuggen, können Sie das JS-Bundle neu laden, indem Sie oben links auf die Schaltfläche "Aktion" Ihres Geräts klicken. Dies öffnet das Optionsmenü (Reload, JS aus der Ferne debuggen ...).

Hoffe das hilft.

GuGuss
quelle
0

Dieser Fehler kann leicht durch die folgenden Schritte behoben werden:

    //run the command at /android sdk / platforms-tool folder
        adb reverse tcp:8081 tcp:8081

    //now come to root folder of your app
    1. npm start
    2. create 'assets' folder inside rootApp/android/app/src/main/
    3. curl "http://localhost:8081/index.android.bundle?platform=android" -o "android/app/src/main/assets/index.android.bundle"
    4. make sure anyone physical or virtual device attached is running.
    5. react-native run-android
Atif Hussain
quelle
1
Kann ich adb reverse tcp:8081 tcp:8081im Stammordner meiner App ausgeführt werden?
Marson Mao
Suchen Sie den ADB-Ordner in Ihrem Betriebssystem. Es ist in Android SDK / Plattform-Tools /
Atif Hussain
1
Aber ich sehe viele Stellen, die darauf hinweisen, dass dieser Befehl im App-Stammordner ausgeführt werden kann. Auch die Antwort von dsissitka legt nahe, dass er im Stamm-App-Ordner ausgeführt wird, also bin ich wirklich verwirrt.
Marson Mao
Möglicherweise wird dieser Befehl auch von react-native ausgeführt. ich bin mir darüber nicht sicher. aber adb wird von android sdk tools unterstützt. Weitere Details finden Sie hier facebook.github.io/react-native/docs/…
Atif Hussain
1
@MarsonMao Abhängig von Ihrem System-Setup können Sie möglicherweise adb in Ihrem App-Verzeichnis ausführen. Weitere Informationen finden Sie unter PATH-Variablen und globalen und lokalen Paketen.
Mchandleraz
0

Sie können den Anweisungen auf der offiziellen Seite folgen , um dieses Problem zu beheben. Dieses Problem tritt auf einem realen Gerät auf, da sich das JS-Bundle auf Ihrem Entwicklungssystem befindet und die App auf Ihrem realen Gerät den Standort nicht kennt.

mthakuri
quelle
0

In der neuen React Native (mit Sicherheit 0.59) befindet sich die Debug-Konfiguration android/app/src/debug/res/xml/react_native_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="false">localhost</domain>
    <domain includeSubdomains="false">10.0.2.2</domain>
    <domain includeSubdomains="false">10.0.3.2</domain>
  </domain-config>
</network-security-config>
Bobu
quelle
0

Starten Sie die beiden Terminals auf dem gleichen und 1. Terminal Run React-Native Start und Second Terminal React-Native Run-Android Dieses Problem wird auf einfache Weise gelöst. Und viel Glück

Chaurasia
quelle
0

Hey, ich hatte dieses Problem mit meinem reaktionsnativen Bare-Projekt. Der IOS-Simulator funktioniert einwandfrei, aber Android hat mir diesen Fehler immer wieder gegeben. Hier ist eine mögliche Lösung, die für mich funktioniert hat.

Überprüfen Sie in Schritt 1, ob das ADB-Gerät autorisiert ist, indem Sie es in Ihrem Terminal ausführen: ADB-Geräte

Wenn es nicht autorisiert ist, führen Sie die folgenden Befehle aus

Schritt 2, Sudo AdB Kill-Server Schritt 3, Sudo Adb Start-Server

Überprüfen Sie dann, ob der Befehl adb Geräte eine Liste der an das Emulator-5554-Gerät angeschlossenen Geräte anzeigt

statt nicht autorisiert, wenn es sich um ein Gerät handelt, anstatt nicht autorisiert

Schritt 4: Führen Sie npx react-native run-android aus

Dies hat in meinem Fall funktioniert. Ich hoffe, dies löst Ihr Problem.

Ali Shirazee
quelle
0

Ich fand das komisch, aber ich habe eine Lösung gefunden. Ich bemerkte, dass mein Projektordner von Zeit zu Zeit schreibgeschützt war und ich ihn nicht von VS speichern konnte. Also habe ich einen Vorschlag gelesen, NPM vom lokalen Benutzer PATH auf die systemweite globale Variable PATH zu übertragen, und es hat wie ein Zauber funktioniert.

Adriano Luiz Spanhol
quelle
-1

Das Ausführen von npm start aus dem reaktionsnativen Verzeichnis hat für mich funktioniert.

Sergey Onishchenko
quelle