如何在Android设备上安装同一Flutter应用的多个构建版本?
解决Flutter多版本应用安装冲突问题
Android系统是通过包名(applicationId)来区分不同应用的,你只修改android:label没改包名,同一包名的构建版本会被识别为同一个应用,导致安装冲突。要实现多版本共存,核心是给每个环境的flavor配置独立的包名,同时搭配不同的应用名称。
一、Android端核心配置
- 打开
android/app/build.gradle,在android代码块中添加flavor配置,为每个环境指定独立的applicationId和应用名称:
android { // 保留原有其他配置(compileSdkVersion、defaultConfig等) flavorDimensions "environment" productFlavors { production { dimension "environment" applicationId "com.yourcompany.yourapp" // 正式版包名(与Play商店一致) resValue "string", "app_name", "应用名称" } dev { dimension "environment" applicationId "com.yourcompany.yourapp.dev" // Dev版独立包名 resValue "string", "app_name", "应用名称 - Dev" } stg { dimension "environment" applicationId "com.yourcompany.yourapp.stg" // STG版独立包名 resValue "string", "app_name", "应用名称 - STG" } } }
这里用resValue动态生成app_name字符串,无需手动修改strings.xml,每个flavor会自动对应不同的应用名称。
- 确认
AndroidManifest.xml里的android:label引用的是这个动态字符串,不要硬编码:
<application android:label="@string/app_name" // 其他属性保持不变 >
二、Flutter代码区分环境(可选)
如果需要在Flutter代码中根据环境切换API地址等配置,有两种简单方式:
- 方式一:通过
dart-define参数传递
运行Dev版时:
flutter run --flavor dev --dart-define=BASE_URL=https://dev-api.yourapp.com
在Flutter中获取该值:
const baseUrl = String.fromEnvironment('BASE_URL');
- 方式二:在
build.gradle中添加编译常量
在每个productFlavor里加入:
buildConfigField "String", "BASE_URL", "\"https://dev-api.yourapp.com\""
然后通过Flutter的平台通道读取Android端的BuildConfig值。
三、构建与安装不同版本
现在可以分别构建不同环境的APK,它们能同时安装在设备上:
- 构建正式版:
flutter build apk --flavor production
- 构建Dev版:
flutter build apk --flavor dev
- 构建STG版:
flutter build apk --flavor stg
四、iOS端补充(如需跨平台支持)
如果iOS也需要多版本共存,在Xcode中做以下配置:
- 打开
ios/Runner.xcworkspace,进入Manage Schemes,为dev、stg分别创建独立的Scheme。 - 每个Scheme对应的
Build Settings里,设置不同的Bundle Identifier(比如com.yourcompany.yourapp.dev)。 - 修改
Info.plist的CFBundleDisplayName为动态值,或通过Scheme配置指定不同的应用名称。
这样配置后,每个环境的应用都会被系统识别为独立APP,不会再出现安装冲突问题。
内容的提问来源于stack exchange,提问作者Avdept
相关产品推荐
相关产品推荐

