如何将多Flavor打包进单个App Bundle并配置独立启动器?
解决方案:结合Flavor Dimensions与Dynamic Feature Modules
要满足你的所有需求,推荐采用Flavor Dimensions + Dynamic Feature Modules的组合方案,既可以实现单App内的双启动器、数据共享,又能保留单独构建单个Flavor的能力,同时避免双App ID带来的问题。
核心配置步骤
1. 配置Flavor维度与Product Flavors
在build.gradle(Module: app)中定义Flavor维度,用于区分两个功能变体:
flavorDimensions "feature" productFlavors { flavorA { dimension "feature" // 保持App ID与主模块一致,确保数据共享 applicationIdSuffix "" } flavorB { dimension "feature" applicationIdSuffix "" } }
2. 隔离第三方库依赖
为每个Flavor单独配置依赖,确保单独构建时不会引入对方的库:
dependencies { // 主模块共享依赖(如基础UI、数据存储库) implementation "androidx.core:core-ktx:1.12.0" implementation "androidx.room:room-runtime:2.6.1" kapt "androidx.room:room-compiler:2.6.1" // Flavor A专属依赖 flavorAImplementation "com.example:library-a:1.0.0" // Flavor B专属依赖 flavorBImplementation "com.example:library-b:1.0.0" }
3. 配置独立启动器
在主模块的AndroidManifest.xml中声明两个启动Activity,分别对应Flavor A和B:
<activity android:name=".FeatureAActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <activity android:name=".FeatureBActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
如果需要在单独构建某个Flavor时隐藏另一个启动器,可以在对应Flavor的Manifest目录下(如src/flavorA/AndroidManifest.xml)添加配置,禁用另一个Activity:
<activity android:name=".FeatureBActivity" android:enabled="false" tools:node="merge" />
4. 用Dynamic Feature Modules实现单Bundle多Flavor交付
如果需要将两个Flavor打包进同一个App Bundle并在Google Play提供默认配置,将Flavor A和B的核心功能分别拆分为动态功能模块(feature-a和feature-b):
- 每个动态模块仅对应一个Flavor,在其
build.gradle中指定Flavor维度:flavorDimensions "feature" productFlavors { flavorA { dimension "feature" } } - 主模块依赖两个动态模块,并通过
onDemand属性设置为按需下载(或默认自动下载):dynamicFeatures = [":feature-a", ":feature-b"] - 在Google Play控制台配置App Bundle的交付规则:可以设置默认自动下载两个动态模块,用户即可看到两个启动器;也允许用户手动选择仅下载其中一个。
关键优势
- 数据共享:所有变体使用相同的App ID,SharedPreferences、Room数据库、App专属存储目录自动共享,无需额外处理。
- 单独构建能力:执行
assembleFlavorADebug/assembleFlavorARelease即可单独构建仅包含Flavor A的安装包,不会包含Flavor B的依赖与代码。 - 单Bundle多启动器:通过动态模块打包进同一个App Bundle,用户安装后默认拥有两个独立启动器,无需单独安装两个App。
注意事项
- 动态模块的代码需与主模块解耦,避免依赖冲突。
- 若无需Google Play的按需下载能力,仅需单App内双启动器+单独构建,可省略动态模块步骤,直接通过Flavor的Manifest配置控制启动器显示即可。
内容的提问来源于stack exchange,提问作者jan
相关产品推荐
相关产品推荐

