在 Android 项目中实现主 Module(App)和子 Module(Library)的渠道包对应,关键在于确保当主模块为特定渠道构建时,依赖的子模块也能自动使用与该渠道匹配的配置、依赖或代码逻辑。以下是实现主-子模块渠道对应关系的核心方法:
-
基础:定义渠道(Flavors)
在主模块 (app/build.gradle) 中定义渠道维度(flavorDimensions)和具体渠道(productFlavors):
groovyandroid { flavorDimensions "channel" productFlavors { huawei { dimension "channel" // 华为渠道特有配置 } xiaomi { dimension "channel" // 小米渠道特有配置 } } }
-
子模块的渠道感知配置
子模块需声明相同的维度(Dimension)和渠道名称(Flavor),确保其变体能与主模块匹配:
groovy// 子模块 build.gradle (如 library/build.gradle) android { flavorDimensions "channel" productFlavors { // 必须与主模块渠道名严格一致 huawei { dimension "channel" } xiaomi { dimension "channel" } } }
-
依赖传递与渠道匹配
在主模块中声明依赖时,Gradle 的 Variant-Aware 特性会自动匹配相同渠道的子模块构建变体:
groovy// app/build.gradle dependencies { // 自动依赖子模块对应渠道的变体(如 huaweiDebug -> library:huaweiDebug) implementation project(':library') }
-
渠道专属依赖
在子模块中为不同渠道声明不同依赖:
groovy// library/build.gradle dependencies { huaweiImplementation 'com.huawei.hms:push:6.0.0' // 华为渠道专用 xiaomiImplementation 'com.xiaomi.mipush:sdk:3.0.0' // 小米渠道专用 }
-
处理不对称依赖
若子模块渠道名与主模块无法完全一致(如子模块需更细粒度控制),配置映射关系(matchingFallbacks)
groovy// app/build.gradle android { flavorDimensions "channel" productFlavors { huawei { dimension "channel" matchingFallbacks = ['huaweiBasic'] // 主模块选huawei时,子模块用huaweiBasic } } }