跳到主要内容
版本:0.80

发布到 Google Play 商店

Android 要求所有应用在安装前都必须使用证书进行数字签名。为了通过 Google Play 商店 分发你的 Android 应用,它需要使用发布密钥进行签名,并且该密钥需要用于所有未来的更新。自 2017 年以来,得益于 Google Play 应用签名 功能,Google Play 可以自动管理签名发布。但是,在你的应用二进制文件上传到 Google Play 之前,需要使用上传密钥进行签名。Android Developers 文档上的 签名您的应用 页面详细描述了该主题。本指南简要介绍了该过程,并列出了打包 JavaScript bundle 所需的步骤。

信息

如果你使用的是 Expo,请阅读 Expo 指南以 部署到应用商店 来构建并提交你的应用到 Google Play 商店。该指南适用于任何 React Native 应用以自动化部署过程。

生成上传密钥

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

Windows

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

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

此命令会提示你输入密钥库和密钥的密码以及密钥的区分名称(Distinguished Name)字段。然后它会生成一个名为 my-upload-key.keystore 的密钥库文件。

密钥库包含单个密钥,有效期为 10000 天。别名是你稍后签名应用时将使用的名称,所以请记住记录该别名。

macOS

在 macOS 上,如果你不确定 JDK bin 文件夹在哪里,请执行以下命令查找:

/usr/libexec/java_home

它将输出 JDK 的目录,看起来像这样:

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

使用命令 cd /your/jdk/path 导航到该目录,并使用 sudo 权限如下所示使用 keytool 命令。

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 配置中

需要完成的最后配置步骤是设置使用上传密钥签名 release 构建。编辑项目文件夹中的 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
}
}
}
...

生成 release AAB

在终端中运行以下命令:

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

此命令在底层使用 Gradle 的 bundleRelease,将运行你的应用所需的所有 JavaScript 打包到 AAB (Android App Bundle) 中。如果你需要更改 JavaScript bundle 和/或可绘制资源打包的方式(例如,如果你更改了默认文件/文件夹名称或项目的一般结构),请查看 android/app/build.gradle 以了解如何更新它以反映这些更改。

备注

确保 gradle.properties 不包含 org.gradle.configureondemand=true,因为这会导致 release 构建跳过将 JS 和资源打包到应用二进制文件中。

生成的 AAB 可以在 android/app/build/outputs/bundle/release/app-release.aab 下找到,并准备好上传到 Google Play。

为了让 Google Play 接受 AAB 格式,需要在 Google Play Console 上为你的应用配置 Google Play 应用签名。如果你正在更新一个不使用 Google Play 应用签名的现有应用,请检查我们的 迁移部分 以了解如何执行该配置更改。

测试应用的 release 构建

在将 release 构建上传到 Play 商店之前,请确保彻底测试它。首先卸载你已安装的任何先前版本的应用。使用以下命令在项目根目录将其安装到设备上:

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

注意,只有按上述设置签名后,--mode release 才可用。

你可以终止任何正在运行的 bundler 实例,因为你所有的框架和 JavaScript 代码都打包在 APK 的资源中了。

发布到其他商店

默认情况下,生成的 APK 包含 x86x86_64ARMv7aARM64-v8a CPU 架构的本机代码。这使得共享几乎在所有 Android 设备上运行的 APK 更容易。然而,这也有缺点,即任何设备上都会有一些未使用的本机代码,导致 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 是一个可以略微减小 APK 大小的工具。它通过剥离你的应用未使用的 React Native Java 字节码(及其依赖项)的部分来实现这一点。

重要

如果你启用了 Proguard,请确保彻底测试你的应用。Proguard 通常需要你使用的每个本机库特定的配置。参见 app/proguard-rules.pro

要启用 Proguard,编辑 android/app/build.gradle

groovy
/**
* 在 release 构建中运行 Proguard 以缩小 Java 字节码。
*/
def enableProguardInReleaseBuilds = true

迁移旧的 Android React Native 应用以使用 Google Play 应用签名

如果你是从以前版本的 React Native 迁移,很可能你的应用不使用 Google Play 应用签名功能。我们建议你启用它以便利用自动应用拆分等功能。为了从旧的签名方式迁移,你需要首先 生成新的上传密钥,然后替换 android/app/build.gradle 中的 release 签名配置以使用上传密钥而不是 release 密钥(参见关于 添加签名配置到 gradle 的部分)。完成后,你应该遵循 Google Play 帮助网站上的说明 以便将你的原始 release 密钥发送给 Google Play。

默认权限

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