跳到主要内容

发布到 Google Play 商店

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

信息

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

生成上传密钥

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

Windows

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

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 应用 Bundle)中。如果您需要更改 JavaScript bundle 和/或 drawable 资源打包的方式(例如,如果您更改了默认文件/文件夹名称或项目的整体结构),请查看 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 应用签名。如果您正在更新一个未使用 Google Play 应用签名的现有应用,请查看我们的迁移部分,了解如何执行此配置更改。

测试应用的发布版本

在将发布版本上传到 Play 商店之前,请务必彻底测试。首先卸载您已安装的任何以前版本的应用程序。在项目根目录中使用以下命令将其安装到设备上

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

请注意,--mode release 仅在您按照上述说明设置签名后才可用。

您可以终止任何正在运行的打包器实例,因为您的所有框架和 JavaScript 代码都已打包在 APK 的资产中。

发布到其他商店

默认情况下,生成的 APK 包含 x86x86_64ARMv7aARM64-v8a CPU 架构的本地代码。这使得共享几乎可以在所有 Android 设备上运行的 APK 变得更容易。但是,这样做有一个缺点,即任何设备上都会有一些未使用的本地代码,导致 APK 不必要地变大。

您可以通过在 android/app/build.gradle 文件中添加以下行来为每个 CPU 创建一个 APK:

差异
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
/**
* 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 中,但在生产环境中将被移除。