React Native添加Product Flavors的正确方式及Release包启动崩溃排查
一、React Native中添加Product Flavors的正确步骤
结合你的配置,以下是标准的配置流程,你当前的基础配置已经符合规范,补充一些关键细节:
定义Flavor维度
首先在android块中声明flavorDimensions(Android要求所有Product Flavors必须属于至少一个维度):android { flavorDimensions "default" // ... 其他配置 }配置Product Flavors
在productFlavors块中定义各个环境的差异化配置,核心配置项包括:applicationIdSuffix:给不同环境的应用添加包名后缀,避免同设备安装冲突versionNameSuffix:给版本名添加后缀,方便区分环境- 关联
react-native-config的.env文件(如果你使用该库)
你的配置示例是合理的,这里补充一个更简洁的写法(避免重复minSdk/targetSdk):
productFlavors { dev { applicationIdSuffix ".dev" versionNameSuffix "-dev" } staging { applicationIdSuffix ".staging" versionNameSuffix "-staging" } production { // 生产环境无后缀 } }关联react-native-config的环境文件
确保在app/build.gradle顶部正确关联.env文件,你的配置已经正确:project.ext.envConfigFiles = [ dev: ".env.local", production: ".env.production", staging: ".env.staging" ] apply from: project(':react-native-config').projectDir.getPath() + "/dotenv.gradle"注意:要保证项目根目录下存在对应的.env文件,且文件格式正确(无语法错误,比如键值对不要有多余空格)。
配置BuildConfig包路径
对于react-native-config,需要在defaultConfig中指定build_config_package为你的主包名(即未加后缀的包名),你的配置正确:defaultConfig { resValue "string", "build_config_package", "com.company" // ... 其他配置 }
二、Release包启动崩溃的排查与修复
针对你遇到的启动即崩溃且Logcat难以捕获的问题,先解决日志捕获的问题,再逐一排查可能的原因:
1. 正确获取崩溃日志
即使应用瞬间崩溃,Android系统仍会记录崩溃日志,你可以通过以下方式获取:
- 命令行方式:连接设备后执行
该命令会导出设备上最近的日志,包括崩溃信息,你可以打开adb logcat -d > crash.logcrash.log搜索FATAL EXCEPTION找到崩溃原因。 - Android Studio过滤日志:打开Logcat后,选择你的应用包名(即使崩溃,包名也会短暂出现),或者直接搜索
AndroidRuntime,即可找到崩溃堆栈。
2. 可能的崩溃原因及修复方案
结合你的配置,最可能的原因如下:
(1)ProGuard混淆导致react-native-config类被移除
你的Release开启了minifyEnabled,如果没有配置ProGuard规则保留react-native-config相关类,会导致混淆后无法找到环境变量相关代码,引发崩溃。
在android/app/proguard-rules.pro中添加以下规则:
# 保留react-native-config的核心类 -keep class com.lugg.ReactNativeConfig.** { *; } # 保留各个环境的BuildConfig类 -keep class com.company.**BuildConfig { *; } # 如果你的主包名有变化,替换为实际的包名
(2)AndroidManifest中硬编码包名导致Provider冲突
如果你的AndroidManifest.xml中硬编码了包名(比如在Provider的authorities字段),当使用applicationIdSuffix时,实际包名与硬编码的不一致,会导致组件冲突。
修改AndroidManifest中的相关配置,用${applicationId}代替硬编码的包名,例如:
<provider android:name="com.lugg.ReactNativeConfig.ReactNativeConfigProvider" android:authorities="${applicationId}.reactnativeconfigprovider" android:exported="false" />
(3).env文件缺失或格式错误
确保对应环境的.env文件存在于项目根目录,且文件格式正确,比如:
API_URL=https://staging-api.example.com APP_NAME=MyApp-Staging
避免键值对之间有多余空格,或使用未闭合的引号。
(4)Fastlane配置的Flavor名称问题
你的Fastlane配置中flavor: "Staging"是正确的(Gradle会自动处理大小写),但可以验证生成的任务是否正确,执行以下命令确认:
./gradlew tasks | grep assemble
如果能看到assembleStagingRelease任务,说明Flavor配置正确。
内容的提问来源于stack exchange,提问作者Felipe Melo

