如何生成一个可以 运行 没有服务器的 apk 和 react-native?

How can I generate an apk that can run without server with react-native?

我已经构建了我的应用程序,我可以 运行 在我的本地模拟器上(以及通过更改调试服务器在同一网络内的我的 android 设备上)。

但是,我想构建一个 APK,我可以将其发送给无法访问开发服务器的人,并且我希望他们能够测试应用程序。

我看到文档的 iOS 部分有一个使用离线包的部分。但是我无法弄清楚如何为 android 完成同样的事情。这可能吗?如果可以,怎么做?

更新:关于这个问题的答案()据说可以从开发服务器下载离线包。但是当我从开发服务器获取包时,无法加载图像文件。

您必须创建一个密钥来签署 apk。使用以下内容创建您的密钥:

 keytool -genkey -v -keystore my-app-key.keystore -alias my-app-alias -keyalg RSA -keysize 2048 -validity 10000

出现提示时使用密码

生成密钥后,使用它生成可安装版本:

 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/

使用 gradle

生成构建
 cd android && ./gradlew assembleRelease

将 APK 上传到您的 phone。 -r 标志将替换现有应用程序(如果存在)

adb install -r ./app/build/outputs/apk/app-release-unsigned.apk

这里有更详细的描述:https://facebook.github.io/react-native/docs/signed-apk-android.html

更新:基于@shashuec 和@Fallen

的评论

如果出现错误

ENOENT: no such file or directory, open 'android/app/src/main/assets/index.android.bundle'

运行 mkdir android/app/src/main/assets

运行 这个命令:

react-native run-android --variant=release

Note that --variant=release is only available if you've set up signing with cd android && ./gradlew assembleRelease.

你应该只使用 android studio 来完成这个过程。它只是更简单。但是首先 运行 这个命令在你的本机应用程序目录中:

对于 react-native 的较新版本(例如 React Native 0.49.0 等...)

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

对于 react-native 的旧版本(0.49.0 及以下版本)

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/

然后使用android studio打开你react native app目录下的'android'文件夹,会要求升级gradle等东西。转到 build-> Generate signed APK 并按照那里的说明进行操作。真的很简单。

如果你得到Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES].

我尝试使用@Aditya 的方法生成未签名的 APK 文件并安装它,但是当我将它安装到我的 Android 平板电脑上时,它给了我 Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES] 错误。

我想这是因为 APK 文件没有签名,平板电脑对此不满意。因此,在生成 React Native 包文件后,我能够像往常一样通过 Android Studio 生成签名的 APK 文件。

顺便说一句,我们的应用程序是一个功能齐全的 Android 应用程序,它已经存在于 Play 商店中,我们只是将 React Native 添加到它的小块中,因为它是太棒了。

总结一下,这是我的步骤:

1) 生成 React Native 包:

react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output android/<your-package-name>/src/main/assets/index.android.bu‌​ndle --assets-dest android/<your-package-name>/src/main/res/ 

2) 从 Android Studio 生成签名的 APK 文件。

3) 将签名的 APK 文件安装到 USB 设备:

adb -d install -r <path_to_signed_apk> 

如果您也有模拟器运行,-d标志只是告诉adb安装在连接的USB设备上。如果您想安装在任何模拟器上,请删除 -d 标志。

4)盈利!

我有另一个解决方案:- 生成签名密钥 您可以使用 keytool 生成私有签名密钥。在 Windows 上,keytool 必须是来自 C:\Program Files\Java\jdkx.x.x_x\bin.

的 运行
$ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

将 my-release-key.keystore 文件放在项目文件夹的 android/app 目录下。

编辑项目文件夹中的文件 android/app/build.gradle 并添加签名配置,

android {
....
signingConfigs { 
  release { 

      storeFile file('my-release-key.keystore') 
      storePassword 'yourpassword' 
      keyAlias 'my-key-alias' 
      keyPassword 'yourpassword' 

  } 
}}}


buildTypes {release {signingConfig signingConfigs.release}}

和运行

gradlew assembleRelease

这会给你两个文件 android\app\build\outputs\apk app-release.apk 和 app-release-unsigned.apk 现在在您的 android 设备中安装 app-release.apk。

根据 Aditya Singh 的回答,生成的(未签名的)apk 无法安装在我的 phone 上。我必须使用说明 here.

生成签名的 apk

以下对我有用:

$ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

my-release-key.keystore 文件放在 android/app 下 项目文件夹中的目录。然后编辑文件 ~/.gradle/gradle.properties 并添加以下内容(替换 **** 使用正确的密钥库密码、别名和密钥密码)

MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
MYAPP_RELEASE_KEY_ALIAS=my-key-alias
MYAPP_RELEASE_STORE_PASSWORD=****
MYAPP_RELEASE_KEY_PASSWORD=****

如果您使用的是 MacOS,您可以使用说明 here 将密码存储在钥匙串中,而不是以明文形式存储。

然后编辑 app/build.gradle 并确保存在以下内容(可能需要添加带有 signingConfigs signingConfig 的部分):

...
android {
    ...
    defaultConfig { ... }
    signingConfigs {
        release {
            if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
                storeFile file(MYAPP_RELEASE_STORE_FILE)
                storePassword MYAPP_RELEASE_STORE_PASSWORD
                keyAlias MYAPP_RELEASE_KEY_ALIAS
                keyPassword MYAPP_RELEASE_KEY_PASSWORD
            }
        }
    }
    buildTypes {
        release {
            ...
            signingConfig signingConfigs.release
        }
    }
}
...

然后 运行命令cd android && ./gradlew assembleRelease,

For Windows 'cd android' 然后 运行 gradlew assembleRelease 命令,然后找到你的 signed android/app/build/outputs/apk/app-release.apk 下的 apk,或 android/app/build/outputs/apk/release/app-release.apk

转到项目目录并运行命令:

cd android && ./gradlew assembleRelease

对于 React Native 0.49 及以上版本

你应该去终端上的项目目录和运行那个命令

1 - mkdir android/app/src/main/assets
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

如果低于 0.49

  1 - mkdir android/app/src/main/assets
  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

然后使用android studio打开你react native app目录下的'android'文件夹,会要求升级gradle等东西。转到 build-> Generate signed APK 并按照那里的说明进行操作。还行吧。

希望对新手有所帮助

官方文档here

如果你没有密钥库而不是在命令之前使用,否则跳过

正在生成签名密钥/密钥库文件 您可以使用 keytool 生成私有签名密钥。在 Windows 上,keytool 必须是来自 C:\Program Files\Java\jdkx.x.x_x\bin.

的 运行
$ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

你会得到一个类似 my-release-key.keystore

的文件

设置gradle变量 将 my-release-key.keystore 文件放在项目文件夹的 android/app 目录下。 编辑文件 android/gradle.properties 并添加以下内容(将 ***** 替换为正确的密钥库密码、别名和密钥密码), enableAapt2 set false 是解决方法,因为 android gradle 版本 3.0 problem

MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
MYAPP_RELEASE_KEY_ALIAS=my-key-alias
MYAPP_RELEASE_STORE_PASSWORD=*****
MYAPP_RELEASE_KEY_PASSWORD=*****

android.enableAapt2=false

然后添加这些 app/buid.gradle (app)

低于默认配置

signingConfigs {
        release {
            if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
                storeFile file(MYAPP_RELEASE_STORE_FILE)
                storePassword MYAPP_RELEASE_STORE_PASSWORD
                keyAlias MYAPP_RELEASE_KEY_ALIAS
                keyPassword MYAPP_RELEASE_KEY_PASSWORD
            }
        }

和 Inside Build 类型发布 { }

 signingConfig signingConfigs.release

然后在android工作室终端中简单地运行这个命令 以下命令将自动完成所有答案

if windows

cd android
gradlew assembleRelease

if linux / mac

$ cd android
$ ./gradlew assembleRelease

如果出现任何错误,请删除所有构建文件夹和 运行 命令

gradlew clean

再次

gradlew assembleRelease

使用 android studio 为 react 的 android 项目生成签名的 apk 也是一个不错的选择,在 android studio 中打开 react 的 android 项目并生成击键并签署了 apk。

如果您遇到涉及 index.android.js 的错误。这是因为你使用的是新的 React-native 版本(我使用的是 0.55.4) 只需将 "index.android.js" 替换为 "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/

AndroidStudio

中的 GUI 方式
  • 在 Android Studio 中打开 React Native 应用程序的 Android 应用程序部分(这只是意味着用 [=32= 打开你的 react-native 项目的 android 文件夹]工作室)
  • 转到顶部的 "Build" 选项卡
  • 继续"Build Bundle(s) / APK(s)"
  • 然后select"Build APK(s)"
  • 这将引导您完成查找密钥以签署 APK 或创建密钥(如果您还没有密钥)的过程,这一切都非常简单。如果您只是练习,您可以生成这些密钥并将它们保存到您的桌面。
  • 一旦该过程完成并且构建成功,Android Studio 中将在下方弹出一个窗口。单击其中显示 "locate"(APK)
  • 的 link
  • 这会将您带到 apk 文件,将其移至您的 android 设备。然后导航到 Android 设备上的那个文件并安装它。

生成签名APK参考react-native官方文档

React-Native Generating Signed APK

对于捆绑项目的最新 React Native 版本

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/

iOS

react-native bundle --entry-file index.js --platform ios --dev false --bundle-output ios/main.jsbundle --assets-dest ios

在下面尝试,它会在您的 root/android/app/build/outputs/apk/debug 文件夹中生成一个 app-debug.apk

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

然后转到 android 文件夹和 运行

./gradlew assembleDebug

如果有人想在没有 Playstore 密钥的情况下进行构建,那么此命令将非常有用。

# react-native run-android --variant=release

构建完成后,您可以在发布构建文件中找到 apk。

在没有开发服务器的情况下生成调试 APK

如果你真的想生成一个可以 运行 没有开发服务器的调试 APK(用于测试目的),这里是 link 我对另一个类似 post 的回答这可能对你有帮助。

您只需:

  1. 编辑android/app/build.gradle
project.ext.react = [
    ...
    bundleInDebug: true, // add this line
]
  1. 运行这个命令在你项目的根目录下
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
  1. 然后,运行 ./gradlew assembleDebug(Mac或Linux)或gradlew assembleDebug(Windows)在/android文件夹中
    如果构建失败,我建议您从 Android studio
  2. 构建应用程序

  • 一些对 WINDOW 用户有用的脚本

将这些代码复制并粘贴到 package.json 文件中 "script":{}

 * VS Code
   --Enable NPM SCRIPT

   --Now you can directly run scripts from here


    "android": "react-native run-android",
    "clean-run-android": "cd android && ./gradlew clean && cd.. && react-native run-android  ",
    "start": "node node_modules/react-native/local-cli/cli.js start --reset-cache",
    "reset": "rm -rf node_modules/ && npm cache clear && watchman watch-del-all && npm i",
    "debug-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 && cd app/src/main/res/ && rmdir /S /Q raw && rmdir /S /Q drawable-mdpi",
    "release-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/build/intermediates/res/merged/release/ && cd android && ./gradlew assembleRelease && cd..",
    "install-apk": "cd android && ./gradlew installRelease",
    "release-aab": "cd android && ./gradlew bundleRelease"

第一个

cd android

然后 运行

./gradlew installRelease

您终于可以在这里找到 apk。

Project\android\app\build\outputs\apk\release\app-release.apk

对我来说 ./gradlew assembleRelease 不再有效,但下面的方法有效。

./gradlew :app:assembleRelease

感谢this comment

只有这个对我有用 - yarn android --variant=release

For me this worked (MACOS)

打开终端

cd project_directory

运行 这个命令

yarn start

打开另一个终端

运行 这些命令

cd android
./gradlew assembleRelease