同一个 Flutter 项目,有时想打出两个 App:比如一个正式版、一个试用版,而且要能同时装在一台手机上。安卓的 productFlavors 就是干这个的。
在 build.gradle.kts 里声明 flavor
android {
flavorDimensions += "app"
productFlavors {
create("main") {
dimension = "app"
manifestPlaceholders["appName"] = "我的应用"
}
create("trial") {
dimension = "app"
applicationId = "com.example.trial" // 包名不同,才能和正式版同时安装
manifestPlaceholders["appName"] = "我的应用(试用)"
}
}
}
然后在 AndroidManifest.xml 里把应用名改成占位符:android:label="${appName}",两个包在桌面上就会显示不同的名字。
不同的入口文件
如果两个版本启动时要做的事不一样,可以各写一个入口,比如 lib/main.dart 和 lib/main_trial.dart,打包时用 -t 指定:
flutter build apk --release --flavor main
flutter build apk --release --flavor trial -t lib/main_trial.dart
打出来的文件名会带上 flavor:build/app/outputs/flutter-apk/app-trial-release.apk。
加了 flavor 之后要注意的
- 只要声明了 flavor,每次构建安卓包都必须写
--flavor,否则 Flutter 会说找不到产物。原来写死了app-release.apk的打包脚本要跟着改。 - 图标、权限这类资源可以放在
android/app/src/trial/下面,只对试用版生效,不影响正式版。 - 入口文件和 flavor 别配错:用试用版的入口去打正式版的包,是最容易犯、又最难察觉的错。