如何使用React Native生成可以在无服务器情况下运行的APK?

317

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

但是,我想构建一个APK文件,可以将其发送给没有访问开发服务器权限的人,并希望他们能够测试该应用程序。

我看到文档的iOS部分有一个使用离线捆绑包的部分。但我不知道如何在Android上实现相同的功能。这是否可能?如果可以,怎么做?

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

22个回答

344

在Aditya Singh的答案之后,生成的(未签名的)apk不能在我的手机上安装。我必须使用这里的说明生成已签名的apk。here.

以下方法对我有效:

$ 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,你可以按照这里的说明将密码存储在钥匙串中,而不是以纯文本的形式存储。

然后编辑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

对于Windows系统,先执行'cd android'命令,然后再运行gradlew assembleRelease命令,最后在android/app/build/outputs/apk/app-release.apkandroid/app/build/outputs/apk/release/app-release.apk找到已签名的apk文件。


3
app-release.apk无法安装。可能存在什么问题? - Balasubramanian
2
我创建了APK并上传到Google Play,但它无法正常工作...有什么提示吗? - Italo Rodrigo
3
我找不到 android/app 文件夹,它在哪里? - DHLopez
10
谢谢,原来不是这个问题,后来我发现是因为我在使用 Expo 进行测试,而创建本机应用的 npm 结构与之不同。因此,以后如果有人遇到这个问题,只需弹出项目,然后你就可以获得那些文件夹了。有趣的是,教程告诉你使用 npm 创建应用程序,然后谈论一个不存在的结构,当你使用它时。 - DHLopez
1
在Windows上,由于权限限制创建密钥库文件,您可能需要以管理员身份打开命令行并在JDK文件夹内运行此命令。 - strange_developer
显示剩余10条评论

238

您需要创建一个密钥来签署 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


5
非常感谢,这对我很有帮助。唯一的问题是在react-native-bundle部分出现了这条消息:“缺少必需的参数:bundle-output”,但通过删除两个“\”符号已解决。 - guinunez
70
我对Facebook的文档感到惊讶,他们完全省略了react-native bundle部分。谢谢你的回答! - technophyle
3
我正在使用Windows,同样可以使用 gradlew.bat assembleRelease 进行工作。 - Tabares
14
当我尝试安装apk时,出现了“Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]”错误。 - developernaren
21
如果你遇到“ENOENT:未找到文件或目录,打开'android/app/src/main/assets/index.android.bundle'”的错误,请运行“mkdir android/app/src/main/assets”。 - shashuec
显示剩余17条评论

54

对于这个过程,您应该只使用Android Studio。 它更简单。 但是,在此之前,请在您的React Native应用程序目录中运行此命令:

对于较新版本的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应用程序目录中的“android”文件夹,它会要求您升级Gradle和其他一些内容。 转到“Build”-> “Generate signed APK”,并按照那里的说明进行操作。 这真的很简单。


我也使用Android Studio和Xcode为我的React Native应用程序构建发布版本...但是,如@Aditya Singh所述,可以使用脚本完成Android生成。 - WiRa
这已经不再需要了 https://proandroiddev.com/bundling-react-native-during-android-release-builds-ec52c24e200d - onmyway133

51
如果有人想在没有Playstore密钥的情况下进行构建,那么以下命令将非常有帮助。
# react-native run-android --variant=release 构建完成后,您可以在发布版本文件中找到apk。

8
你要找的 APK 文件会在 /android/app/build/outputs/apk/release 目录中。 - Taylor A. Leach
有人能否使用此方法生成的apk来还原react-native代码吗? - Kanhaiya

49

运行此命令:

react-native run-android --variant=release
请注意,只有在使用 cd android && ./gradlew assembleRelease 进行签名设置后,才能使用 --variant=release 选项。

@jasan 我在这里找到了另一个类似于你的问题:https://github.com/facebook/react-native/issues/11586这可能会解决问题:cd android && ./gradlew installRelease - Ahmed Ashraf
我尝试运行 cd android && ./gradlew installRelease 命令,但是出现了以下错误信息:Task 'assembleRelease.' not found in root project 'project'. Some candidates are: 'assembleRelease'. - ThomasReggi
是的,您需要生成Keystore文件并编辑gradle文件。请按照以下说明修复此问题。https://facebook.github.io/react-native/docs/signed-apk-android.html - Ahmed Ashraf

27

对于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应用程序目录中的“android”文件夹,它会要求升级Gradle和其他一些东西。进入Build->生成已签名的APK,按照那里的说明操作。没问题。


如果您已经安装了Android Studio(它会处理使用或创建Keystore),那么这是一个简单的方法。谢谢。 - leosok
嘿..我有一个快速的问题..上述步骤是必需的吗?React Native文档中没有提到它.. - pravin
1
@pravin 不是必需的,它只是生成apk的方法之一。 - Yasin Ugurlu

17

尝试以下命令,它将在您的 /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


3
在这里生成的 APK 需要使用 Metro 运行...所以我认为仍在使用开发服务器。 - nerdlinger

14

如果你遇到了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> 
< p >-d 标志只是告诉 adb 在连接了 USB 设备的情况下安装,如果您同时运行模拟器。如果要安装在模拟器上,则删除 -d 标志。

4)收益!


12

前往项目目录并执行以下命令:

cd android && ./gradlew assembleRelease

1
{btsdaf} - Gokhan Sari
1
它将在生成的文件夹中创建调试、发布和未签名的apk。我的意图是分享发布版apk。 - Sidharth Taneja

10
希望这能帮助新手入门。
官方文档在这里
如果你没有密钥库,那么请使用以下命令,否则跳过。 生成签名密钥/密钥库文件 您可以使用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

你将得到一个文件,例如my-release-key.keystore

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

接下来在这些app/buid.gradle (app)中添加以下内容:

在 default config 下方添加

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

并且在Build类型为release { }内部

 signingConfig signingConfigs.release

然后在Android Studio终端中运行以下命令 下面的命令将自动化以上所有答案

如果是Windows系统:

cd android
gradlew assembleRelease

如果是 Linux / Mac

$ cd android
$ ./gradlew assembleRelease

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

gradlew clean

再次比较
gradlew assembleRelease

2
哇,gradle clean...我已经为此苦苦挣扎了一段时间,一直遇到构建错误,非常感谢您提供的答案!! - nerdlinger
如何在Play商店控制台上上传Keystore文件? - Ahsan Abrar
@AhsanAbrar 首先,这是可选的!如果您不上传,Play控制台将为您生成SHA密钥并自动签署您的应用程序。通常人们使用Android Studio开发密钥库文件,然后在其端签署它并上传已签名的APK到Play商店。但在这种情况下,您必须安全地存储密钥库应用以进行未来的上传。 - Abhishek Garg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接