先前写过一文【Flutter多环境部署配置】,基本满足大多情况使用,然而有没有遇到过这样的需求:
测试应用和正式应用分开不同包名、不同图标、不同API,以便能满足各种定制化要求。
那在各个平台又是怎样实现:
一、Android平台
在Android 中可以使用“风味”。以测试环境(dev)和正式环境(prod)为例,在build.gradle
文件中android节点部分添加如下内容:
android {
flavorDimensions "default"
productFlavors{
// 开发环境
dev {
dimension "default"
applicationId "com.example.dev"
}
// 正式环境
prod {
dimension "default"
applicationId "com.example.prod"
}
}
defaultConfig {
// 因为多渠道已经有包名了,此处注释掉
// applicationId "com.example.dev"
minSdkVersion 16
targetSdkVersion 28
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
...
}
然后就可以定制两个命令完成应用打包:
"build:md-dev": "flutter build apk -t lib/environments/dev_env.dart --release --flavor dev --target-platform android-arm64",
"build:md-prod": "flutter build apk -t lib/environments/prod_env.dart --release --flavor prod --target-platform android-arm64"
进阶配置
因为上述打包是基于系统自带的Debug版本签名打包的,不太适合正式版本上线,所以可以进一步配置:
1、在android目录下添加两个文件:keystore文件和properties.
其中keystore作为常见文件就不做说明了,properties内容如下(其中storeFile对应外面的keystore文件名,其它是别名和密码):
storeFile=../android.keystore
storePassword=test
keyAlias=woodstream
keyPassword=test
再在build.gradle
中添加内容:
def keystorePropertiesFile = rootProject.file("./release-signing.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
android {
...
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
// Signing with the debug keys for now, so `flutter run --release` works.
// signingConfig signingConfigs.debug
signingConfig signingConfigs.release
}
}
}
这样仍用上述的两个命令打包就可以完成正式版本发布。