我正在尝试在我的 Nexus5 (android 5.1.1) 上运行 AwesomeProject。
我能够构建项目并将其安装在设备上。但是当我运行它时,我得到一个红屏说
无法下载 JS 包。您是否忘记启动开发服务器或连接您的设备?
在 react native iOS 中,我可以选择离线加载 jsbundle。我怎样才能为 Android 做同样的事情? (或者至少,我在哪里可以配置服务器地址?)
更新
要使用本地服务器运行,请在您的 react-native 项目根目录下运行以下命令
react-native start > /dev/null 2>&1 & adb reverse tcp:8081 tcp:8081
请查看 dsissitka 的答案以获取更多详细信息。
要在没有服务器的情况下运行,请将 jsfile 捆绑到 apk 中,方法是运行:
在 android/app/src/main 下创建 assets 文件夹 curl "http://localhost:8081/index.android.bundle?platform=android" -o "android/app/src/main/assets/index.android.bundle "
请查看 kzzzf 的答案以获取更多详细信息。
adb reverse
而无法在 Android 4.1 上通过 USB 进行调试?
adb reverse tcp:8081 tcp:8081
,您需要 ADB 1.0.32 版本,reverse
选项不在 1.0.31 中
要将 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。这就是 adb 命令的作用。
告诉您的 RN 应用程序在哪里可以找到您的开发服务器。
好的,我想我已经知道问题出在哪里了。这与我正在运行的 watchman
版本有关。
在新的 shell 中,运行 brew update
然后:brew unlink watchman
然后:brew install watchman
现在,您可以从项目文件夹中运行 react-native start
我让这个 shell 打开,创建一个新的 shell 窗口并从我的项目文件夹中运行:react-native run-android
。世界上一切都好。
附言。我最初使用的是 watchman 3.2 版。这将我升级到 3.7。
pps。我是新手,所以这可能不是解决问题的最快途径,但它对我有用。
* 在设备上运行/调试的更多信息 *
您可能会发现,如果您将应用部署到您的 Android 设备而不是模拟器,您会得到一个红屏死机,并显示错误消息 Unable to load JS Bundle
。您需要将设备的调试服务器设置为运行反应的计算机......它的名称或 IP 地址。
按设备菜单按钮选择开发设置选择设备的调试服务器主机或更改捆绑位置类型在您的机器的 IP 和重新加载 JS 加上反应端口,例如 192.168.1.10:8081
更多信息:http://facebook.github.io/react-native/docs/running-on-device-android.html
brew uninstall watchman
才能为我安装最新版本。
从您的项目目录中,运行
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)
react-native run-android
运行项目。它在终端中构建正常,但只要应用程序在我的设备上打开,我就会被红屏显示为 Unable to download JS bundle
一个适用于 Ubuntu 14.04 的简单解决方案。
react-native run-android
模拟器(已经启动)会返回:Unable to download JS Bundle;再次启动 JS 服务器:
react-native start
在模拟器上点击重新加载 JS。它对我有用。希望它会有所帮助
在android上的应用程序中,我打开了菜单(Genymotion中的Command + M)-> Dev Settings-> Debug server host & port for device
将值设置为:localhost:8081
它对我有用。
在尝试了这里的答案组合之后,这对我有用。
我使用 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
从模拟器重新加载。
它加载!
我现在可以开始开发了。
从您的手机中删除应用程序!我尝试了几个步骤,但最终做到了。
如果您之前尝试运行您的应用但失败,请将其从您的 Android 设备中删除。运行 $ react-native run-android 在您的 Android 设备上的应用程序中打开 React Rage Shake 菜单,转到开发设置,然后转到设备的调试服务器主机和端口。在那里输入您的服务器 IP(您的计算机的 IP)和主机 8081,例如 192.168.50.35:8081。在 Mac 上,您可以在系统偏好设置 -> 网络 -> 高级... -> TCP/IP -> IPv4 地址中找到您计算机的 IP。再次打开 Rage Shake 菜单并单击 Reload JS。
显然 adb reverse 是在 Android 5.0 中引入的
Getting "error: closed" twice on "adb reverse"
我想我们必须继续 kzzzf 的回答
我没有足够的声誉发表评论,但这是指 dsissitka 的回答。它也适用于 Windows 10。
重申一下,命令是:
cd (App Dir)
react-native start > /dev/null 2>&1 &
adb reverse tcp:8081 tcp:8081
以下是在 android(release) 上运行您的应用程序的简单步骤:
1. 转到您的应用程序根目录。
2. 运行此命令。
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
您的所有文件都被复制。
3. 创建签名的 APK。
打开安卓工作室。
Build > Generate Signed APK > [Fill required details, keystroke has been generated before this step]
生成的 APK 应该没有任何错误。安装在您的设备上,这应该可以正常工作。
您也可以连接您的设备并直接点击 android studio 上的 Run 图标进行测试。
生成击键:
转到 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
它可能会要求您填写一些详细信息。这样做,你就有了你的击键文件(my_private_key.keystore),它可以用来签署你的 apk。
react-native bundle
后出现错误:资源重复
停止 react-native run-android
进程后,我在 Linux 上得到了这个。似乎节点服务器仍在运行,因此下次运行它时,它将无法正常运行并且您的应用程序无法连接。
此处的解决方法是终止在 Xterm 中运行的节点进程,您可以通过 ctrl-c
将该窗口终止(更简单),或者您可以使用 lsof -n -i4TCP:8081
然后 kill -9 PID
找到它。
然后再次运行 react-native run-android
。
检查您的 wifi 连接。
另一种可能是您没有连接到wifi,连接到错误的网络,或者您的开发设置中的IP地址错误。出于某种原因,我的 android 与 wifi 断开连接,我开始在不知不觉中收到此错误。
我找到了另一个答案。
adb reverse:仅适用于 Android 5.0+ (API 21)。
另:摇动设备打开开发者菜单,进入开发设置,进入设备调试服务器主机,输入你机器的IP地址和本地开发服务器的端口
更新
现在在 Windows 上无需运行 react-native start。打包程序将自动运行。
我只使用 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 设备在您的计算机上而不是在手机上本地查找节点服务器。
initial question 是关于在物理设备中重新加载应用程序。
当您在物理设备中调试应用程序时(即通过 adb),您可以通过单击设备左上角的“操作”按钮重新加载 JS 包。这将打开选项菜单(重新加载、远程调试 JS...)。
希望这可以帮助。
通过以下步骤可以轻松解决此错误:
//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
adb reverse tcp:8081 tcp:8081
吗?
在新的 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>
在同一个终端上启动两个终端,第一个终端运行 react-native start 和第二个终端 react-native run-android 这个问题很简单地解决了。祝你好运
我发现这很奇怪,但我有一个解决方案。我注意到每隔一段时间我的项目文件夹变成只读的,我无法从 VS 中保存它。所以我读了一个建议,将 NPM 从本地用户 PATH 转移到系统范围的 PATH 全局变量,它就像一个魅力。
###这是我的解决方案
以上解决方案都不能解决我的问题,但只能按照以下步骤为我工作。在 network-security-config.xml
文件中添加
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">10.0.2.2</domain>
</domain-config>
...
然后更新 AndroidManifest.xml
文件
<application
+ android:networkSecurityConfig="@xml/network_security_config"
...
嘿,我的 react-native 裸项目遇到了这个问题,IOS 模拟器工作正常,但 android 一直给我这个错误。这是一个对我有用的可能解决方案。
第 1 步,通过在终端中运行来检查 adb 设备是否已获得授权: adb devices
如果未经授权,请运行以下命令
第 2 步,sudo adb kill-server 第 3 步,sudo adb start-server
然后检查 adb devices 命令是否显示连接的设备列表 emulator-5554 设备
如果它是设备而不是未经授权,而不是未经授权
第四步,运行 npx react-native run-android
这在我的例子中有效。
从 react-native 目录运行 npm start 对我有用。