发布到 Google Play 商店
Android 要求所有应用在安装前必须使用证书进行数字签名。为了通过 Google Play 商店 分发您的 Android 应用程序,需要使用发布密钥进行签名,该密钥随后需要用于所有未来的更新。自 2017 年以来,由于 Google Play 应用签名 功能,Google Play 可以自动管理签名发布。但是,在您的应用程序二进制文件上传到 Google Play 之前,需要使用上传密钥进行签名。签名您的应用程序 页面在 Android 开发者文档中详细描述了该主题。本指南简要介绍了该过程,并列出了打包 JavaScript 包所需的步骤。
如果您正在使用 Expo,请阅读 Expo 指南 部署到应用商店 以构建和提交您的应用到 Google Play 商店。本指南适用于任何 React Native 应用,以自动化部署过程。
生成上传密钥
您可以使用 keytool
生成私有签名密钥。
Windows
在 Windows 上,keytool
必须以管理员身份从 C:\Program Files\Java\jdkx.x.x_x\bin
运行。
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 文件夹在哪里,请执行以下命令查找它
/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 变量
- 将
my-upload-key.keystore
文件放在项目文件夹的android/app
目录下。 - 编辑文件
~/.gradle/gradle.properties
或android/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 配置中使用它们来签署我们的应用程序。
将上述 Gradle 变量保存在 ~/.gradle/gradle.properties
而不是 android/gradle.properties
中,可以防止它们被检入到 git 中。您可能需要在用户的主目录中创建 ~/.gradle/gradle.properties
文件,然后才能添加变量。
如果您不希望以明文形式存储密码,并且您正在运行 macOS,您还可以 将您的凭据存储在 Keychain Access 应用程序中。然后您可以跳过 ~/.gradle/gradle.properties
中的最后两行。
将签名配置添加到应用的 Gradle 配置
需要完成的最后一个配置步骤是设置发布版本以使用上传密钥进行签名。编辑项目文件夹中的 android/app/build.gradle
文件,并添加签名配置,
...
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
在终端中运行以下命令
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 应用签名。如果您正在更新不使用 Google Play 应用签名的现有应用,请查看我们的 迁移部分,以了解如何执行该配置更改。
测试应用的发布版本
在将发布版本上传到 Play 商店之前,请确保彻底测试它。首先卸载您已安装的任何以前版本的应用。使用项目根目录中的以下命令将其安装在设备上
- npm
- Yarn
npm run android -- --mode="release"
yarn android --mode release
请注意,只有在您按照上述说明设置签名后,--mode release
才可用。
您可以终止任何正在运行的打包器实例,因为您的所有框架和 JavaScript 代码都打包在 APK 的资源中。
发布到其他商店
默认情况下,生成的 APK 包含 x86
、x86_64
、ARMv7a
和 ARM64-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 AppStore 或 F-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
/**
* 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 中,但在生产环境中会被删除。