我试图在我的Nexus5 (android 5.1.1)上运行AwesomeProject。

我能够构建项目并将其安装到设备上。但当我运行它时,我看到一个红色屏幕,上面写着

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

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

更新

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

React-native start > /dev/null 2>&1 & Adb reverse tcp:8081 tcp:8081

请看disssitka的回答,了解更多细节。

要在没有服务器的情况下运行,可以运行以下命令将jsfile捆绑到apk中:

在android/app/src/main下创建一个assets文件夹 旋度“http://localhost: 8081 / index.android.bundle吗?平台=android" -o "android/app/src/main/assets/index.android.bundle"

详情请看kzzzf的回答。


从项目目录中运行

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)

以下是我在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。你可以看到为什么会这样:

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。 问题是开发服务器运行在你的工作站的本地主机上,而不是设备的,所以为了让它工作,你需要:

从(设备的localhost):8081/tcp到(工作站的localhost):8081/tcp的转发流量。这就是adb命令的作用。 告诉您的RN应用程序在哪里可以找到您的开发服务器。


好吧,我想我知道问题出在哪里了。这和我当时扮演的守望者有关。

在一个新的shell中,运行brew update 然后:酿解守夜人 然后:酿造安装守望者

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

我让这个shell打开,创建一个新的shell窗口并从我的项目文件夹中运行:react-native run-android。世界一切都好。

ps.我最初玩的是3.2版的守望者。这将我升级到3.7。

pp。我是新手,所以这可能不是最快的解决方法,但对我来说很有效。

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

你可能会发现,如果你将应用部署到Android设备上,而不是模拟器上,你会看到一个红色的死机屏幕,错误提示无法加载JS Bundle。您需要为您的设备设置调试服务器为您的计算机运行react…名称或IP地址。

按设备菜单按钮 选择Dev Settings 为设备选择调试服务器主机或更改包位置 输入你的机器的IP和重载JS加上反应端口,例如192.168.1.10:8081

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


当你的服务器运行(react-native start)时,将JS文件捆绑到你的apk中下载到你的应用程序的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项目一起工作。


显然adb反向是在Android 5.0中引入的 在“adb reverse”上出现两次“错误:关闭”

我想我们必须继续kzzzf的答案


在尝试了这些答案的组合后,这是对我有用的。

我使用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

从模拟器重新加载。

它加载!

我现在可以开始显影了。


我没有足够的声誉来评论,但这是指dsissitka的答案。 它也可以在Windows 10上运行。

重申一下,这些命令是:

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

在android上的应用程序中,我打开菜单(Genymotion中的命令+ M) -> Dev Settings ->设备的调试服务器主机和端口

设置为:localhost:8081

这对我很管用。


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

react-native run-android

模拟器(已经启动)将返回:无法下载JS Bundle;重新启动JS服务器:

react-native start

在模拟器上点击重载JS。 这对我很管用。希望对大家有所帮助


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

这里的修复是杀死运行在Xterm中的节点进程,你可以通过ctrl- ctrl该窗口(更容易)杀死它,或者你可以使用lsof -n -i4TCP:8081然后杀死-9 PID找到它。

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


检查你的wifi连接。

另一种可能是你没有连接到wifi,连接到错误的网络,或者你的开发设置中的ip地址是错误的。出于某种原因,我的android与wifi断开了连接,我开始在不知不觉中得到这个错误。


删除你手机上的App !我尝试了几个步骤,但最终还是成功了。

If you tried to run your app before but failed, delete it from your android device. Run $ react-native run-android Open the React Rage Shake Menu from within your app on your android device, go to Dev Settings and then to Debug server host & port for device. There enter your server IP (IP of your computer) and host 8081, e.g. 192.168.50.35:8081. On a mac you can find the IP of your computer at System Preferences -> Network -> Advanced... -> TCP/IP -> IPv4 Address. Open the Rage Shake Menu again and click Reload JS.


我只使用Ubuntu和Android,我无法让它运行。我发现了一个非常简单的解决方案,那就是更新你的包。Json文件,更改这行:

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

to

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

然后通过输入命令运行服务器

npm run start

这确保android设备在您的计算机上查找节点服务器,而不是在本地手机上。


在设备上运行

我找到了另一个答案。

adb reverse:仅适用于Android 5.0+ (API 21)。 另一种方法:通过摇动设备打开开发人员菜单,进入开发设置,进入设备调试服务器主机,输入您的机器的IP地址和本地开发服务器的端口


从react-native目录运行npm start对我来说很有效。


一个更新

现在在windows上不需要运行react-native start。打包程序将自动运行。


最初的问题是关于在物理设备中重新加载应用程序。

当你在物理设备上调试应用程序时(比如通过adb),你可以通过点击设备左上方的“action”按钮重新加载JS包。这将打开选项菜单(重新加载,远程调试JS…)

希望这能有所帮助。


有一件重要的事情需要检查,到目前为止还没有人提到: 检查你的本地防火墙,确保它是关闭的。

请看我的回答: 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包位于您的开发系统上,而真实设备中的应用程序不知道它的位置。


以下是在android上运行应用的简单步骤:

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

2. 执行该命令。

React-native bundle——平台android——dev false——入口文件 index.android.js——bundle-output android / app / src / main /资产/ index.android。包——assets-dest android / app / src / main / res

所有文件都已复制。

3.创建签名APK。

打开android studio。

生成签名APK >[填写所需细节,在此步骤之前必须生成击键]

生成的APK应该没有任何错误。安装在您的设备上,这应该工作没有任何问题。

你也可以连接你的设备,直接点击android studio上的Run图标进行测试。


生成按键:

去C:\Program Files\Java\jdkx.x.x_x\bin 运行

Keytool -genkey -v -keystore d:\my_private_key。密钥别名 RSA -keysize 2048 -validity 10000

它可能会要求你填写一些细节。这样做,你就有了你的击键文件(my_private_key.keystore),可以用来签署你的apk。


在新的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,简单地解决了这个问题。祝你好运


嘿,我正面临这个问题与我的反应原生裸露项目,IOS模拟器工作良好,但android一直给我这个错误。这里有一个可能的解决方案,对我来说很有效。

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

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

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

然后检查adb devices命令是否显示 所附设备清单 模拟器- 5554设备

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

步骤4,执行NPX 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"
    ...