反应原生android未能加载JS捆绑
我试图在我的Nexus5上运行AwesomeProject(android 5.1.1)。
我能够构build项目并将其安装在设备上。 但是当我运行它,我有一个红色的屏幕说
无法下载JS捆绑。 你忘了启动开发服务器还是连接你的设备?
在原生iOS中,我可以select离线加载jsbundle。 我怎么能为Android做同样的事情? (或者至less,我可以在哪里configuration服务器地址?)
更新
要使用本地服务器运行,请在react-native项目根目录下运行以下命令
- react-native start> / dev / null 2>&1&
- adb反向tcp:8081 tcp:8081
请看看dsissitka的回答了解更多详情。
要在没有服务器的情况下运行,请运行以下命令将jsfile绑定到apk中:
- 在
android/app/src/main
下创build资源文件夹 -
curl "http://localhost:8081/index.android.bundle?platform=android" -o "android/app/src/main/assets/index.android.bundle"
请查看kzzzf的答案了解更多详情。
要将JS文件绑定到您的apk,同时让您的服务器运行( react-native start
)下载包到应用程序的资产目录中:
curl "http://localhost:8081/index.android.bundle?platform=android" -o "android/app/src/main/assets/index.android.bundle"
在下一个版本(0.12)中,我们将修复react-native bundle
命令,以便按照预期使用android项目。
下面在Ubuntu 14.04上为我工作:
cd (App Dir) react-native start > /dev/null 2>&1 & adb reverse tcp:8081 tcp:8081
更新 :请参阅
- 在设备上运行(Android)
- 设备警告被抑制?
更新2 :@scgough我们得到了这个错误,因为React Native(RN)无法从运行在我们工作站上的开发服务器上获取JavaScript。 你可以看到为什么发生在这里:
如果您的RN应用程序检测到您正在使用Genymotion或模拟器,它会尝试从GENYMOTION_LOCALHOST(10.0.3.2)或EMULATOR_LOCALHOST(10.0.2.2)中获取JavaScript。 否则,它假定您正在使用设备,并尝试从DEVICE_LOCALHOST(localhost)获取JavaScript。 问题是开发服务器运行在您的工作站的本地主机,而不是设备的,所以为了得到它的工作,你需要:
- 从(设备的本地主机):8081 / TCP到(工作站的本地主机):8081 / TCP的转发stream量。 这就是adb命令所做的。
- 告诉你的RN应用程序在哪里可以find你的开发服务器。
好的,我想我已经想出了这个问题。 这与我正在运行的watchman
的版本有关。
在新的shell中,运行brew update
然后: brew unlink watchman
然后: brew install watchman
现在,您可以从项目文件夹运行react-native start
我打开这个shell,创build一个新的shell窗口,并从我的项目文件夹运行: react-native run-android
。 一切都与世界正确。
PS。 我原本是守望者的3.2版本。 这升级到3.7。
PPS。 我是新来的,所以这可能不是最快捷的解决scheme,但它已经为我工作。
*有关运行/debugging设备的更多信息*
您可能会发现,如果将应用程序部署到您的Android设备而不是仿真器,则会出现红色屏幕,并显示Unable to load JS Bundle
的错误消息。 您需要将您的设备的debugging服务器设置为您的计算机正在运行反应…或者其名称或IP地址。
- 按设备
Menu
button - select
Dev Settings
- select
Debug server host for device
- input你的机器的IP和Reload JS加上反应端口例如
192.168.1.10:8081
更多信息: http : //facebook.github.io/react-native/docs/running-on-device-android.html
从您的项目目录中运行
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)
一个简单的解决scheme,适用于Ubuntu 14.04。
react-native run-android
模拟器(已经启动)将返回:无法下载JS捆绑; 重新启动JS服务器:
react-native start
在模拟器上点击Reload JS。 它为我工作。 希望它会有所帮助
在Android的应用程序,我打开菜单(在Genymotion命令+ M) – >开发设置 – >debugging服务器主机和端口的设备
将该值设置为:localhost:8081
它为我工作。
在尝试了这些答案的组合后,这就是为我工作的。
我使用Genymotion作为我的模拟器。
1启动Genymotion仿真器。
2从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从模拟器重新加载。
它加载!
我现在可以开始发展。
我没有足够的声望发表评论,但这是指dsissitka的答案。 它也适用于Windows 10。
重申一下,这些命令是:
cd (App Dir) react-native start > /dev/null 2>&1 & adb reverse tcp:8081 tcp:8081
从手机中删除应用程序! 我尝试了几个步骤,但最终做到了。
- 如果您尝试之前运行您的应用程序,但失败,从您的Android设备中删除它。
- 运行
$ react-native run-android
- 在Android设备上的应用程序中打开React Rage Shake菜单,进入
Dev Settings
,然后进入Debug server host & port for device
。 在那里input您的服务器IP(您的计算机的IP)和主机8081
,例如192.168.50.35:8081
。 在Mac上,您可以在System Preferences -> Network -> Advanced... -> TCP/IP -> IPv4 Address
find您的计算机的System Preferences -> Network -> Advanced... -> TCP/IP -> IPv4 Address
。 - 再次打开Rage Shake菜单并点击
Reload JS
。
显然adb反向是在Android 5.0中引入的
在“adb reverse”上获取“error:closed”两次
我想我们必须继续kzzzf的答案
在停止react-native run-android
进程之后,我在Linux上得到了这个结果。 似乎节点服务器仍在运行,所以下次运行它时,它将无法正常运行,并且您的应用程序无法连接。
这里的修正是杀死在Xterm中运行的节点进程,你可以通过ctrl-c
这个窗口(更简单)来杀死它,或者你可以使用lsof -n -i4TCP:8081
然后kill -9 PID
来find它。
然后再次运行react-native run-android
。
检查你的WiFi连接。
另一种可能性可能是你没有连接到无线networking,连接到错误的networking,或者你的开发设置中的IP地址是错误的。 出于某种原因,我的android从无线networking断开,我开始得到这个错误,不知不觉中。
在设备上运行
我find了另一个答案。
- adb reverse:只适用于Android 5.0+(API 21)。
- 另一个:通过摇动设备打开开发菜单,进入开发设置 ,转到设备的debugging服务器主机 ,键入您的机器的IP地址和本地开发服务器的端口
更新
现在在Windows上,无需运行react-native启动。 打包程序将自动运行。
以下是在Android(发行版)上运行您的应用程序的简单步骤:
1.转到您的应用程序根目录。
2.运行这个命令。
react-native bundle –platform android –dev false –entry-file index.android.js –bundle -out android / app / src / main / assets / index.android.bundle –assets-dest android / app / SRC /主/ RES
所有的文件都被复制。
3.创build签名的APK。
打开android studio。
生成>生成签名APK> [填写必要的细节,在此步骤之前必须生成击键]
您的APK应该生成没有任何错误。 安装在您的设备上,这应该没有任何问题。
您也可以连接您的设备,并直接点击Android工作室上的运行图标进行testing。
生成按键:
-
转到C:\ Program Files \ Java \ jdkx.x.x_x \ bin
-
跑
keytool -genkey -v -keystore d:\ my_private_key.keystore -alias my-key-alias -keyalg RSA -keyize 2048 -validity 10000
它可能会要求你填写一些细节。 这样做,你有你的keystroke文件( my_private_key.keystore )可以用来签署你的apk。
我只使用Ubuntu和Android,但无法运行。 我发现了一个非常简单的解决scheme,即更新你的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设备在您的计算机上查找节点服务器,而不是在本地电话上查找。
运行npm从react-native目录开始为我工作。
我发布了一个关于如何生成反应原生包并调整Studio以识别节点安装(特别是在Mac上)的答案:
如何在Android上使用脱机捆绑来反应原生项目?
最初的问题是关于重新加载物理设备中的应用程序。
当你在一个物理设备上debugging应用程序的时候(例如,通过adb),你可以通过点击设备左上angular的“action”button来重新加载JS包。 这将打开选项菜单(重新加载,远程debuggingJS …)。
希望这可以帮助。
检查目前没有人提到的一个重要的事情是: 检查你的本地防火墙,确保它被closures 。
看到我的回应在这里: https : //stackoverflow.com/a/41400708/1459275
这个错误可以通过以下步骤轻松解决:
//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
您可以按照官方页面上提到的指示来解决这个问题。 这个问题发生在真实的设备上,因为JS软件包位于您的开发系统上,而真实设备中的应用程序并不知道它的位置。