跳至主内容
版本:0.80

发布到 Google Play 商店

非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

Android 要求所有应用在安装前必须经过数字证书签名。若要通过 Google Play 商店分发 Android 应用,必须使用发布密钥签名,且后续所有更新都需使用相同密钥。自 2017 年起,借助 Google Play 应用签名功能,Google Play 可自动管理签名发布。但在将应用二进制文件上传至 Google Play 前,仍需使用上传密钥进行签名。Android 开发者文档中的应用签名页面详细说明了该主题。本指南简要介绍该流程,并列出了打包 JavaScript 包所需的步骤。

信息

若你使用 Expo,请阅读 Expo 的应用商店部署指南,了解如何构建并提交应用到 Google Play 商店。本指南适用于任何 React Native 应用,可自动化部署流程。

生成上传密钥

你可以使用 keytool 生成私钥签名密钥。

Windows 系统

在 Windows 上,必须以管理员身份从 C:\Program Files\Java\jdkx.x.x_x\bin 目录运行 keytool

shell
keytool -genkeypair -v -storetype PKCS12 -keystore my-upload-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

该命令会提示你输入密钥库密码、密钥密码以及密钥的可分辨名称字段。随后会生成名为 my-upload-key.keystore 的密钥库文件。

该密钥库包含单个有效期为 10000 天的密钥。别名是后续签名应用时使用的名称,请务必记录该别名。

macOS 系统

在 macOS 上,若不确定 JDK 的 bin 目录位置,可执行以下命令查找:

shell
/usr/libexec/java_home

该命令将输出 JDK 目录路径,格式类似:

shell
/Library/Java/JavaVirtualMachines/jdkX.X.X_XXX.jdk/Contents/Home

使用 cd /your/jdk/path 命令切换到该目录,并按以下示例通过 sudo 权限执行 keytool 命令。

shell
sudo keytool -genkey -v -keystore my-upload-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
注意

请妥善保管密钥库文件。若丢失上传密钥或密钥泄露,应遵循此指南操作

配置 Gradle 变量

  1. my-upload-key.keystore 文件放入项目文件夹的 android/app 目录下

  2. 编辑 ~/.gradle/gradle.propertiesandroid/gradle.properties 文件,添加以下内容(将 ***** 替换为正确的密钥库密码、别名和密钥密码)

MYAPP_UPLOAD_STORE_FILE=my-upload-key.keystore
MYAPP_UPLOAD_KEY_ALIAS=my-key-alias
MYAPP_UPLOAD_STORE_PASSWORD=*****
MYAPP_UPLOAD_KEY_PASSWORD=*****

这些将成为全局 Gradle 变量,后续我们可在 Gradle 配置中用于应用签名。

关于 Git 使用的说明

将上述 Gradle 变量保存在 ~/.gradle/gradle.properties 而非 android/gradle.properties 中,可避免它们被提交到 Git。首次添加变量前,可能需要在用户主目录创建 ~/.gradle/gradle.properties 文件。

关于安全性的说明

若不愿以明文存储密码且使用 macOS,可在钥匙串访问应用中存储凭据。此时可跳过 ~/.gradle/gradle.properties 中的最后两行配置。

添加签名配置到 Gradle

最后需要配置的是设置使用上传密钥签名发布版本。编辑项目文件夹中的 android/app/build.gradle 文件,添加签名配置:

groovy
...
android {
...
defaultConfig { ... }
signingConfigs {
release {
if (project.hasProperty('MYAPP_UPLOAD_STORE_FILE')) {
storeFile file(MYAPP_UPLOAD_STORE_FILE)
storePassword MYAPP_UPLOAD_STORE_PASSWORD
keyAlias MYAPP_UPLOAD_KEY_ALIAS
keyPassword MYAPP_UPLOAD_KEY_PASSWORD
}
}
}
buildTypes {
release {
...
signingConfig signingConfigs.release
}
}
}
...

生成发布版 AAB

在终端中运行以下命令:

shell
npx react-native build-android --mode=release

此命令底层使用 Gradle 的 bundleRelease 任务,将所有运行应用所需的 JavaScript 代码打包进 AAB(Android App Bundle)。如需修改 JavaScript 包和/或可绘制资源的打包方式(例如更改了默认文件/文件夹名称或项目结构),请查看 android/app/build.gradle 文件并根据实际情况更新配置。

备注

请确保 gradle.properties 中不包含 org.gradle.configureondemand=true,否则发布构建将跳过 JS 和资源打包到应用二进制文件的步骤。

生成的 AAB 文件位于 android/app/build/outputs/bundle/release/app-release.aab,可直接上传至 Google Play。

要使 Google Play 接受 AAB 格式,您需要在 Google Play 控制台中为应用配置"通过 Google Play 进行应用签名"。如果您要更新尚未使用此功能的现有应用,请查阅我们的迁移章节了解配置变更方法。

测试应用的发布版本

将发布版本上传到 Play 商店前,请务必进行全面测试。首先卸载设备上已安装的任何旧版本应用,然后在项目根目录执行以下命令进行安装:

shell
npm run android -- --mode="release"

注意:仅当您已完成前述签名配置时,--mode release 参数才可用。

您可以终止所有正在运行的打包进程,因为所有框架和 JavaScript 代码都已包含在 APK 资源中。

发布到其他商店

默认生成的 APK 包含 x86x86_64ARMv7aARM64-v8a CPU 架构的原生代码,这使得 APK 能在绝大多数 Android 设备上运行。但缺点是任何设备都会包含未使用的原生代码,导致 APK 体积不必要地增大。

您可以通过在 android/app/build.gradle 文件中添加以下配置,为每个 CPU 架构单独生成 APK:

diff
android {

splits {
abi {
reset()
enable true
universalApk false
include "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
}
}

}

将这些文件上传至支持设备定向的应用商店(如 Amazon AppStoreF-Droid),用户将自动获取适配其设备的 APK。若需上传至其他商店(如 APKFiles),由于这些平台不支持单应用多 APK,请将 universalApk false 改为 true 以生成包含所有 CPU 架构的通用 APK。

请注意:您还需按 Android 官方文档建议配置不同的版本代码。

启用 Proguard 减小 APK 体积(可选)

Proguard 工具可通过剥离应用未使用的 React Native Java 字节码(及其依赖)来略微减小 APK 体积。

重要

启用 Proguard 后请务必全面测试应用。Proguard 通常需要针对每个使用的原生库进行单独配置,详见 app/proguard-rules.pro

android/app/build.gradle 中启用 Proguard:

groovy
/**
* Run Proguard to shrink the Java bytecode in release builds.
*/
def enableProguardInReleaseBuilds = true

迁移旧版 Android React Native 应用至 Google Play 应用签名

如果你是从旧版 React Native 迁移而来,你的应用很可能尚未使用 Google Play 的应用签名功能。我们建议你启用该功能,以便利用自动应用拆分等优势。要从旧版签名方式迁移,你需要先生成新的上传密钥,然后在 android/app/build.gradle 中将发布签名配置替换为使用上传密钥,而非发布密钥(请参阅在 Gradle 中添加签名配置一节)。完成这些步骤后,你应按照 Google Play 帮助网站上的说明,将你的原始发布密钥发送给 Google Play。

默认权限

默认情况下,INTERNET 权限会被添加到你的 Android 应用中,因为几乎所有应用都会用到它。SYSTEM_ALERT_WINDOW 权限在调试模式下会被添加到你的 Android APK 中,但在生产环境中会被移除。