Android не удалось загрузить пакет JS


201

Я пытаюсь запустить AwesomeProject на моем Nexus5 (Android 5.1.1).

Я могу собрать проект и установить его на устройстве. Но когда я запускаю его, у меня появляется красный экран с надписью

Невозможно загрузить пакет JS. Вы забыли запустить сервер разработки или подключить свое устройство?

В реакции на родную iOS я могу загрузить jsbundle в автономном режиме. Как я могу сделать то же самое для Android? (Или, по крайней мере, где я могу настроить адрес сервера?)

Обновить

Для запуска на локальном сервере выполните следующие команды в корневом каталоге вашего реагирующего проекта

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

пожалуйста, посмотрите ответ dsissitka для более подробной информации.

Чтобы запустить без сервера, поместите jsfile в apk, выполнив:

  1. создать папку ресурсов в android/app/src/main
  2. curl "http://localhost:8081/index.android.bundle?platform=android" -o "android/app/src/main/assets/index.android.bundle"

пожалуйста, посмотрите на ответ kzzzf для более подробной информации.


Stll еще не выяснил проблему. Но тем временем вы можете попробовать это на своем симуляторе. Он отлично работает на моем гении.
Брайан

когда я пытаюсь ввести две команды для запуска на локальном сервере, я получаю сообщение об ошибке в powershell, говорящее: «Символ амперсанда (&) не разрешен». Я полагаю, я должен быть в корне моего app-dir при запуске команды?
user2236165

1
Означает ли это, что отладка по USB на Android 4.1 невозможна, поскольку adb reverseне поддерживается?
Бон

Я хотел бы отметить, что для выполнения adb reverse tcp:8081 tcp:8081вам нужна версия ADB 1.0.32, reverseопция не в 1.0.31
jvalen

Ответы:


110

Чтобы упаковать JS-файл в ваш apk, когда ваш сервер работает ( react-native start), загрузите bundle в каталог assets вашего приложения:

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

В следующем выпуске (0.12) мы исправим react-native bundleкоманду для работы с проектами Android, как и ожидалось.


Спасибо! Как я могу сказать responseInstanceManager использовать связанный актив? Или магия просто происходит автоматически?
Мэтью

9
Не удалось создать файл. Предупреждение: android / app / src / main / assets / index.android.bundle: Нет такого файла или Предупреждение: каталог
almeynman

2
Предупреждение: не удалось создать файл. Предупреждение: android / app / src / main / assets / index.android.bundle: такого файла нет или предупреждение: каталог curl: (23) Ошибка записи тела (0! = 16167)
Shivang

3
@Shivang: создайте ресурсы каталога в android / app / src / main. У меня была эта ошибка, потому что она еще не существовала.
Пискатор

1
Это лучший и простой способ, когда мы распространяем приложение локально для целей тестирования. (через ткань) спасибо
Динеш Ануруддха

90

Следующее заставило меня работать на Ubuntu 14.04:

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

Обновление : см.

Обновление 2 : @scgough Мы получили эту ошибку, потому что React Native (RN) не смог получить JavaScript с сервера dev, работающего на наших рабочих станциях. Вы можете увидеть, почему это происходит здесь:

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

Если ваше приложение RN обнаруживает, что вы используете Genymotion или эмулятор, оно пытается извлечь JavaScript из GENYMOTION_LOCALHOST (10.0.3.2) или EMULATOR_LOCALHOST (10.0.2.2). В противном случае предполагается, что вы используете устройство, и пытается извлечь JavaScript из DEVICE_LOCALHOST (localhost). Проблема в том, что сервер dev работает на локальном хосте вашей рабочей станции, а не на устройстве, поэтому для того, чтобы заставить его работать, вам нужно либо:


5
работает adb reverse tcp: 8081 tcp: 8081 на osx тоже работает
shyamal

Оно работает! большое спасибо. Знаете ли вы, есть ли способ указать jscodelocation на apk-ресурс, как в iOS main.jsbundle?
Мэтью

@dsissitka я могу просто спросить, так что это записано здесь в теме - что это делает именно?
Scgough

@ Мэтью Боюсь, что нет. Сожалею!
дсисситка

Что, если мы работаем на Android 4.2 и получаем эту ошибку: stackoverflow.com/questions/31525431/…
Августин Ридингер

39

Хорошо, я думаю, я понял, в чем проблема здесь. Это было связано с версией, которую watchmanя запускал.

В новой оболочке запустите brew update then: brew unlink watchman then:brew install watchman

Теперь вы можете запустить react-native startиз папки вашего проекта

Я оставляю эту оболочку открытой, создаю новое окно оболочки и запускаю: react-native run-androidиз папки моего проекта. С миром все в порядке.

пс. У меня изначально была версия 3.2 сторожа. Это повысило меня до 3,7.

имп. Я новичок в этом, так что, возможно, это не самый быстрый путь к решению, но оно сработало для меня.

* БОЛЬШЕ ИНФОРМАЦИИ ДЛЯ РАБОТЫ / ОТЛАДКИ НА УСТРОЙСТВЕ *

Вы можете обнаружить, что если вы развернете свое приложение на своем Android-устройстве, а не на эмуляторе, вы увидите красный экран смерти с сообщением об ошибке Unable to load JS Bundle. Вам нужно настроить сервер отладки так, чтобы на вашем устройстве реагировал ваш компьютер ... либо его имя, либо IP-адрес.

  1. Нажмите Menuкнопку устройства
  2. Выбрать Dev Settings
  3. Выберите Debug server host for deviceилиChange Bundle Location
  4. Введите IP-адрес вашей машины и перезагрузите JS плюс порт реакции, например 192.168.1.10:8081

Дополнительная информация: http://facebook.github.io/react-native/docs/running-on-device-android.html


@ jacobross85 Рад, что это помогло! Подайте мне голос, если вам так хочется ;-)
scgough

1
Пришлось запустить, brew uninstall watchmanпрежде чем он установит последнюю версию для меня.
Amozoss

Я добавил немного больше информации для отладки на устройство Android, а не в эмулятор.
Scgough

Уже была запущена последняя версия сторожа, но это исправило это для меня. Weeeeird
pfac

1
Спасибо за этого брата, это действительно полезно. Вот почему я дам вам голос.
Приянк Джотангия

17

Из каталога вашего проекта запустите

react-native start

Это выводит следующее:

$ 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)

1
У меня также есть проблема, о которой сообщил ОП. Я запускаю проект, используя react-native run-androidиз папки проекта. Он работает нормально в терминале, но как только приложение открывается на моем устройстве, я вижу красный экранUnable to download JS bundle
scgough

6
вам нужно запустить adb reverse tcp: 8081 tcp: 8081
Matthew

1
Я запустил adb reverse tcp: 8081 tcp: 8081 и получаю ошибку: закрытая ошибка: закрытая
JacobRossDev

1
У меня та же проблема, ошибка: закрыто. Любая помощь, пожалуйста?
Eusthace

Убедитесь, что ваш IP-адрес правильный в настройках разработчика, если вы находитесь на Android. Если вы работаете с динамическим IP, это может измениться за одну ночь.
Сэм Перселл

13

Простое решение, которое работает для меня с Ubuntu 14.04.

react-native run-android

Эмулятор (уже запущенный) вернется: Невозможно загрузить JS Bundle; Запустите снова JS-сервер:

react-native start

Нажмите Перезагрузить JS на эмуляторе. Это сработало для меня. Надеюсь, это поможет


На самом деле работает. Из всех ответов это самое простое решение. Не могу поверить, что это не в официальном документе.
bluecollarcoder

ОП предназначена для запуска на устройстве, а не на эмуляторе. Эти шаги не работают на устройстве без дополнительной настройки. Смотрите принятый ответ.
Давидголи

8

В приложении на андроиде я открыл Меню (Command + M в Genymotion) -> Настройки Dev -> Отладка хоста и порта сервера для устройства

установите значение: localhost: 8081

Это сработало для меня.


Спасибо! Работал для меня
Говард

7

После опробования комбинации ответов здесь, это то, что работает для меня.

Я использую Genymotion в качестве моего эмулятора.

1 Запустите эмулятор Genymotion.

2 из терминала

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 Перезагрузить из эмулятора.

Он загружается!

Теперь я могу начать развиваться.


Получение «ошибка: закрыто» дважды на «обратном adb»
almeynman

К вашему сведению: сейчас я делаю вышеупомянутое с ответом «Дэниела Масарина» о настройке хоста сервера отладки на мой WiFi-адрес с портом 8081, он работает с RN v 0.17.0
ooolala

спасибо большое, это работает для меня :) на выше API 21+ работает только это
Ashwini Bhat

4

Удалить приложение с вашего телефона! Я попробовал несколько шагов, но в конце концов сделал это.

  1. Если вы пытались запустить приложение раньше, но не смогли, удалите его с устройства Android.
  2. Бегать $ react-native run-android
  3. Откройте React Rage Shake Menu из своего приложения на устройстве Android, перейдите к Dev Settingsи затем к Debug server host & port for device. Там введите IP вашего сервера (IP вашего компьютера) и хост 8081, например 192.168.50.35:8081. На Mac вы можете найти IP вашего компьютера по адресуSystem Preferences -> Network -> Advanced... -> TCP/IP -> IPv4 Address .
  4. Снова откройте меню встряхивания ярости и нажмите Reload JS.


2

У меня недостаточно репутации, чтобы комментировать, но это относится к ответу dsissitka. Работает и на Windows 10.

Чтобы повторить, команды:

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

2

Вот простые шаги для запуска вашего приложения на Android (релиз):

1. Зайдите в корень своего приложения.

2. Запустите эту команду.

Собственный пакет реагирования --platform android --dev false - входной файл index.android.js - вывод -bundle android / app / src / main / assets / index.android.bundle --assets-dest android / app / SRC / основные / RES

Все ваши файлы скопированы.

3. Создайте подписанный APK.

Открытая андроид студия.

Построить> Создать подписанный APK> [Заполните необходимые данные, нажатие клавиши должно быть сгенерировано перед этим шагом]

Ваш APK должен быть создан без каких-либо ошибок. Установите на свое устройство, и это должно работать без проблем.

Вы также можете подключить свое устройство и напрямую нажать значок «Выполнить» на Android Studio для тестирования.


Генерация нажатия клавиш:

  1. Перейти к C: \ Program Files \ Java \ jdkx.x.x_x \ bin

  2. Бегать

keytool -genkey -v -keystore d: \ my_private_key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -действительность 10000

Он, вероятно, попросит вас заполнить некоторые детали. Сделайте это, и у вас есть файл нажатия клавиш ( my_private_key.keystore ), который можно использовать для подписи вашего apk.


после того, как react-native bundleя получил ошибку: дубликаты ресурсов
Амир Шабани

1

Я получил это на Linux после остановки react-native run-android процесса. Кажется, что сервер узла все еще работает, поэтому при следующем запуске он не будет работать должным образом, и ваше приложение не сможет подключиться.

Исправление здесь состоит в том, чтобы убить процесс узла, который выполняется в Xterm, который вы можете убить, используя ctrl-cэто окно (проще), или вы можете найти его, используя lsof -n -i4TCP:8081затемkill -9 PID .

Тогда беги react-native run-androidснова.


1

Проверьте ваше соединение Wi-Fi.

Другой возможностью может быть то, что вы либо не подключены к Wi-Fi, либо подключены к другой сети, либо неверный IP-адрес в настройках вашего устройства. По какой-то причине мой андроид отключился от вайфай и я начал получать эту ошибку, по незнанию.


Спасибо, вот и все. По умолчанию сервер отладки доступен в локальной сети. Поэтому, если у вас нет доступа к Wi-Fi, вы не можете достичь его.
Пол

1

Работает на устройстве

Я нашел другой ответ.

  • обратный adb: работает только на Android 5.0+ (API 21).
  • Другое: откройте меню «Разработчик», встряхнув устройство, перейдите в « Настройки Dev» , перейдите в « Отладка хоста сервера для устройства» , введите IP-адрес вашей машины и порт локального сервера разработчика.


1

Одна важная вещь, чтобы проверить, что никто еще не упомянул: проверьте ваш локальный брандмауэр, убедитесь, что он выключен .

Смотрите мой ответ здесь: https://stackoverflow.com/a/41400708/1459275


0

Я использую только Ubuntu и Android, и я не смог запустить его. Я нашел действительно простое решение - обновить файл package.json, изменив следующие строки:

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

в

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

И тогда вы запускаете сервер, набрав

npm run start

Это гарантирует, что устройство Android ищет сервер узлов на вашем компьютере, а не локально на телефоне.


0

Первоначальный вопрос был о перегрузке приложения в phyisical устройства.

Когда вы отлаживаете приложение на физическом устройстве (например, через adb), вы можете перезагрузить пакет JS, нажав на левую верхнюю кнопку «action» вашего устройства. Это откроет меню параметров (Перезагрузить, Отладить JS удаленно ...).

Надеюсь это поможет.


0

Эта ошибка может быть легко устранена с помощью следующих шагов:

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

1
я могу запустить adb reverse tcp:8081 tcp:8081в корневой папке моего приложения?
Марсон Мао

найдите папку adb в вашей ОС. его в Android SDK / инструменты платформы /
Атиф Хуссейн

1
но я вижу много мест, ссылающихся на то, что эту команду можно запустить в корневой папке приложения, также ответ dsissitka предполагает, что она запускается в корневой папке приложения, так что я действительно запутался.
Марсон Мао

может быть, эта команда также обрабатывается реагирующим Я не уверен в этом. но ADB поддерживается Android SDK инструментов. Вы можете найти более подробную информацию здесь facebook.github.io/react-native/docs/…
Атиф Хуссейн

1
@MarsonMao В зависимости от настроек вашей системы, вы можете запустить adb из каталога вашего приложения. Читайте о переменной PATH и о глобальных и локальных пакетах для получения дополнительной информации.
Мчандлераз

0

Вы можете следовать инструкции, указанной на официальной странице, чтобы решить эту проблему. Эта проблема возникает на реальном устройстве, поскольку комплект JS находится в вашей системе разработки, а приложение на вашем реальном устройстве не знает о его местонахождении.


0

В новом React Native (точно 0.59) отладочный конфиг находится внутри 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>

0

Запустите два терминала на одном и том же терминале, и первый терминал запустит реактивный запуск и второй терминал отклик-собственный запустит android. Эта проблема решается просто. И удачи


0

Привет, я столкнулся с этой проблемой в своем проекте «голая», симулятор IOS работает нормально, но Android продолжал выдавать мне эту ошибку. Вот возможное решение, которое сработало для меня.

шаг 1, проверьте, авторизовано ли устройство adb, запустив в своем терминале adb devices

если он не авторизован, выполните следующие команды

шаг 2, sudo adb kill-server шаг 3, sudo adb start-сервер

затем проверьте, показывает ли команда adb devices список подключенных устройств. emulator-5554 device

вместо несанкционированного, если это устройство вместо несанкционированного

шаг 4, запустите npx реагировать-родной запустить андроид

в моем случае это сработало. Надеюсь, это решит вашу проблему.


0

Я нахожу это странным, но у меня есть решение. Я заметил, что время от времени папка моего проекта становилась доступной только для чтения, и я не мог сохранить ее из VS. Поэтому я прочитал предложение перенести NPM из локального пользовательского PATH в общесистемную глобальную переменную PATH, и это сработало как прелесть.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.