应用程序启动时出现错误“无法获取 BatchedBridge,请确保您的捆绑包已正确打包”
Posted
技术标签:
【中文标题】应用程序启动时出现错误“无法获取 BatchedBridge,请确保您的捆绑包已正确打包”【英文标题】:error "Could not get BatchedBridge, make sure your bundle is packaged properly" on start of app 【发布时间】:2016-12-16 16:17:09 【问题描述】:尝试在 android 4.4.2 上创建 react-native 项目时出现此错误屏幕
找不到任何解决方法。我尝试重新启动打包程序,重新连接设备,甚至重新安装 react native 并启动新项目。在 6.0.0 及更高版本上它工作得很好。
【问题讨论】:
执行react-native run-android
后是否出现此错误?在这种情况下,我遇到了错误,这很奇怪,因为在调试模式下,应该不需要 JS 捆绑包 afaik,因为它应该连接到包服务器。
我在这里发布了同样问题的答案:***.com/a/45110063/706798
我收到了同样的错误消息,但适用于 ios。有人有建议吗?我尝试运行“react-native run-ios”,但它不起作用,因为 XCode 在我的外部驱动器上。
【参考方案1】:
对此的一个可能解决方案是,您很可能不首先捆绑您的应用程序,执行以下步骤,然后将您的 app-debug.apk 部署到您的设备
$ cd myproject
$ react-native start > /dev/null 2>&1 &
$ curl "http://localhost:8081/index.android.bundle?platform=android" -o "android/app/src/main/assets/index.android.bundle"
(如果文件夹assets
不存在则创建)
然后从项目根目录运行
$> (cd android/ && ./gradlew assembleDebug)
将创建的 apk 安装到您的设备,位置为:android/app/build/outputs/apk/app-debug.apk
如果这能解决您的问题,请告诉我
编辑:
您可以简单地将其作为脚本放入您的 package.json 中以使其自动化,我相信它将在即将发布的 react-native 版本中修复,并将在组装最终 APK 之前执行,因此不需要(我也希望)
放:
"scripts":
"build": "(cd android/ && ./gradlew assembleDebug)",
"start": "node node_modules/react-native/local-cli/cli.js start",
"bundle-android": "react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output android/app/src/main/assets/index.android.bundle --sourcemap-output android/app/src/main/assets/index.android.map --assets-dest android/app/src/main/res/"
,
或者前面提到的 curl 等价物,但在大多数情况下,上面的方法更健壮
【讨论】:
是的,它有效!我刚刚做了什么?为什么卷曲?另外,这可以自动化吗? 非常感谢,因为我的应用没有链接 React 本机包。 这似乎是一个 hack。如果您将 javascript 打包到单个文件中,您在开发期间运行应用程序时不会获得实时重新加载功能吗? 这不是用于开发,而是用于实际的 APK 打包 什么都没有发生,我仍然收到错误:- com.facebook.react.devsupport.JSException: 无法获取 BatchedBridge,请确保您的包已正确打包【参考方案2】:我也遇到过这个问题。 我所做的是强行杀死我设备上的应用程序,然后我打开另一个控制台并运行
react-native start
然后我从我的设备再次打开该应用程序,它又开始工作了。
编辑:如果您通过 USB 使用 android 设备并拔下它或您的计算机进入睡眠状态,您可能需要先运行
adb reverse tcp:8081 tcp:8081
【讨论】:
这解决了我在使用react-native run-android
时遇到的问题。当我在做react-native run-ios
时,我从来不需要使用react-native start
这行得通,但为什么会这样?这会被修复吗?我是否必须始终打开 2 个终端,并先执行“启动”,然后才能在设备上运行它?
它也适用于我!花了几个小时寻找解决方案
adb reverse tcp:8081 tcp:8081
对我来说本身就足够了。非常感谢!
这太棒了,之后你可以执行 ./adb install【参考方案3】:
刚刚收到此错误。这是我所做的修复:
我选择Dismiss
,进入开发者菜单,然后Dev Settings
,
选择Debug server host & port for device
,我添加了我的电脑IP地址和端口:192.168.0.xx:8xxx
,使用你的开发者机器分配的IP地址在你的wifi网络上。端口通常是:8081
一旦我这样做了,一切都很顺利。此外,当您在开发菜单中时,请记住选择 Enable Live Reload
和 Debug JS Remotely
,这样可以让您在调试时更加轻松。
【讨论】:
有效!对于 ubuntu 用户:运行ifconfig
,然后找到 inet addr:xxx.xxx.xxx.xxx 其中 xxx* 是您的开发者机器 ip
这在 API 级别 19 / Kitkat 4.4 上对我有用,请参阅 ***.com/questions/31525431/…、facebook.github.io/react-native/docs/…
谢谢!我只需要在不使用 USB 电缆(使用 WiFi ADB 等工具)进行调试时进行此配置。
重要的是要注意,您可以通过物理摇动您的安卓设备来制作@cube 引用的开发者菜单。这可能看起来很奇怪,但这就是它的原因。然后按照其余说明进行操作。这为我解决了问题。【参考方案4】:
这对我有用(在尝试了我找到的所有其他解决方案之后......):
在\Android\sdk\platform-tools
内运行adb reverse tcp:8081 tcp:8081
【讨论】:
可以在任何地方运行此命令,不必在平台工具中运行 我发现react-native run-android
尝试运行该命令并依赖Windows 环境变量path
来包含platform-tools
路径。
谢谢你,这有效。路径是 C:\Users\USERNAME\AppData\Local\Android\sdk\platform-tools
不,不适用于 Windows 10 和 Android 模拟器【参考方案5】:
当我第一次使用物理设备开始使用 React Native 时,我也得到了这个。如果是这种情况,您需要在开始之前做一些额外的事情。你必须在 React Native 的“Dev Settings”中输入一些关于你的开发机器的信息。
当您看到错误时,摇晃您的设备。将弹出一个对话框,最后一个选项将是“开发设置”。选择“Debug server hot & port for device”并输入您的本地 IP 和使用的端口(通常为 8081)。
见https://facebook.github.io/react-native/docs/running-on-device-android.html最后一段
【讨论】:
这实际上是我上面所说的(八月)的逐字重复 我不知道我需要摇动设备。首先,我会将其作为评论发布,但我没有足够的积分来做到这一点。我确实赞成你的帖子。 最简单、最干净的解决方案。谢谢!【参考方案6】:如果没有一个解决方案适合你,试试这个:
我发现我的 <root>/android/app/build/intermediates/assets/debug
文件夹是空的,并且通过运行 cd android && ./gradlew assembleDebug
并没有创建那些需要的文件,这些文件后来被我们的 react 本机应用程序中的 javascript 线程使用。
我手动运行了调试构建命令应该创建的以下命令。
node node_modules/react-native/local-cli/cli.js bundle --platform android --dev true --reset-cache --entry-file index.android.js --bundle-output /<path to dir>/android/app/build/intermediates/assets/debug/index.android.bundle --assets-dest /<path to dir>/android/app/build/intermediates/res/merged/debug
运行这些命令后,我在这个目录<root>/android/app/build/intermediates/assets/debug
找到了两个捆绑文件
然后我又跑了cd android && ./gradlew installDebug
我的应用又开始工作了。
将进行更多调试并更新实际失败的内容。
【讨论】:
只是为了澄清发生了什么,似乎将 react native 集成到现有项目中时,捆绑输出路径不会自动设置,因此您必须自己设置。因此捆绑输出 path=/path/to/assets ? 顺便说一句,你是最棒的。【参考方案7】:在单独的终端中,将您的设备连接到计算机并运行以下命令:
react-native start
cd user/Library/Android/sdk/platform-tools/
./adb reverse tcp:8081 tcp:8081
应用程序终端:
react-native run-android
install apk on your device from this location android/app/build/outputs/apk/app-debug.apk
【讨论】:
也许您可以扩展您的答案以包含更多关于您的答案中各个步骤的含义的详细信息,应该从哪些目录运行命令等?我认为这会让你的回答更有帮助。 这是正确的答案。这使您可以通过连接到 react 本机服务器来快速迭代,而不必在每次更改时重新打包捆绑包。【参考方案8】:见issue:
1.react-native 启动
2.点击您设备上的Reload(R,R)
。
【讨论】:
【参考方案9】:这有点太晚了,但这确实对我有用。
react-native run-android
。
react-native start
。
第一个命令将为 android 构建 apk
并在连接时将其部署到您的设备上。当您打开应用程序时,它会显示错误的红屏。然后运行第二个命令,它将运行打包程序并为您构建应用程序包。
【讨论】:
【参考方案10】:在终端中尝试此命令,然后重新加载。它对我有用
adb 反向 tcp:8081 tcp:8081
【讨论】:
【参考方案11】:-
重启 genymotion
运行
react-native run-android
问题已解决
【讨论】:
真的吗?restart the genymotion
?泰田鼠。
这就像说“哦,您的网站无法正常工作?请尝试重新启动您的服务器。”【参考方案12】:
我在设备 Z3 Compact D5803 - 6.0.1 上遇到了同样的异常
我打开 .buckconfig 文件并更改了行:
target = Google Inc.:Google APIs:23
到
target = Google Inc.:Google APIs:24
因为我在 SDK Manager 中看到 Android 6.X 有 api level 24。
【讨论】:
【参考方案13】:对我来说,这是因为adb
不在PATH
中。它位于 /Users/man/Library/Android/sdk/platform-tools
对我来说,它可能在其他地方对你来说,但无论如何,找到它并将它添加到你的路径中,看看是否有帮助。
【讨论】:
【参考方案14】:由于您使用的是 Android adb reverse 方法,但 Facebook 已添加 official documentation to connect to the development server via Wi-Fi,它将支持您的版本。引用 MacOS 的说明,但他们也有适用于 Linux 和 Windows 的说明:
方法二:通过 Wi-Fi 连接
您还可以通过 Wi-Fi 连接到开发服务器。您首先需要使用 USB 电缆在您的设备上安装该应用程序,但一旦完成,您可以按照这些说明进行无线调试。在继续之前,您需要开发机器的当前 IP 地址。
您可以在系统偏好设置 → 网络中找到 IP 地址。
确保您的笔记本电脑和手机在同一个 Wi-Fi 网络上。 在您的设备上打开您的 React Native 应用程序。 您会看到一个带有错误的红屏。还行吧。以下步骤将解决该问题。 打开应用内开发者菜单。 转到开发设置 → 调试设备的服务器主机。 输入您机器的 IP 地址和本地开发服务器的端口(例如 10.0.1.1:8081)。 返回到 Developer 菜单并选择 Reload JS。
【讨论】:
【参考方案15】:它“随机”出现了这个问题,我花了一些时间才意识到我的场景出了什么问题。
我更新到 React-native-cli 2.0.1 后,有一条消息输出到日志中,帮助我挖掘并找到根本原因:
JS 服务器无法识别,继续构建...
在研究了一些链接后,我发现了这个:
Unable to recognize JS server
由于我在 Windows 上,我运行 netstat 并发现我的 VLC 播放器也在端口 8081 上运行,从而导致了问题。 所以,就我而言,如果我在 react-native 服务器之前启动 vlc 服务器,它将无法工作。
在以前版本的 react-native-cli 上没有输出相同的日志消息,导致它静默失败。
TL、DR:检查是否有任何东西在与包管理器相同的端口上运行(默认为 8081)
【讨论】:
【参考方案16】:我的方法是:
react-native start
之后在您的设备中使用:
click to Reload.
在控制台 react-native 中查看,它将获取 js 捆绑数据。
【讨论】:
这是我的问题,因为终端没有启动。谢谢!【参考方案17】:我的问题是我浏览了我的 AndroidManifest.xml
文件并删除了该行
<uses-permission android:name="android.permission.INTERNET" />
因为我的应用不需要互联网。但是,react native 调试应用程序确实需要互联网访问(访问打包程序)哎呀。 :)
【讨论】:
你拯救了我的一天。正在扯掉我的头发:)【参考方案18】:尝试清理缓存
react-native start --reset-cache
【讨论】:
【参考方案19】:请检查您在运行react-native run-android
时是否有以下错误:
adb server version (XX) doesn't match this client (XX); killing...
在这种情况下,请确保 /usr/local/opt/android-sdk/platform-tools/adb
和 /usr/local/bin/adb
指向相同的 adb
在我的例子中,一个指向/Users/sd/Library/Android/sdk/platform-tools/adb
(Android SDK),但另一个指向/usr/local/Caskroom/android-platform-tools/26.0.2/platform-tools/adb
(Homebrew)
并且在他们都指向/Users/sd/Library/Android/sdk/platform-tools/adb
(Android SDK) 后问题已得到修复
【讨论】:
【参考方案20】:我也遇到了这个错误,真的很困惑。因为所有答案都不起作用。 将 adb 添加到路径之后。
【讨论】:
【参考方案21】:对我来说,我启用并激活了侧同步。立即关闭它使问题消失了。关闭 PC 和设备之间的此通信或任何其他通信可能是值得的
【讨论】:
【参考方案22】:我最终不得不打开我正在使用的端口(默认为 8081)。在 Linux 上,您可以执行以下操作
sudo iptables -A INPUT -p tcp --dport 8081 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 8081 -m conntrack --ctstate ESTABLISHED -j ACCEPT
你可以测试看看你是否真的需要这样做。只需在 Android 设备上的 Chrome 中导航到您的开发服务器。如果它没有响应,那么这可能就是您需要的。如果它确实响应,那么这将无济于事。
【讨论】:
【参考方案23】:我遇到了同样的问题。当我确实通过 create-react-native-app AwesomeProject 创建了一个 react native 项目时,它在手机上的 Expo 应用程序中运行良好。之后,我想使用该快速入门项目来开发我的项目并遇到与您相同的错误。
经过一些研究,我发现最好使用 react-native init AwesomeProject 启动新项目(所有设置都在 react native 文档中)然后运行以下命令:
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/
这应该用 bundle 解决问题(--dev false 不显示警告)
要让应用在虚拟/真实设备上运行,您需要做的就是:
react-native run-android
它应该工作得很好。至少它对我有用。
【讨论】:
【参考方案24】:对我来说,问题是“adb”未被识别 - 检查this 答案。
要解决此问题,请将 C:\Users\USERNAME\AppData\Local\Android\sdk\platform-tools 添加到环境变量中
【讨论】:
【参考方案25】:当我们启动 react native 项目#1 时,我们大多数人第一次遇到这个问题。
几个简单的步骤解决了我的问题:
我使用命令创建了一个示例项目:
react-native init ReactProject1
解决方案
解决方法是帮助local-cli\runAndroid\adb.js
找到adb.exe
,方法和local-cli\runAndroid\runAndroid.js
一样:
在项目名称下找到替换语句(无论你给出什么)\node_modules\react-native\local-cli\runAndroid
替换:
const devicesResult = child_process.execSync('adb devices');
作者:
const devicesResult = child_process.execSync( (process.env.ANDROID_HOME ? process.env.ANDROID_HOME + '/platform-tools/' : '') + 'adb devices');
完成上述替换后,只需在您的 cmd 中运行 react-native run-android,它会捆绑 apk 并首先尝试在您的设备中本地安装 js 捆绑包。 (成功)
【讨论】:
【参考方案26】:有人推荐了以下一个
react-native run-android react-native start --reset-cache,
但就我而言,我只是关闭了 cli 命令提示符窗口并使用了以下内容。
npx react-native run-android
效果很好。
【讨论】:
【参考方案27】:我尝试了上面/下面的许多建议,但最终,我遇到的问题是 watchman 的权限问题,它是之前使用自制软件安装的。如果您在尝试使用模拟器时查看终端消息,并在模拟器上遇到有关 watchman 的“权限被拒绝”错误以及“无法获取 BatchedBridge”消息,请执行以下操作:
转到您的/Users/<username>/Library/LaunchAgents
目录并更改权限设置,以便您的用户可以读取和写入。这与您是否真的有一个 com.github.facebook.watchman.plist
文件无关。
【讨论】:
【参考方案28】:我发现我还需要添加一个
react-native 升级
让应用程序正确运行。
【讨论】:
【参考方案29】:我也遇到了同样的问题,但这是我自己犯的一个愚蠢的错误......
在 Android Studio 中,我从 app
projet 而不是 root
projet 启动了 installDebug/installRelease
gradle 脚本。
【讨论】:
【参考方案30】:最简单的方法!
停止服务器并结束项目构建。 打开一个“Node.js”终端。 导航到包含“react-native”项目的文件夹。 Type 'react-native start' -- 手动启动 react native 服务器。 转到您的代码编辑器终端并输入“react-native run-android”。一切顺利!
【讨论】:
以上是关于应用程序启动时出现错误“无法获取 BatchedBridge,请确保您的捆绑包已正确打包”的主要内容,如果未能解决你的问题,请参考以下文章