ChatGPT解决这个技术问题 Extra ChatGPT

如何使用 react-native 生成可以在没有服务器的情况下运行的 apk?

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

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

我看到文档的 iOS 部分有一个使用离线包的部分。但我不知道如何为 android 完成相同的操作。这可能吗?如果是这样,怎么做?

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


c
cglacet

按照 Aditya Singh 的回答,生成的(未签名的)apk 不会安装在我的手机上。我必须使用说明 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 的部分):

...
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

对于 Windows 'cd android' 然后运行 gradlew assembleRelease command ,在 android/app/build/outputs/apk/app-release.apkandroid/app/build/outputs/apk/release/app-release.apk 下找到您的 signed apk


这是最新和最准确的答案。谢谢。
app-release.apk 未安装。会是什么问题?
我创建了apk,上传到谷歌播放,但它不工作......一些提示?
我找不到 android/app 文件夹,它在哪里?
谢谢,不是,但我发现是因为我使用expo进行测试,而create native app npm具有不同的结构,所以为了将来参考,如果有人遇到这个问题,只需弹出你的项目然后你就会得到那些文件夹,有趣的是教程如何告诉你使用 npm 来创建应用程序,然后谈论一个当你使用它时不存在的结构
A
Aditya Singh

您必须创建一个密钥来签署 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 上传到您的手机。 -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:没有这样的文件或目录,打开 'android/app/src/main/assets/index.android.bundle'

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


非常感谢,它对我有用。我得到的唯一问题是这条消息:“缺少必需的参数:bundle-output”在 react-native-bundle 部分,但通过删除 2 个“\”符号来解决
我对 Facebook 的糟糕文档感到惊讶,他们完全省略了 react-native bundle 部分。感谢您的回答!
我正在使用 Windows,也可以使用此 gradlew.bat assembleRelease
我收到此错误 Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES] 。当我尝试安装 apk 时。
如果您收到错误 ENOENT: no such file or directory, open 'android/app/src/main/assets/index.android.bundle',请运行 mkdir android/app/src/main/assets
H
Hardik Desai

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

对于较新版本的 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 并按照那里的说明进行操作。这真的很简单。


我还使用 Android Studio 和 Xcode 为我的 React Native 应用程序构建发布版本......但是 android 生成可以使用@Aditya Singh 描述的脚本来完成
这不再需要proandroiddev.com/…
d
de-russification

运行此命令:

react-native run-android --variant=release

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


@jasan 我在这里发现了像你这样的另一个问题:github.com/facebook/react-native/issues/11586 这可能会解决这个问题:cd android && ./gradlew installRelease
我尝试了 cd android && ./gradlew installRelease 并收到此错误 Task 'assembleRelease.' not found in root project 'project'. Some candidates are: 'assembleRelease'.
是的,您必须生成密钥库文件。并编辑 gradle 文件。按照这些说明解决此问题。 facebook.github.io/react-native/docs/signed-apk-android.html
A
Akash Golui

如果有人想在没有 playstore 密钥的情况下构建,那么这个命令将非常有帮助。

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

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


您要查找的 APK 将位于 /android/app/build/outputs/apk/release
Y
Yasin Ugurlu

对于 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 并按照那里的说明进行操作。那好吧。


如果您安装了 Android Studio(它将负责使用或创建 Keystore),这是一种简单的方法。谢谢。
嘿..有一个快速的问题..上述步骤是必需的吗?反应本机文档没有在任何地方提及它..
@pravin 它不是必需的,它是生成 apk 的方法之一。
b
bro

试试下面,它会在你的 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 才能运行...所以我认为它仍在使用开发服务器
J
Joshua Pinter

如果您收到失败 [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)利润!


P
Philipp Meissner

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

cd android && ./gradlew assembleRelease

如果您没有进行必要的配置(如 Pedram 所说),这将生成一个未签名的 apk。
它将在生成的文件夹中创建调试、发布和未签名的 apk。我的目的是分享发布 apk。
A
Abhishek Garg

希望对新手有所帮助

官方文档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
            }
        }

和内部构建类型发布 { }

 signingConfig signingConfigs.release

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

如果窗户

cd android
gradlew assembleRelease

如果 linux / mac

$ cd android
$ ./gradlew assembleRelease

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

gradlew clean

比再次

gradlew assembleRelease

omg gradle clean ...我一直在努力解决这些构建错误,非常感谢您的回答!
如何在 Play 商店控制台上上传 Keystore 文件?
@AhsanAbrar 第一件事是可选的!!然后您不上传,播放控制台将为您生成 sha 密钥并自动签署您的应用程序。通常人们使用 android studio 开发 keystore 文件,然后在最后对其进行签名并将签名的 apk 上传到 playstore。但在这种情况下,您必须安全地存储密钥库应用程序以进行将来的上传。
U
Usman Kazmi

如果您收到涉及 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/

R
Raman Bhasker

我有另一个解决方案:- 生成签名密钥 您可以使用 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 处为您提供两个文件,现在将 app-release.apk 安装到您的 android 设备中。


android\app 文件夹在哪里?我在我的项目下没有看到它(我只看到 node_modules,并且在它里面,没有 android/app)
@DHLopez 您必须使用纯 React Native 项目才能访问 android 文件夹。如果您使用的是 Expo,那么您必须使用 Expoject 分离 Expo 项目。
h
hexhad

第一的

cd android

然后运行

./gradlew installRelease

最后,您将能够在此处找到 apk。

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

在这里使用 installRelease 有意义吗?
D
David Hudman

Android Studio中的GUI方式

在 Android Studio 中打开 React Native 应用程序的 Android 应用程序部分(这只是意味着使用 Android Studio 打开 react-native 项目的 android 文件夹)

转到顶部的“构建”选项卡

转到“Build Bundle(s) / APK(s)”

然后选择“构建 APK(s)”

这将引导您完成查找密钥以签署 APK 或创建密钥(如果您还没有密钥)的过程,这一切都非常简单。如果您只是在练习,您可以生成这些密钥并将它们保存到您的桌面。

一旦该过程完成并且构建成功,Android Studio 下方将弹出一个弹出窗口。单击其中显示“定位”的链接(APK)

这会将您带到 apk 文件,将其移至您的 android 设备。然后导航到 Android 设备上的该文件并安装它。


P
Phani Sai

对于最新的反应原生版本来捆绑项目

安卓

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


R
Rohit Kumar

https://i.stack.imgur.com/aDYVn.png

https://i.stack.imgur.com/DnyRB.jpg

一些对 WINDOW 用户有用的脚本

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

 * 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"

M
Michael Rovinsky

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

如果您真的想生成一个可以在没有开发服务器的情况下运行的调试 APK(用于测试目的),这里是我对另一篇类似帖子的回答的链接,可能会对您有所帮助。
https://stackoverflow.com/a/65762142/7755579

你所要做的就是:

编辑 android/app/build.gradle

project.ext.react = [
    ...
    bundleInDebug: true, // add this line
]

在项目的根目录下运行此命令

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(Mac 或 Linux)或 gradlew assembleDebug(Windows) 如果构建失败,我建议您从 Android Studio 构建应用程序


J
Jobeso

对我来说 ./gradlew assembleRelease 不再起作用,但以下起作用。

./gradlew :app:assembleRelease

感谢this comment


B
Blatzo

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


A
Ahmad Sadiq

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


Q
Quick learner

对我来说这有效(MACOS)

打开终端

cd project_directory

运行这个命令

yarn start

打开另一个终端

运行这些命令

cd android
./gradlew assembleRelease

C
Codemaker

参考 react-native 官方文档 Generate Signed APK

React-Native Generating Signed APK


这不是一个好的答案,即使它确实解决了它没有解决的用户问题。他们想要构建一个独立的调试 APK,而不是发布版本。