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

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.