在没有开发服务器的设备上构建并安装未签名的APK?


166

由于我是本机新手,因此如果步骤中有任何错误,请告诉我。

我已经按照文档使用命令构建了一个React Native Android应用

react-native android

在设备上运行时,使用了以下命令

react-native运行Android

这使我的项目文件夹/ android / app / build / outputs / apk中有2个apk文件的输出

在此处输入图片说明

现在,当我用来在安装后安装此apk时,它要求开发服务器进行连接以捆绑JS。但是我的要求是用户不必安装开发服务器,而只需要安装apk就可以完成所有工作。

经历了一些stackoverflow问题,但对于构建不需要开发服务器的未签名apk并没有帮助。

你们可以帮助我找到如何在本机中构建和未签名apk的方法吗?


1
运行“ react-native start”,它将在开发模式下为您的js包提供服务器。目的是让您可以即时编辑js文件。使用发布模式不需要任何服务器,因为它将包括必需的捆绑软件。请参阅下面的答案
kar

Answers:


249

您需要手动创建捆绑包以进行调试。

捆绑调试版本:

#React-Native 0.59
react-native bundle --dev false --platform android --entry-file index.js --bundle-output ./android/app/src/main/assets/index.android.bundle --assets-dest ./android/app/src/main/res

#React-Native 0.49.0+
react-native bundle --dev false --platform android --entry-file index.js --bundle-output ./android/app/build/intermediates/assets/debug/index.android.bundle --assets-dest ./android/app/build/intermediates/res/merged/debug

#React-Native 0-0.49.0
react-native bundle --dev false --platform android --entry-file index.android.js --bundle-output ./android/app/build/intermediates/assets/debug/index.android.bundle --assets-dest ./android/app/build/intermediates/res/merged/debug

然后在捆绑后构建APK:

$ cd android
#Create debug build:
$ ./gradlew assembleDebug
#Create release build:
$ ./gradlew assembleRelease #Generated `apk` will be located at `android/app/build/outputs/apk`

PS另一种方法可能是修改gradle脚本。


3
万一有人丢失资产:这对我有用--assets-dest ./android/app/src/main/res/
有用 Juan Solano

11
如果在启动应用程序时这样做给我带来了一个大的红屏?(注意:弹出后,我将直接运行此命令)
Simon Forsberg

3
由于我们没有index.android.js,如何构建最新版本?
维维克

9
使用最新版本的人,请将入口点更改为--entry-file index.js,谢谢。
Rishabh Bhatia

4
react-native bundle --dev false --platform android --entry-file index.js --bundle-output ./android/app/build/intermediates/assets/debug/index.android.bundle --assets-dest。 / android / app / build / intermediates / res / merged / debug 用于新的响应版本,其中index.js统一用于ios和android
ir2pid,2018年

100

请按照这些步骤。

捆绑你的js:

如果项目根目录中有index.android.js,则运行

react-native bundle --dev false --platform android --entry-file index.android.js --bundle-output ./android/app/build/intermediates/assets/debug/index.android.bundle --assets-dest ./android/app/build/intermediates/res/merged/debug

如果项目根目录中有index.js,则运行

react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res

创建调试apk:

cd android/
./gradlew assembleDebug

然后,您可以在这里找到您的apk:

cd app/build/outputs/apk/

11
如果在启动应用程序时这样做给我带来了一个大的红屏?(请注意:弹出后我将直接运行此命令)
Simon Forsberg

2
@SimonForsberg,如果您使用react ^ 0.5,请将入口点更改为index.js而不是App.js或index.android.js, react-native bundle --dev false --platform android --entry-file index.js --bundle-output ./android/app/build/intermediates/assets/debug/index.android.bundle --assets-dest ./android/app/build/intermediates/res/merged/debug
d.bayo

3
无法正常运行,此命令将构建一个apk,但该apk在没有打包程序服务器的情况下无法运行。
Vishal Chhodwani

1
这行不通,因为它需要开发服务器
sheriff_paul

1
我遇到了同样的问题,当生成debug-APK时,我可以安装它,但是我需要dev服务器,当我使用发行版APK时,我无法在手机上安装它,我不知道该怎么办。是错的
aName

61

最新更新

在您的根项目目录中

确保您已经有目录android / app / src / main / assets /,如果没有创建目录,则在此之后创建新文件并另存为index.android.bundle,然后将文件放入android / app / src / main / assets / index.android 。束

之后运行这个

react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/

cd android && ./gradlew assembleDebug

然后你就可以得到apk应用程序/生成/输出/ APK /调试/ APP-debug.apk


这个答案真的很有效,非常感谢,
-aName

这个答案真的很有效,非常感谢,
-aName

@jeeva:如何将应用程序连接回react native的开发服务器?
Mayur Baldha,

创建点index.android.bundle对于不使用主机中的开发服务器确实很重要。
Lee Elton

@ Mayur Balha:您可以通过USB或wifi重新连接(连接在同一网络上)。要在您的React App中将WiFi连接回服务器,请在模拟器上摇动您的手机,按Win + R,然后单击dev settings。向下滚动“ Debug Server Host&Port”,输入您的IP地址和端口(在Windows上打开cmd,输入“ ipconfig”或Mac打开)终端输入“ ifconfig”),如192.168.1.1:8080,然后再次按ok摇动ok或按Win + R进行仿真器按重新加载,现在您可以看到应用重新连接到开发中(它仅适用于Debug,不适用于Release Apk)。
Jeeva

29

和我一起,在项目目录中运行以下命令。

对于react native的旧版本(您将在root中看到index.android.js):

mkdir -p android/app/src/main/assets && rm -rf android/app/build && 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 && cd android && ./gradlew clean assembleRelease && cd ../

对于本机新版本的反应(您只在根目录中看到index.js):

mkdir -p android/app/src/main/assets && rm -rf android/app/build && react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res && cd android && ./gradlew clean assembleRelease && cd ../

apk文件将在以下位置生成:

  • Gradle <3.0:android / app / build / outputs / apk /
  • Gradle 3.0+:android / app / build / outputs / apk / release /

您能详细说明一下如何解决问题吗?
2015年

我在index.android.bundle中打开错误,并根据您的建议解决了问题。谢谢... :)
zephyr '18

6
对我来说是$ mkdir -p android/app/src/main/assets && rm -rf android/app/build && react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res && cd android && ./gradlew assembleDebug
Arif

找不到文件:任何项目根目录中的index.android.js
Anuj

1
请注意,对于新项目而言,--entry-file index.android.js需要将其替换--entry-file index.js为,index.js而不是index.android.js位于其项目目录的根目录中。
达卡


4

从本机0.57开始,以前提供的答案都将不再起作用,因为gradle希望在其中找到捆绑包的目录和资产已更改。

没有反应本机捆绑的简单方法

构建调试版本的最简单方法是根本不使用react-native bundle命令,而只需修改您的app/build.gradle文件即可。

在文件的project.ext.react地图内app/build.gradle,添加bundleInDebug: true条目。如果您希望它不是一个--dev构建版本(没有警告和缩小的捆绑包),则还应该添加devDisabledInDebug: true条目到同一地图。

与反应本机捆绑

如果由于某种原因您需要或想要使用react-native bundle命令创建捆绑包,然后使用./gradlew assembleDebug来创建包含捆绑包和资产的APK,则必须确保将捆绑包和资产放置在正确的路径中,在这里可以使用gradle找到他们。

从本机0.57开始,这些路径 android/app/build/generated/assets/react/debug/index.android.js用于捆绑

android/app/build/generated/res/react/debug资产。因此,用于手动捆绑和使用捆绑包和资产构建APK的完整命令为:

react-native bundle --dev false --platform android --entry-file index.js --bundle-output ./android/app/build/generated/assets/react/debug/index.android.bundle --assets-dest ./android/app/build/res/react/debug

然后

./gradlew assembleDebug

捆绑和资产路径

请注意,gradle在其中查找包和资产的路径可能会更改。要找出这些路径在哪里,请查看目录中的react.gradle文件node_modules/react-native。以def jsBundleDir =和开头的行def resourcesDir =指定gradle在其中分别查找包和资产的目录。


3

对于Windows用户,如果所有步骤都可以正确执行:https : //facebook.github.io/react-native/docs/signed-apk-android.html

您只需要运行: gradlew assembleRelease

您的文件将是:

  • app-release.apk
  • 应用程式发布未对齐.apk

位置: E:\YourProjectName\android\app\build\outputs\apk


您可以将app-release.apk安装/共享到任何设备
Dharam Mali'1

2
通常,调试版本与发布版本具有不同的配置(例如,它使用登台API)。如果您想要使用与发布版本不同的构建配置的独立APK,这无济于事
Josh

此APK仅用于开发/测试目的。
Dharam Mali

3

我正在使用本机0.55.4,基本上我不得不手动捆绑:

react-native bundle --dev false --platform android --entry-file index.js --bundle- 
output ./android/app/build/intermediates/assets/debug/index.android.bundle --assets- 
dest ./android/app/build/intermediates/res/merged/debug

然后通过USB连接设备,启用USB调试。使用以下命令验证连接的设备adb devices

最后运行 react-native run-android,它将在您的手机上安装调试apk,您可以使用开发服务器正常运行

注意:

  • 从0.49.0开始,入口点是单个 index.js
  • gradlew assembleRelease 仅生成无法安装的未签名发行的apk

3

可以生成未签名的APK版本进行测试,以便您可以在手机上运行。

最初,我收到了此处提到最多的红色屏幕错误。但是我遵循这里提到的内容,对我有用。

在控制台上的工作目录中,运行以下四个命令

react-native bundle --dev false --platform android --entry-file index.js --bundle-output ./android/app/build/intermediates/assets/debug/index.android.bundle --assets-dest ./android/app/build/intermediates/res/merged/debug

cd android

gradlew assembleDebug

gradlew assembleRelease

然后APK文件将在以下位置生成:android \ app \ build \ outputs \ apk \ debug \ app-debug.apk


3

以防万一其他人最近也遇到了同样的问题,我使用的是React Native 0.59.8(也经过RN 0.60的测试),我可以确认其他一些答案,这是步骤:

  1. 卸载设备上已安装的应用程序的最新编译版本

  2. react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res

  3. cd android/ && ./gradlew assembleDebug

  4. 在文件夹android / app / build / outputs / apk / debug中获取您的app-debug.apk

祝好运!


1
无效!!!!,它会生成调试APK,但该应用仍需要开发服务器
-aName

这在反应本机0.59.8中不起作用,因为gradle期望捆绑在其中android/app/build/generated/assets/react/debug/index.android.js,资产在android/app/build/generated/res/react/debug反应本机0.57中。
TheBaj19年

对本机反应0.60>正常工作
Moso Akinyemi

0

我找到了一个更改buildTypes的解决方案,如下所示:

buildTypes {
  release {
    signingConfig signingConfigs.release
  }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.