如何生成一个可以在没有带反应原生的服务器的情况下运行的apk?

Gok*_*ari 173 javascript android mobile-application react-native

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

但是,我想构建一个apk,我可以发送给没有访问开发服务器的人,我希望他们能够测试应用程序.

我看到在文档的iOS部分有一个使用脱机捆绑的部分.但我无法弄清楚如何为Android做同样的事情.这可能吗?如果是这样,怎么样?

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

Adi*_*ngh 177

您将必须创建一个密钥来签署apk.使用以下方法创建密钥:

 keytool -genkey -v -keystore my-app-key.keystore -alias my-app-alias -keyalg RSA -keysize 2048 -validity 10000
Run Code Online (Sandbox Code Playgroud)

出现提示时使用密码

生成密钥后,使用它生成可安装的构建:

 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/
Run Code Online (Sandbox Code Playgroud)

使用gradle生成构建

 cd android && ./gradlew assembleRelease
Run Code Online (Sandbox Code Playgroud)

将APK上传到手机上.该-r标志将替换现有应用程序(如果存在)

adb install -r ./app/build/outputs/apk/app-release-unsigned.apk
Run Code Online (Sandbox Code Playgroud)

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

更新:根据@shashuec和@Fallen的评论

如果你得到错误

ENOENT:没有这样的文件或目录,打开'android/app/src/main/assets/index.android.bundle'

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

  • 我很惊讶Facebook的文档很差,他们完全省略了`react-native bundle`部分.感谢您的回答! (53认同)
  • 如果你得到错误`ENOENT:没有这样的文件或目录,打开'android/app/src/main/assets/index.android.bundle'`运行`mkdir android/app/src/main/assets` (17认同)
  • 我收到此错误`失败[INSTALL_PARSE_FAILED_NO_CERTIFICATES]`.当我尝试安装apk时. (11认同)
  • 非常感谢,这对我有用.我得到的唯一问题是这条消息:"缺少必需的参数:bundle-output"en react-native-bundle部分,但通过删除2"\"符号解决 (4认同)
  • 我正在使用windows,也可以使用这个`gradlew.bat assembleRelease`. (2认同)
  • @developernaren你能找到解决方案吗? (2认同)
  • @SofianeBelhadjKacem我做了,是的.值得庆幸的.我实际上使用了一个签名的APK文件并安装了它,这是我从Android Studio生成的.以下是我的步骤:**1)生成React Native bundle:**`react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output android/<your-package -name> /src/main/assets/index.android.bundle --assets-dest android/<your-package-name>/src/main/res /`**2)从Android Studio生成签名的APK文件.****3)将签名的APK文件安装到USB设备:**`adb -d install -r <path_to_signed_apk>`**4)利润!** (2认同)
  • 虽然在新的 RN 版本中有一个入口点 (index.js),但您需要使用此标志 `--entry-file index.js` 而不是 `index.android.js` (2认同)

Ped*_*ram 166

按照Aditya Singh的回答,生成的(未签名的)apk不会安装在我的手机上.我必须使用这里的说明生成一个签名的apk .

以下对我有用:

$ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
Run Code Online (Sandbox Code Playgroud)

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=****
Run Code Online (Sandbox Code Playgroud)

如果您使用的是MacOS,则可以使用此处的说明将密码存储在钥匙串中,而不是将其存储在纯文本中.

然后编辑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
        }
    }
}
...
Run Code Online (Sandbox Code Playgroud)

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

对于 Windows'cd android'然后运行gradlew assembleRelease命令,并在下面找到你签名的 apkandroid/app/build/outputs/apk/app-release.apk

  • 这是最新,最准确的答案.谢谢. (6认同)
  • 谢谢,它不是,但我发现这是因为我正在使用expo进行测试,而创建本机应用程序npm有不同的结构,所以为了将来参考,如果有人遇到这个问题,只需弹出你的项目,然后你得到那些文件夹,有趣的教程告诉你如何使用npm创建应用程序,然后讨论使用它时不存在的结构 (5认同)
  • app-release.apk没有安装.会是什么问题? (2认同)
  • 我创建了 apk,上传到 google play,但它不起作用......一些提示? (2认同)
  • 我找不到android/app文件夹,它位于何处? (2认同)

小智 26

运行此命令:

react-native run-android --variant=release
Run Code Online (Sandbox Code Playgroud)

请注意,--variant=release仅当您设置了签名时才可用cd android && ./gradlew assembleRelease.


Mik*_*xle 26

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

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
Run Code Online (Sandbox Code Playgroud)

然后使用android studio打开你在本机应用程序目录中的'android'文件夹,它会要求升级gradle和其他一些东西.转到build->生成签名的APK并按照那里的说明进行操作.这真的很直接.


Yas*_*rlu 18

对于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
Run Code Online (Sandbox Code Playgroud)

如果低于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
Run Code Online (Sandbox Code Playgroud)

然后使用android studio打开你在本机应用程序目录中的'android'文件夹,它会要求升级gradle和其他一些东西.转到build->生成签名的APK并按照那里的说明进行操作.那个好.


Jos*_*ter 11

如果你得到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/ 
Run Code Online (Sandbox Code Playgroud)

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

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

adb -d install -r <path_to_signed_apk> 
Run Code Online (Sandbox Code Playgroud)

-d标志只是告诉adb安装在附加的USB设备上,如果您还运行了模拟器.如果要在任何模拟器上安装,请删除该-d标志.

4)利润!


Abh*_*arg 7

希望对新手有帮助

官方文档在这里

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

生成签名密钥/密钥库文件 您可以使用 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
Run Code Online (Sandbox Code Playgroud)

你会得到一个像my-release-key.keystore这样的文件

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

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
Run Code Online (Sandbox Code Playgroud)

然后添加这些 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
            }
        }
Run Code Online (Sandbox Code Playgroud)

和内部构建类型发布{}

 signingConfig signingConfigs.release
Run Code Online (Sandbox Code Playgroud)

然后只需在 android studio 终端中运行此命令 下面的命令将自动执行以上所有答案

如果窗户

cd android
gradlew assembleRelease
Run Code Online (Sandbox Code Playgroud)

如果 linux/mac

$ cd android
$ ./gradlew assembleRelease
Run Code Online (Sandbox Code Playgroud)

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

gradlew clean
Run Code Online (Sandbox Code Playgroud)

再比

gradlew assembleRelease
Run Code Online (Sandbox Code Playgroud)

  • 天哪,“gradle clean”...我已经为此苦苦挣扎了一段时间,遇到了这些构建错误,非常感谢您的回答! (2认同)

小智 7

尝试以下操作,它将在您的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

  • 这里生成的APK需要Metro才能运行...所以我认为仍然使用开发服务器 (3认同)

小智 6

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

cd android && ./gradlew assembleRelease
Run Code Online (Sandbox Code Playgroud)


hex*_*had 6

第一的

cd android
Run Code Online (Sandbox Code Playgroud)

然后运行

./gradlew installRelease
Run Code Online (Sandbox Code Playgroud)

最后您将能够在这里找到该应用程序。

Project\android\app\build\outputs\apk\release\app-release.apk
Run Code Online (Sandbox Code Playgroud)


Qui*_*ner 6

对我来说这有效(MACOS)

打开终端

cd project_directory
Run Code Online (Sandbox Code Playgroud)

运行这个命令

yarn start
Run Code Online (Sandbox Code Playgroud)

打开另一个终端

运行这些命令

cd android
./gradlew assembleRelease
Run Code Online (Sandbox Code Playgroud)


Ram*_*ker 5

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

$ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
Run Code Online (Sandbox Code Playgroud)

将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}}
Run Code Online (Sandbox Code Playgroud)

并运行

gradlew assembleRelease
Run Code Online (Sandbox Code Playgroud)

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


Usm*_*zmi 5

如果遇到涉及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/
Run Code Online (Sandbox Code Playgroud)


小智 5

Android Studio 中的 GUI 方式

  • 在 Android Studio 中打开 React Native 应用程序的 Android 应用程序部分(这只是意味着使用 Android Studio 打开 React Native 项目的 android 文件夹)
  • 转到顶部的“构建”选项卡
  • 转到“构建捆绑包/APK”
  • 然后选择“构建 APK”
  • 这将引导您完成定位您的密钥以签署 APK 或创建您的密钥(如果您还没有它们)的过程,这一切都非常简单。如果您只是练习,您可以生成这些密钥并将它们保存到您的桌面。
  • 一旦该过程完成并且构建成功,Android Studio 下方将出现一个弹出窗口。单击其中的“定位”链接(APK)
  • 这将带您到 apk 文件,将其移至您的 android 设备。然后导航到 Android 设备上的该文件并安装它。


Pha*_*Sai 5

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

安卓

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


小智 5

如果任何人都想在没有Playstore Key的情况下进行构建,那么此命令将非常有帮助。

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

构建完成后,您可以在发行版本的构建文件中找到apk。

  • 您要查找的 APK 将位于 `/android/app/build/outputs/apk/release` 内 (3认同)

Roh*_*mar 5

在此输入图像描述

在此输入图像描述

  • 一些对 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"
Run Code Online (Sandbox Code Playgroud)