React Native 是一个强大的跨平台移动应用开发框架,允许开发者使用 JavaScript 和 React 构建同时运行在 iOS 和 Android 上的应用程序。然而,将 React Native 应用从开发环境迁移到生产环境并发布到应用商店需要一系列复杂的构建和打包步骤。本文将详细介绍如何在 Android 和 iOS 平台上构建和打包 React Native 应用,包括 Android 的打包签名配置、iOS 的证书配置(含 Xcode)、使用 EAS(Expo Application Services)发布应用,以及多环境管理和灰度发布策略。通过本文的指导,您将能够掌握完整的部署流程,确保应用以最佳性能运行在用户设备上,并顺利通过应用商店审核。
本文将通过深入的步骤说明、代码示例和最佳实践建议,为初学者和有经验的开发者提供全面的参考。以下是本文的结构:
- 引言:构建与打包的重要性
- Android 打包签名配置
- iOS 打包证书配置(含 Xcode)
- 使用 EAS / Expo 发布
- 多环境管理与灰度发布
- 综合示例:完整的构建与发布流程
- 结论与进一步学习建议
1. 引言:构建与打包的重要性
构建和打包是移动应用开发中的核心环节,它将开发阶段的代码和资源转化为可在用户设备上运行的二进制文件。对于 React Native 应用来说,构建过程涉及将 JavaScript 代码、原生模块和资源文件打包为 Android 的 APK 或 AAB 文件,以及 iOS 的 IPA 文件。同时,为了确保应用的安全性和应用商店的合规性,必须对这些文件进行签名。
1.1 为什么需要构建和打包?
- 性能优化:生产模式的构建会压缩代码、移除调试信息,从而提升应用的运行效率。
- 安全性:通过签名机制,确保应用在分发过程中不被篡改。
- 商店合规性:Google Play 和 App Store 要求提交经过签名的二进制文件。
1.2 本文目标
本文旨在帮助您:
- 掌握 Android 的签名配置并生成 APK/AAB 文件。
- 配置 iOS 的开发和分发证书,生成 IPA 文件。
- 使用 EAS 简化构建和发布流程。
- 实现多环境管理和灰度发布策略。
无论您是使用纯 React Native 项目还是 Expo 管理的项目,本文都将提供适用的解决方案。
2. Android 打包签名配置
在 Android 平台上,应用需要使用密钥库(Keystore)进行签名,以验证开发者的身份并确保应用在安装和更新时的完整性。本节将详细介绍如何生成密钥库、配置签名并生成 APK 和 AAB 文件。
2.1 生成密钥库
密钥库是 Android 签名的核心,包含公钥和私钥对。可以使用 Java 自带的 keytool 工具生成密钥库文件。
2.1.1 生成命令
在终端中运行以下命令:
keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
2.1.2 参数说明
-
-keystore:指定密钥库文件名,例如my-release-key.keystore。 -
-alias:密钥的别名,例如my-key-alias。 -
-keyalg:加密算法,推荐使用RSA。 -
-keysize:密钥长度,推荐2048位。 -
-validity:密钥有效期(单位:天),建议设置为10000天(约 27 年)。
运行命令后,系统会提示输入:
- 密钥库密码(Store Password)。
- 密钥密码(Key Password)。
- 个人信息(如姓名、组织等)。
完成后,密钥库文件将保存在当前目录下。
2.1.3 安全建议
- 将密钥库文件和密码妥善保存,避免泄露。
- 将密钥库文件添加到
.gitignore,防止上传到版本控制系统。
2.2 配置 Gradle
React Native 的 Android 项目使用 Gradle 构建系统,需要在 android/app/build.gradle 文件中配置签名信息。
2.2.1 编辑 build.gradle
在 android/app/build.gradle 中添加以下签名配置:
android {
...
defaultConfig {
applicationId "***.yourapp"
minSdkVersion 21
targetSdkVersion 31
versionCode 1
versionName "1.0"
}
signingConfigs {
release {
storeFile file('my-release-key.keystore')
storePassword 'your-store-password'
keyAlias 'my-key-alias'
keyPassword 'your-key-password'
}
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
}
2.2.2 配置说明
-
storeFile:密钥库文件的路径,建议将文件放在android/app/目录下。 -
storePassword:密钥库密码。 -
keyAlias:密钥别名。 -
keyPassword:密钥密码。 -
minifyEnabled:启用代码压缩,优化应用体积。 -
proguardFiles:指定 ProGuard 规则,用于代码混淆和优化。
2.2.3 安全存储密码
为了避免将密码硬编码在 build.gradle 中,可以使用属性文件存储敏感信息:
- 在
~/.gradle/gradle.properties中添加:MYAPP_RELEASE_STORE_PASSWORD=your-store-password MYAPP_RELEASE_KEY_PASSWORD=your-key-password - 修改
build.gradle:signingConfigs { release { storeFile file('my-release-key.keystore') storePassword System.getenv("MYAPP_RELEASE_STORE_PASSWORD") ?: MYAPP_RELEASE_STORE_PASSWORD keyAlias 'my-key-alias' keyPassword System.getenv("MYAPP_RELEASE_KEY_PASSWORD") ?: MYAPP_RELEASE_KEY_PASSWORD } }
2.3 生成 APK/AAB
2.3.1 生成 APK
APK(Android Package)是传统的 Android 应用包格式。运行以下命令生成签名的 APK:
cd android
./gradlew assembleRelease
- 生成的文件位于
android/app/build/outputs/apk/release/app-release.apk。 - 使用
adb install app-release.apk安装到设备上进行测试。
2.3.2 生成 AAB
AAB(Android App Bundle)是 Google Play 推荐的格式,支持动态交付和优化。运行以下命令:
c