You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 01:10:15