Android无法加载JS捆绑包


201

我正在尝试在Nexus5(android 5.1.1)上运行AwesomeProject。

我能够构建项目并将其安装在设备上。但是当我运行它时,我得到一个红色屏幕说

无法下载JS捆绑包。您是否忘了启动开发服务器或连接设备?

在React Native iOS中,我可以选择离线加载jsbundle。如何在Android上做同样的事情?(或者至少在哪里可以配置服务器地址?)

更新资料

要在本地服务器上运行,请在react-native项目根目录下运行以下命令

  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尚未发现问题。但是与此同时,您可以在模拟器上进行尝试。对我的genymotion效果很好。
— Bryan 2015年

当我尝试键入要在本地服务器上运行的两个命令时,我在Powershell中收到错误消息:“不允许使用&符号。” 我假设我在运行命令时应该位于我的应用程序目录的根目录中?
— user2236165 2015年

1
这是否意味着由于adb reverse不支持而无法在Android 4.1上通过USB进行调试?
— bonh 2013年

我想提一下,要能够执行,adb reverse tcp:8081 tcp:8081您需要ADB 1.0.32版本,该reverse选项不在1.0.31中
— jvalen

Answers:


110

要在服务器运行(react-native start)的同时将JS文件捆绑到您的apk中,请将捆绑下载到您应用的资产目录中:

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

在下一个版本(0.12)中,我们将修复react-native bundle命令以按预期使用android项目。


谢谢!如何告诉reactInstanceManager使用捆绑资产?还是魔术会自动发生?
— 马修

9
无法创建文件警告:android / app / src / main / assets / index.android.bundle:无此类文件或警告:目录
— almeynman 2015年

2
警告:无法创建文件警告:android / app / src / main / assets / index.android.bundle:无此类文件或警告:目录curl:(23)书写体失败(0!= 16167)
— Shivang

3
@Shivang:在android / app / src / main中创建目录资产。我有此错误,因为它不存在。
— 海盗

1
这是我们出于测试目的在本地分发应用程序时最好的简单方法。(通过面料)谢谢
— Dinesh Anuruddha 2016年

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。您可以在这里查看为什么发生这种情况:

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

如果您的RN应用检测到您正在使用Genymotion或模拟器,它将尝试从GENYMOTION_LOCALHOST(10.0.3.2)或EMULATOR_LOCALHOST(10.0.2.2)中获取JavaScript。否则,它假定您正在使用设备,并尝试从DEVICE_LOCALHOST(localhost)获取JavaScript。问题在于,开发服务器在工作站的本地主机上运行,​​而不在设备的本地主机上运行,​​因此,要使其正常运行,您需要执行以下任一操作:


5
在osx上运行adb反向tcp:8081 tcp:8081也可以正常工作
— shyamal 2015年

有用!非常感谢。您是否知道是否有办法将jscodelocation指向apk资源,就像iOS的main.jsbundle一样?
— 马修(Matthew)

我只能问@dsissitka,所以它记录在线程中-究竟是什么?
— scgough

@Matthew害怕不。抱歉!
— dsissitka

如果我们在Android 4.2上运行,并收到此错误:stackoverflow.com/questions/31525431/...
— 奥古斯丁Riedinger

39

好的,我想我已经知道问题出在哪里。这与watchman我正在运行的版本有关。

在新的shell中,brew update 然后运行:brew unlink watchman 然后:brew install watchman

现在,您可以react-native start从项目文件夹中运行

我将此外壳保持打开状态,创建一个新的外壳窗口并运行:react-native run-android从我的项目文件夹中。世间万事大吉。

ps。我最初使用的是Watchman 3.2版。这将我升级到3.7。

pps。我对此并不陌生,因此这可能不是解决方案的最快方法,但对我有用。

*有关在设备上运行/调试的更多信息*

您可能会发现,如果将应用程序部署到Android设备而不是仿真器上,则会显示红屏死机,并显示错误信息Unable to load JS Bundle。您需要为设备设置调试服务器,以便计算机运行时对其进行反应...其名称或IP地址。

  1. 按下装置Menu按钮
  2. 选择 Dev Settings
  3. 选择Debug server host for device或Change Bundle Location
  4. 输入机器的IP并重新加载JS以及react端口,例如 192.168.1.10:8081

更多信息:http : //facebook.github.io/react-native/docs/running-on-device-android.html


@ jacobross85很高兴它有所帮助!如果您愿意,请给我
— 投票

1
不得不跑 brew uninstall watchman才能为我安装最新版本。
— Amozoss

我已经为调试到Android设备(而不是仿真器)添加了更多信息。
— scgough

已经在运行最新版本的watchman,但这已为我修复。Weeeeird
— pfac

1
谢谢你的兄弟,这真的很有帮助。这就是为什么我会给你赞成票的原因。
— Priyank Jotangiya

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
我还遇到了OP报告的问题。我使用react-native run-android项目文件夹中的运行项目。它可以在终端上正常运行,但是一旦在我的设备上打开应用程序,我就会被红屏显示Unable to download JS bundle
— scgough

6
您需要运行adb reverse tcp:8081 tcp:8081
— Matthew

1
我运行了adb反向tcp:8081 tcp:8081,但出现错误:关闭错误:已关闭
— JacobRossDev 2015年

1
我有同样的问题,错误:已关闭。有什么帮助吗?
— Eusthace,2015年

如果您使用的是Android,请确保“开发设置”中的IP地址正确。如果使用动态IP,则可能会在一夜之间发生变化。
— Sam Purcell

13

一个适用于我的Ubuntu 14.04简易解决方案。

react-native run-android

该仿真器(已启动)将返回:无法下载JS Bundle;重新启动JS服务器:

react-native start

在模拟器上点击Reload JS。它为我工作。希望对你有帮助


确实有效。在所有答案中,这是最简单的解决方案。不敢相信这不在官方文档中。
— bluecollarcoder

OP是关于在设备而不是仿真器上运行的。如果没有其他设置,这些步骤将无法在设备上运行。请参阅接受的答案。
— davidgoli

8

在Android上的应用程序中,我打开菜单(Genymotion中的Command + M)->开发设置->调试设备的服务器主机和端口

将值设置为: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

仅供参考:我现在使用“ Daniel Masarin”做上述操作,将调试服务器主机设置为端口8081的WiFi地址,它正在使用RN v 0.17.0
— ooolala 2015年

非常感谢您,这对我有用:)在上面的API 21+上仅适用于此
— Ashwini Bhat

4

从手机中删除该应用程序!我尝试了几个步骤,但最终做到了。

  1. 如果您之前尝试运行应用程序但失败了,请从android设备中将其删除。
  2. 跑 $ react-native run-android
  3. 从android设备上的应用中打开React Rage Shake Menu 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. 再次打开Rage Shake Menu,然后单击Reload JS。


2

我没有足够的声誉来发表评论,但这是指dsissitka的回答。它也适用于Windows 10。

重申一下,这些命令是:

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

2

以下是在android(release)上运行您的应用程序的简单步骤:

1.转到您的应用程序根目录。

2.运行此命令。

react-native包--platform android --dev否--entry-file index.android.js --bundle-output android / app / src / main / assets / index.android.bundle --assets-dest android / app / src / main / res

您的所有文件均已复制。

3.创建签名的APK。

打开android studio。

生成>生成签名的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 -validity 10000

它可能会要求您填写一些详细信息。做到这一点,您就有了可用于签署apk的击键文件(my_private_key.keystore)。


之后react-native bundle重复资源:我有错误
— 阿米尔·沙巴尼

1

停止react-native run-android进程后,我在Linux上得到了这个。节点服务器似乎仍在运行,因此下次运行它时,它将无法正常运行,并且您的应用程序无法连接。

此处的解决方案是杀死正在Xterm中运行的节点进程,您可以通过ctrl-c打开该窗口(更简便)来杀死它,也可以使用lsof -n -i4TCP:8081then 找到它kill -9 PID。

然后react-native run-android再次运行。


1

检查您的wifi连接。

另一种可能是您未连接到wifi,连接到错误的网络或您的开发设置中的IP地址错误。由于某种原因,我的android从wifi断开连接,我在不知不觉中开始出现此错误。


谢谢,就是这样。默认情况下,在本地网络上访问调试服务器。因此,如果您没有wifi接入,则无法访问。
— 保罗

1

在设备上运行

我找到了另一个答案。

  • 亚行反向:仅适用于Android 5.0+(API 21)。
  • 另一个:通过摇动设备来打开“开发人员”菜单,转到“ 开发设置”,转到“ 调试设备的服务器主机”,输入机器的IP地址和本地dev服务器的端口



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捆绑包。这将打开选项菜单(重​​新加载,远程调试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在应用程序的根文件夹中运行吗?
— Marson Mao,

在您的操作系统中找到adb文件夹。它在Android SDK中/平台工具中/
— Atif Hussain

1
但是我看到很多地方都提到该命令可以在应用程序根文件夹中运行,而dsissitka的答案也建议在命令根目录中运行它,所以我真的很困惑。
— Marson Mao

也可能是该命令也是由本机处理的。我对此不确定。但是android sdk工具支持adb。你可以在这里找到更多的细节facebook.github.io/react-native/docs/...
— 与Atif侯赛因

1
@MarsonMao根据您的系统设置,您也许可以从应用程序目录运行adb。阅读PATH变量以及全局包与本地包的更多信息。
— mchandleraz

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

在相同的终端上启动两个终端,并在第一个终端上运行react-native start和在第二个终端上运行react-native run-android这个问题可以通过简单的方式解决。祝你好运


0

嘿,我的React-native裸露项目遇到了这个问题,IOS模拟器运行正常,但是android一直给我这个错误。这是一种对我有用的解决方案。

步骤1,通过在您的终端上运行,检查adb设备是否得到授权:adb devices

如果未经授权,请运行以下命令

步骤2,sudo adb kill-server步骤3,sudo adb start-server

然后检查adb devices命令是否显示连接的设备列表模拟器5554设备

如果是设备而不是未经授权的话,而不是未经授权的

第4步,运行npx react-native run-android

在我看来,这已经奏效了,我希望这可以解决您的问题。


0

我发现这很奇怪,但是找到了解决方案。我注意到我的项目文件夹偶尔会变为只读,并且无法从VS中保存它。因此,我阅读了有关将NPM从本地用户PATH传输到系统范围的PATH全局变量的建议,它的工作原理很吸引人。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.