Android主模块和子模块渠道包映射

在 Android 项目中实现主 Module(App)和子 Module(Library)的渠道包对应,关键在于确保当主模块为特定渠道构建时,依赖的子模块也能自动使用与该渠道匹配的配置、依赖或代码逻辑。以下是实现主-子模块渠道对应关系的核心方法:

  1. 基础:定义渠道(Flavors)

    在主模块 (app/build.gradle) 中定义渠道维度(flavorDimensions)和具体渠道(productFlavors):

    groovy 复制代码
    android {
        flavorDimensions "channel"
        productFlavors {
            huawei {
                dimension "channel"
                // 华为渠道特有配置
            }
            xiaomi {
                dimension "channel"
                // 小米渠道特有配置
            }
        }
    }
  2. 子模块的渠道感知配置

    子模块需声明相同的维度(Dimension)和渠道名称(Flavor),确保其变体能与主模块匹配:

    groovy 复制代码
    // 子模块 build.gradle (如 library/build.gradle)
    android {
        flavorDimensions "channel"
        productFlavors {
            // 必须与主模块渠道名严格一致
            huawei { dimension "channel" }
            xiaomi { dimension "channel" }
        }
    }
  3. 依赖传递与渠道匹配

    在主模块中声明依赖时,Gradle 的 Variant-Aware 特性会自动匹配相同渠道的子模块构建变体:

    groovy 复制代码
    // app/build.gradle
    dependencies {
        // 自动依赖子模块对应渠道的变体(如 huaweiDebug -> library:huaweiDebug)
        implementation project(':library')
    }
  4. 渠道专属依赖

    在子模块中为不同渠道声明不同依赖:

    groovy 复制代码
    // library/build.gradle
    dependencies {
        huaweiImplementation 'com.huawei.hms:push:6.0.0' // 华为渠道专用
        xiaomiImplementation 'com.xiaomi.mipush:sdk:3.0.0' // 小米渠道专用
    }
  5. 处理不对称依赖

    若子模块渠道名与主模块无法完全一致(如子模块需更细粒度控制),配置映射关系(matchingFallbacks)

    groovy 复制代码
    // app/build.gradle
    android {
        flavorDimensions "channel"
        productFlavors {
            huawei {
                dimension "channel"
                matchingFallbacks = ['huaweiBasic'] // 主模块选huawei时,子模块用huaweiBasic
            }
        }
    }