błąd „Nie można pobrać BatchedBridge, upewnij się, że pakiet jest prawidłowo zapakowany” podczas uruchamiania aplikacji


167

Próbując stworzyć natywny projekt na Androida 4.4.2, pojawia się ten ekran błędu

wspomniany błąd

i nie mogłem znaleźć sposobu, aby go rozwiązać. Próbowałem zrestartować program pakujący, ponownie podłączyć urządzenie, a nawet ponownie zainstalować React Native i rozpocząć nowy projekt. W wersji 6.0.0 i nowszych działa dobrze.


1
Czy otrzymałeś ten błąd po wykonaniu react-native run-android? W tym przypadku pojawia się błąd, który jest dziwny, ponieważ w trybie debugowania pakiet JS afaik nie powinien być potrzebny, ponieważ ma łączyć się z serwerem pakietów.
Ryan H.

Odpowiedź na ten sam problem zamieściłem tutaj: stackoverflow.com/a/45110063/706798
Anton

Otrzymuję ten sam komunikat o błędzie, ale na iOS. Czy ktoś ma radę? Próbowałem uruchomić 'react-native run-ios', ale to nie działa, ponieważ XCode jest dla mnie na dysku zewnętrznym.
ryanwebjackson

Odpowiedzi:


145

Możliwym rozwiązaniem jest to, że najprawdopodobniej najpierw nie pakujesz aplikacji w pakiet, wykonaj następujące kroki, a następnie wdróż plik app-debug.apk na swoim urządzeniu

$ cd myproject  
$ react-native start > /dev/null 2>&1 &  
$ curl "http://localhost:8081/index.android.bundle?platform=android" -o "android/app/src/main/assets/index.android.bundle"

(jeśli folder assetsnie istnieje, utwórz go)

Następnie uruchom z katalogu głównego projektu

$> (cd android/ && ./gradlew assembleDebug)

zainstaluj utworzony apk na swoim urządzeniu z lokalizacji: android/app/build/outputs/apk/app-debug.apk

daj mi znać, jeśli to rozwiąże problem

EDYCJA :

Możesz po prostu umieścić go w swoim pliku package.json jako skrypt, aby go zautomatyzować, wierzę, że zostanie to naprawione w nadchodzących wydaniach react-native i zostanie wykonane przed złożeniem ostatecznego APK, więc nie będzie to potrzebne (mam nadzieję także)

położyć :

"scripts": {
    "build": "(cd android/ && ./gradlew assembleDebug)",
    "start": "node node_modules/react-native/local-cli/cli.js start",
    "bundle-android": "react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output android/app/src/main/assets/index.android.bundle --sourcemap-output android/app/src/main/assets/index.android.map --assets-dest android/app/src/main/res/"
  },

lub, jak wspomniano, odpowiednik curl, ale w większości przypadków powyższy jest bardziej wytrzymały


4
Tak to działa!!! Co ja właśnie zrobiłem? dlaczego curl? czy też można to zautomatyzować?
Zygro

Dziękuję bardzo, ponieważ moja aplikacja nie łączyła natywnego pakietu React.
GeekHades

3
To wygląda na włamanie. Jeśli pakujesz JavaScript w jeden plik, czy nie uzyskasz możliwości ponownego ładowania na żywo podczas uruchamiania aplikacji podczas programowania?
Liron Yahdav

2
to nie jest dla rozwoju, ale dla rzeczywistego pakowania APK
tbo

nic się nie dzieje ze mną nadal pojawia się błąd: - com.facebook.react.devsupport.JSE Wyjątek: Nie można pobrać BatchedBridge, upewnij się, że pakiet jest prawidłowo zapakowany
Dinesh R Rajput

110

Trafiłem też na ten problem. To, co zrobiłem, to wymuszenie zabicia aplikacji na moim urządzeniu, a następnie otworzyłem kolejną konsolę i pobiegłem

react-native start

a potem ponownie otworzyłem aplikację z mojego urządzenia i znowu zaczęła działać.

EDYCJA: Jeśli używasz urządzenia z Androidem przez USB i odłączyłeś je lub komputer poszedł w stan uśpienia, być może będziesz musiał najpierw uruchomić

adb reverse tcp:8081 tcp:8081

5
To rozwiązało mój problem podczas używania react-native run-android. Używanie react-native startnigdy nie było dla mnie wymagane, kiedy robiłemreact-native run-ios
Dylan Pierce

2
To zadziałało, ale dlaczego tak się dzieje? Czy to zostanie naprawione? Czy muszę zawsze otwierać 2 terminale i najpierw zaczynać, zanim będę mógł uruchomić to na urządzeniu?
Marko,

na mnie też działa! spędził wiele godzin, aby znaleźć rozwiązanie
dtjmsy

adb reverse tcp:8081 tcp:8081samo w sobie było dla mnie wystarczające. Wielkie dzięki!
Darius

To jest niesamowite, po tym, jak możesz to zrobić ./adb install
Faris Rayhan

27

Właśnie dostałem ten błąd. Oto, co zrobiłem, aby naprawić: wybrałem Dismiss, wszedłem do menu programisty, a następnie Dev Settings, wybierz Debug server host & port for device, dodałem adres IP i port moich komputerów: 192.168.0.xx:8xxxużyj dowolnego adresu IP przypisanego do komputera dewelopera w sieci Wi-Fi. Port jest zwykle:8081

Kiedy to zrobiłem, wszystko poszło dobrze. Ponadto, będąc w menu deweloperskim, pamiętaj, aby wybrać Enable Live Reloadi Debug JS Remotely, znacznie ułatwia to życie podczas debugowania.


Pracuje! Dla użytkownika Ubuntu: uruchom ifconfig, a następnie znajdź adres inet: xxx.xxx.xxx.xxx, gdzie xxx * to
adres

To zadziałało dla mnie na poziomie API 19 / Kitkat 4.4, patrz stackoverflow.com/questions/31525431/… , facebook.github.io/react-native/docs/…
Michael Ribbons

Dziękuję Ci! Muszę zrobić tę konfigurację tylko wtedy, gdy debuguję bez kabla USB (z narzędziami takimi jak WiFi ADB).
Fidan Hakaj

4
Ważne jest, aby pamiętać, że możesz utworzyć menu programisty, do którego odwołuje się @cube powyżej, fizycznie potrząsając urządzeniem z Androidem. Może się to wydawać dziwne, ale właśnie to spowoduje. Następnie postępuj zgodnie z pozostałymi instrukcjami. To naprawiło to dla mnie.
flyingace

22

Oto, co zadziałało dla mnie (po wypróbowaniu każdego innego rozwiązania, które znalazłem ...):

Wbiegnij do adb reverse tcp:8081 tcp:8081środka\Android\sdk\platform-tools


1
można uruchomić to polecenie w dowolnym miejscu, nie trzeba b w narzędziach platformy
goldylucks

1
Okazało się, że react-native run-androidpróbuje uruchomić to polecenie i zależy od zmiennej środowiskowej systemu Windows, pathktóra zawiera platform-toolsścieżkę.
straya

1
Dziękuję, zadziałało. ŚCIEŻKA to C: \ Users \ USERNAME \ AppData \ Local \ Android \ sdk \ platform-tools
chazefate

nie, nie działa na emulatorze Windows 10 i Androida
piksel

16

Dostałem to również, kiedy po raz pierwszy zacząłem z React Native, używając fizycznego urządzenia. W takim przypadku musisz zrobić kilka dodatkowych rzeczy, zanim zaczniesz. Musisz wprowadzić pewne informacje o swojej maszynie deweloperskiej w „Dev Settings” w React Native.

Gdy zobaczysz błąd, potrząśnij urządzeniem . Pojawi się okno dialogowe, ostatnią opcją będą „Ustawienia deweloperskie”. Wybierz opcję „Debuguj serwer i port dla urządzenia” i wprowadź lokalny adres IP oraz używany port (zwykle 8081).

Zobacz ostatni akapit https://facebook.github.io/react-native/docs/running-on-device-android.html


To dosłownie powtórzenie, dosłowne powtórzenie tego, co powiedziałem powyżej (w sierpniu)
kostka

3
Nie wiedziałem, że muszę potrząsnąć urządzeniem. Najpierw opublikowałbym to jako komentarz, ale nie mam wystarczająco dużo punktów, aby to zrobić. Głosowałem za twoim postem.
Richh94

Najprostsze i najczystsze rozwiązanie. Dzięki!
callOfCode

7

Jeśli żadne z rozwiązań nie działa dla Ciebie, spróbuj tego:

Okazało się, że mój <root>/android/app/build/intermediates/assets/debugfolder był pusty i uruchamiając cd android && ./gradlew assembleDebugnie tworzyłem tych wymaganych plików, które są później używane przez wątek javascript w naszych natywnych aplikacjach reagowania.

Uruchomiłem ręcznie następujące polecenie, które powinno być idealnie utworzone przez polecenie kompilacji debugowania.

node node_modules/react-native/local-cli/cli.js bundle --platform android --dev true --reset-cache --entry-file index.android.js --bundle-output /<path to dir>/android/app/build/intermediates/assets/debug/index.android.bundle --assets-dest /<path to dir>/android/app/build/intermediates/res/merged/debug

Po uruchomieniu tych poleceń znalazłem w tym katalogu dwa pliki paczek <root>/android/app/build/intermediates/assets/debug

A potem znowu uruchomiłem, cd android && ./gradlew installDebugmoja aplikacja znowu zaczęła działać.

Będzie więcej debugować i zaktualizuje to, co faktycznie nie działa.


Aby tylko wyjaśnić, co się dzieje, wydaje się, że podczas integracji reagowania natywnego z istniejącym projektem ścieżka wyjściowa pakietu NIE jest ustawiana automatycznie, więc musisz ustawić ją samodzielnie. Stąd ścieżka wyjściowa pakietu = / ścieżka / do / zasobów?
robsstackoverflow

Przy okazji jesteś najlepszy.
robsstackoverflow

7

W osobnym terminalu podłącz urządzenie do komputera i uruchom następujące polecenia:

react-native start 
cd user/Library/Android/sdk/platform-tools/
./adb reverse tcp:8081 tcp:8081

Terminal aplikacji :

react-native run-android 
install apk on your device from this location android/app/build/outputs/apk/app-debug.apk

1
Może mógłbyś rozszerzyć swoją odpowiedź, aby zawrzeć nieco więcej szczegółów na temat tego, co oznaczają poszczególne kroki w Twojej odpowiedzi, z jakich katalogów powinny być uruchamiane polecenia itp.? Myślę, że dzięki temu twoja odpowiedź byłaby znacznie bardziej pomocna.
niels

To właściwa odpowiedź. Pozwala to na szybką iterację, łącząc się z rodzimym serwerem reagowania, zamiast konieczności ponownego pakowania pakietu przy każdej zmianie.
Joshua Pinter

6

Trochę za późno, ale to naprawdę działa dla mnie.

  1. react-native run-android.
  2. react-native start.

Pierwsze polecenie utworzy apkdla Androida i wdroży je na twoim urządzeniu, jeśli jest połączone. Po otwarciu aplikacji wyświetli się czerwony ekran z błędem. Następnie uruchom drugie polecenie, które uruchomi program do pakowania i zbuduje pakiet aplikacji.


5

Wypróbuj to polecenie w terminalu, a następnie załaduj ponownie. U mnie to zadziałało

adb reverse tcp: 8081 tcp: 8081



5
  1. uruchom ponownie genymotion
  2. biegać react-native run-android
  3. problem został rozwiązany

Na serio? restart the genymotion? Ty vole.
Michał

To tak, jakby powiedzieć „och, twoja witryna nie działa? Spróbuj ponownie uruchomić serwer”.
Michał

4

Miałem ten sam wyjątek na urządzeniu Z3 Compact D5803 - 6.0.1

Otworzyłem plik .buckconfig i zmieniłem wiersz:

target = Google Inc.:Google APIs:23

do

target = Google Inc.:Google APIs:24

Ponieważ widziałem w SDK Manager, że Android 6.X ma api poziom 24.


3

Dla mnie to dlatego, że adbnie było w PATH. Znajduje się /Users/man/Library/Android/sdk/platform-toolsdla mnie, może być dla ciebie gdzie indziej, ale i tak znajdź go i dodaj do swojej ścieżki, aby zobaczyć, czy to pomoże.


3

Ponieważ używasz Androida <5.0, nie możesz użyć domyślnej adb reversemetody, ale Facebook dodał oficjalną dokumentację, aby połączyć się z serwerem deweloperskim przez Wi-Fi , która obsługuje twoją wersję. Cytując instrukcje dla MacOS, ale mają je też dla Linuksa i Windowsa:

Metoda 2: Połącz przez Wi-Fi

Możesz także połączyć się z serwerem deweloperskim przez Wi-Fi. Najpierw musisz zainstalować aplikację na swoim urządzeniu za pomocą kabla USB, ale gdy to zrobisz, możesz debugować bezprzewodowo, postępując zgodnie z tymi instrukcjami. Przed kontynuowaniem będziesz potrzebować aktualnego adresu IP komputera deweloperskiego.

Adres IP można znaleźć w Preferencjach systemowych → Sieć.

Upewnij się, że laptop i telefon są w tej samej sieci Wi-Fi. Otwórz aplikację React Native na swoim urządzeniu. Zobaczysz czerwony ekran z błędem. To jest wporządku. Poniższe kroki naprawią to. Otwórz menu programisty w aplikacji. Przejdź do Ustawienia deweloperskie → Host serwera debugowania dla urządzenia. Wpisz adres IP swojej maszyny i port lokalnego serwera deweloperskiego (np. 10.0.1.1:8081). Wróć do menu dewelopera i wybierz Odśwież JS.


3

Miał ten problem „losowo” i zajęło mi trochę czasu, zanim zrozumiałem, co było nie tak w moim scenariuszu.

Po aktualizacji do React-native-cli 2.0.1 w dzienniku pojawił się komunikat, który pomógł mi w wykopaniu i znalezieniu głównej przyczyny:

Serwer JS nie został rozpoznany, kontynuuję budowanie ...

Po zbadaniu kilku linków znalazłem ten:

Nie można rozpoznać serwera JS

Ponieważ pracuję w systemie Windows, uruchomiłem netstat i odkryłem, że mój odtwarzacz VLC również działa na porcie 8081, powodując problem. Tak więc w moim przypadku, gdybym uruchomił serwer vlc przed serwerem reagującym, to nie zadziałałoby.

Ten sam komunikat dziennika nie był wyświetlany we wcześniejszych wersjach reagowania-natywnego-cli, przez co po cichu kończyło się niepowodzeniem.

TL, DR: sprawdź, czy coś działa na tym samym porcie co menedżer pakietów (domyślnie 8081)


2

Mój problem polegał na tym, że przejrzałem AndroidManifest.xmlplik i usunąłem ten wiersz

<uses-permission android:name="android.permission.INTERNET" />

ponieważ moja aplikacja nie potrzebuje internetu. Jednak natywna aplikacja do debugowania React potrzebuje dostępu do Internetu (aby uzyskać dostęp do programu pakującego) Ups. :)


1
Człowieku, uratowałeś mi dzień.
Rwał


2

Sprawdź, czy podczas uruchamiania wystąpił następujący błąd react-native run-android: adb server version (XX) doesn't match this client (XX); killing...

W takim przypadku upewnij się /usr/local/opt/android-sdk/platform-tools/adbi /usr/local/bin/adbsą wskazywane na to samoadb

W moim przypadku jeden został wskazany /Users/sd/Library/Android/sdk/platform-tools/adb(Android SDK), a inny wskazał /usr/local/Caskroom/android-platform-tools/26.0.2/platform-tools/adb(Homebrew)

Problem został rozwiązany po tym, jak oba wskazywały /Users/sd/Library/Android/sdk/platform-tools/adb(Android SDK)


1

Mam też ten błąd, naprawdę zdezorientowany. bo wszystkie odpowiedzi nie działają. Zaraz po dodaniu adb do ścieżki.


1

Dla mnie miałem włączoną i aktywną synchronizację boczną. Zamknięcie go natychmiast spowodowało, że problem zniknął. Warto zamknąć tę lub jakąkolwiek inną komunikację między komputerem a urządzeniem


1

Skończyło się na tym, że musiałem otworzyć port, którego używałem (domyślnie 8081). W systemie Linux możesz wykonać następujące czynności

sudo iptables -A INPUT -p tcp --dport 8081 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 8081 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Możesz przetestować, czy rzeczywiście musisz to zrobić. Po prostu przejdź do swojego serwera deweloperskiego w Chrome na urządzeniu z Androidem. Jeśli nie odpowiada, to może być to, czego potrzebujesz. Jeśli odpowie, to ci nie pomoże.


1

Moja droga to:

react-native start

Następnie w urządzeniu za pomocą:

click to Reload.

Zobacz w konsoli reaguj natywnie, będzie pobierać dane pakietu js.


To był mój problem, ponieważ terminal się nie uruchamiał. Dzięki !
Nicolas Leucci

1

Miałem ten sam problem. Kiedy stworzyłem natywny projekt React za pomocą aplikacji AwesomeProject create -reak-native-app , działał dobrze w aplikacji Expo na telefonie. Potem chciałem użyć tego projektu szybkiego startu do rozwijania mojego projektu i dostałem ten sam błąd co Ty.

Po kilku poszukiwaniach stwierdzam, że lepiej jest rozpocząć nowy projekt z wykorzystaniem React-native init AwesomeProject (z wszystkimi ustawieniami w responsywnych dokumentach natywnych) Następnie uruchom to polecenie:

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/

To powinno naprawić problem z pakietem (--dev false nie wyświetla ostrzeżeń)

Wszystko, co musisz zrobić, aby aplikacja działała na Twoim wirtualnym / rzeczywistym urządzeniu, to:

react-native run-android

I powinno działać dobrze. Przynajmniej to zadziałało dla mnie.


1

Dla mnie problemem było to, że „adb” nie został rozpoznany - sprawdź odpowiedź.

Aby rozwiązać ten problem, dodaj C: \ Users \ USERNAME \ AppData \ Local \ Android \ sdk \ platform-tools do zmiennych środowiskowych


To nic innego jak komentarz. Ale jeśli wkleisz tutaj ostatni wiersz połączonej odpowiedzi, stanie się to poprawną odpowiedzią. W przeciwnym razie istnieje szansa, że ​​ta odpowiedź zostanie usunięta.
Amit Joshi

1

Większość z nas po raz pierwszy staje przed tym problemem, gdy zaczynamy reagować na natywny projekt nr 1.

Kilka prostych kroków rozwiązało mój problem:

Przykładowy projekt stworzyłem za pomocą polecenia:

react-native init ReactProject1

Rozwiązanie

Rozwiązaniem jest pomoc local-cli\runAndroid\adb.jsw znalezieniu adb.exe, tak samo jak local-cli\runAndroid\runAndroid.js:

znajdź instrukcję zamiany pod nazwą projektu (cokolwiek podałeś)\node_modules\react-native\local-cli\runAndroid

Zastąpić:

const devicesResult = child_process.execSync('adb devices');

Przez:

const devicesResult = child_process.execSync( (process.env.ANDROID_HOME ? process.env.ANDROID_HOME + '/platform-tools/' : '') + 'adb devices');

po wykonaniu powyższej zamiany, po prostu uruchom React-native run-android w swoim cmd, połączy apk i najpierw spróbuje zainstalować pakiet js lokalnie na twoim urządzeniu. (Powodzenie)


0

Wypróbowałem wiele sugestii powyżej / poniżej, ale ostatecznie problemem, który napotkałem, były uprawnienia z Watchman, który został zainstalowany wcześniej przy użyciu homebrew. Jeśli spojrzysz na komunikaty terminala podczas próby użycia emulatora i napotkasz na emulatorze błąd „Odmowa uprawnień” w odniesieniu do strażnika wraz z komunikatem „Nie można uzyskać BatchedBridge”, wykonaj następujące czynności:

Przejdź do /Users/<username>/Library/LaunchAgentskatalogu i zmień ustawienia uprawnień, aby użytkownik mógł czytać i pisać. Dzieje się tak niezależnie od tego, czy rzeczywiście masz tam com.github.facebook.watchman.plistplik.


0

Odkryłem, że muszę również dodać plik

reaktywna aktualizacja

aby aplikacja działała poprawnie.


0

Mam ten sam problem, ale to był głupi błąd z mojej strony ...

Ze studia Android uruchomiłem installDebug/installReleaseskrypt gradle z programu appprojet zamiast rootprojet.


0

Najprostszy sposób!

  • Zatrzymaj serwer i zakończ tworzenie projektu.
  • Otwórz terminal „Node.js”.
    • Przejdź do folderu z projektem „React-Native”.
    • Wpisz „reakcja-natywny start” - ręczne uruchamianie serwera reagowania natywnego.
  • Przejdź do terminala edytora kodu i wpisz „react-native run-android.

Jesteś gotowy!


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.