ChatGPT解决这个技术问题 Extra ChatGPT

Android 加载 JS 包失败

我正在尝试在我的 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 的答案以获取更多详细信息。

还没有弄清楚这个问题。但与此同时,您可以在模拟器上试用。它在我的 genymotion 上运行良好。
当我尝试输入两个命令以在本地服务器上运行时,我在 powershell 中收到错误消息:“不允许使用与号 (&) 字符”。我假设在运行命令时我应该在我的 app-dir 的根目录中?
这是否意味着由于不支持 adb reverse 而无法在 Android 4.1 上通过 USB 进行调试?
我想提一下,要能够执行 adb reverse tcp:8081 tcp:8081,您需要 ADB 1.0.32 版本,reverse 选项不在 1.0.31 中

k
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 项目。


谢谢你!如何告诉 reactInstanceManager 使用捆绑的资产?还是魔法自动发生?
创建文件失败警告:android/app/src/main/assets/index.android.bundle:没有这样的文件或警告:目录
警告:创建文件失败警告:android/app/src/main/assets/index.android.bundle:没有这样的文件或警告:目录卷曲:(23)写入正文失败(0!= 16167)
@Shivang:在 android/app/src/main 中创建目录资产。我有这个错误,因为它还不存在。
当我们在本地分发应用程序以进行测试时,这是最好和最简单的方法。 (通过织物)谢谢
d
dsissitka

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

将流量从(设备的本地主机):8081/tcp 转发到(工作站的本地主机):8081/tcp。这就是 adb 命令的作用。

告诉您的 RN 应用程序在哪里可以找到您的开发服务器。


在 osx 上运行 adb reverse tcp:8081 tcp:8081 也可以
有用!多谢。你知道是否有办法将 jscodelocation 指向 apk 资源,就像 iOS 的 main.jsbundle 一样?
@dsissitka 我可以问一下,所以它记录在线程中 - 那到底是做什么的?
@Matthew 不怕。对不起!
如果我们在 Android 4.2 上运行并收到此错误怎么办:stackoverflow.com/questions/31525431/…
E
Eugene Gr. Philippov

好的,我想我已经知道问题出在哪里了。这与我正在运行的 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


@jacobross85 很高兴它有帮助!如果您愿意,请给我点赞;-)
必须运行 brew uninstall watchman 才能为我安装最新版本。
我为那些调试到 Android 设备而不是模拟器的人添加了更多信息。
已经在运行最新版本的守望者,但这为我修复了它。威尔德
谢谢这位兄弟,真的很有帮助。这就是为什么我会给你投票。
P
Pēteris Caune

从您的项目目录中,运行

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)

我也遇到了 OP 报告的问题。我使用项目文件夹中的 react-native run-android 运行项目。它在终端中构建正常,但只要应用程序在我的设备上打开,我就会被红屏显示为 Unable to download JS bundle
你需要运行 adb reverse tcp:8081 tcp:8081
我运行 adb reverse tcp:8081 tcp:8081 并得到错误:关闭错误:关闭
我有同样的问题,错误:关闭。请问有什么帮助吗?
如果您使用的是 Android,请确保您的 IP 地址在“开发设置”中正确。如果您使用的是动态 IP,这可能会在一夜之间发生变化。
R
Raphael_b

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

react-native run-android

模拟器(已经启动)会返回:Unable to download JS Bundle;再次启动 JS 服务器:

react-native start

在模拟器上点击重新加载 JS。它对我有用。希望它会有所帮助


实际上有效。在所有答案中,这是最简单的解决方案。不敢相信这不在官方文档中。
OP 是关于在设备上运行,而不是在模拟器上运行。这些步骤在没有额外设置的设备上不起作用。请参阅已接受的答案。
D
Daniel Masarin

在android上的应用程序中,我打开了菜单(Genymotion中的Command + M)-> Dev Settings-> Debug server host & port for device

将值设置为:localhost:8081

它对我有用。


谢谢!为我工作
o
ooolala

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

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

从模拟器重新加载。

它加载!

我现在可以开始开发了。


在“adb reverse”上得到“错误:关闭”两次
仅供参考:我现在正在使用“Daniel Masarin”回答将调试服务器主机设置为我的 WiFi 地址,端口为 8081,它正在使用 RN v 0.17.0
非常感谢这对我有用:) 以上 API 21+ 仅适用于此
A
Andru

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

如果您之前尝试运行您的应用但失败,请将其从您的 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。


C
Community

显然 adb reverse 是在 Android 5.0 中引入的
Getting "error: closed" twice on "adb reverse"

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


S
Sean Saito

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

重申一下,命令是:

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

E
Edison D'souza

以下是在 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 后出现错误:资源重复
T
Travis Reeder

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

此处的解决方法是终止在 Xterm 中运行的节点进程,您可以通过 ctrl-c 将该窗口终止(更简单),或者您可以使用 lsof -n -i4TCP:8081 然后 kill -9 PID 找到它。

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


K
Kelsey

检查您的 wifi 连接。

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


谢谢,就是这样。默认情况下,可以在本地网络上访问调试服务器。因此,如果您没有 wifi 访问,您将无法访问它。
M
Mike Nguyen

Running on device

我找到了另一个答案。

adb reverse:仅适用于 Android 5.0+ (API 21)。

另:摇动设备打开开发者菜单,进入开发设置,进入设备调试服务器主机,输入你机器的IP地址和本地开发服务器的端口


J
Jagadish Upadhyay

更新

现在在 Windows 上无需运行 react-native start。打包程序将自动运行。


C
Community

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

在此处查看我的回复:https://stackoverflow.com/a/41400708/1459275


I
IonicBurger

我只使用 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 设备在您的计算机上而不是在手机上本地查找节点服务器。


C
Community

initial question 是关于在物理设备中重新加载应用程序。

当您在物理设备中调试应用程序时(即通过 adb),您可以通过单击设备左上角的“操作”按钮重新加载 JS 包。这将打开选项菜单(重新加载、远程调试 JS...)。

希望这可以帮助。


A
Atif Hussain

通过以下步骤可以轻松解决此错误:

    //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 吗?
在您的操作系统中找到 adb 文件夹。它在 Android SDK / 平台工具 /
但是我看到很多地方都提到这个命令可以在应用程序根文件夹中运行,dsissitka 的回答也建议在根应用程序文件夹中运行它,所以我真的很困惑。
可能这个命令也是由 react-native 处理的。我不确定这一点。但是android sdk工具支持adb。您可以在此处找到更多详细信息facebook.github.io/react-native/docs/…
@MarsonMao 根据您的系统设置,您可以从应用程序目录运行 adb。阅读 PATH 变量以及全局与本地包以获取更多信息。
m
mthakuri

您可以按照 official page 中提到的说明解决此问题。此问题发生在真实设备上,因为 JS 包位于您的开发系统中,而您真实设备中的应用程序不知道它的位置。


b
bobu

在新的 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>

C
Chaurasia

在同一个终端上启动两个终端,第一个终端运行 react-native start 和第二个终端 react-native run-android 这个问题很简单地解决了。祝你好运


A
Adriano Luiz Spanhol

我发现这很奇怪,但我有一个解决方案。我注意到每隔一段时间我的项目文件夹变成只读的,我无法从 VS 中保存它。所以我读了一个建议,将 NPM 从本地用户 PATH 转移到系统范围的 PATH 全局变量,它就像一个魅力。


J
JongLim107

###这是我的解决方案

以上解决方案都不能解决我的问题,但只能按照以下步骤为我工作。在 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"
    ...

A
Ali Shirazee

嘿,我的 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

这在我的例子中有效。


S
Sergey Onishchenko

从 react-native 目录运行 npm start 对我有用。