升级Gradle后Product Flavors依赖解析失败问题求助
解决新版Android Gradle Plugin下的变体依赖解析问题
这个问题的核心是Android Gradle Plugin(AGP)3.0+引入了变体感知的依赖管理机制,替代了旧版中手动指定configuration和publishNonDefault true的方式。旧版的配置逻辑在新版AGP中不再适用,导致无法找到对应的library变体。
问题根源
在AGP 3.0之前,我们需要手动声明配置并指定依赖的library变体;但3.0+之后,AGP会自动根据flavor维度+名称匹配来关联app和library的变体。你的app模块flavor名称是app1521/app1524,而library模块是sdk1521/sdk1524,名称不匹配且未配置fallback规则,所以Gradle无法定位到对应的依赖变体。
解决方案
我们只需要调整flavor的匹配规则,同时移除旧版的冗余配置,具体步骤如下:
1. 清理旧版冗余配置
- 移除
publishNonDefault true:AGP 3.0+默认会发布所有library变体,这个参数已废弃。 - 删除
configurations块:新版AGP会自动生成变体对应的配置,无需手动声明。 - 删除依赖中的
configuration参数:不再需要手动指定依赖的变体。
2. 配置Flavor匹配规则
有两种可选方案,选其一即可:
方案A:统一App和Library的Flavor名称(推荐)
将app模块的flavor名称改成和library一致,让AGP自动匹配变体:
app/build.gradle 修改后:
apply plugin: 'com.android.application' android { buildToolsVersion "29.0.2" defaultConfig { applicationId "xyz.sahildave.flavoredlibrary" versionCode 1 versionName "1.0" minSdkVersion 21 targetSdkVersion 28 compileSdkVersion 28 } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } flavorDimensions("main") productFlavors { // 改为与library一致的flavor名称 sdk1521 { dimension "main" applicationId "xyz.sahildave.flavoredlibrary.app1521" } sdk1524 { dimension "main" applicationId "xyz.sahildave.flavoredlibrary.app1524" } } } dependencies { // AGP自动匹配对应变体,无需手动指定configuration sdk1521Implementation project(':mylibrary') sdk1524Implementation project(':mylibrary') sdk1521Implementation 'com.android.support:appcompat-v7:21.0.3' sdk1524Implementation 'com.android.support:appcompat-v7:24.2.0' }
mylibrary/build.gradle 修改后:
apply plugin: 'com.android.library' android { buildToolsVersion "29.0.2" // 移除已废弃的publishNonDefault true defaultConfig { versionCode 1 versionName "1.0" minSdkVersion 21 targetSdkVersion 28 compileSdkVersion 28 } flavorDimensions("main") productFlavors { sdk1521 { dimension "main" } sdk1524 { dimension "main" } } } dependencies { sdk1524Implementation 'com.android.support:appcompat-v7:24.2.1' sdk1521Implementation 'com.android.support:appcompat-v7:21.0.3' }
方案B:使用matchingFallbacks指定匹配规则(保留原App Flavor名称)
如果不想修改app的flavor名称,可以在app的每个flavor中配置matchingFallbacks,明确指定对应的library flavor:
app/build.gradle 修改后(仅展示核心修改部分):
flavorDimensions("main") productFlavors { app1521 { dimension "main" applicationId "xyz.sahildave.flavoredlibrary.app1521" // 指定匹配library的sdk1521变体 matchingFallbacks = ['sdk1521'] } app1524 { dimension "main" applicationId "xyz.sahildave.flavoredlibrary.app1524" // 指定匹配library的sdk1524变体 matchingFallbacks = ['sdk1524'] } } dependencies { // AGP通过matchingFallbacks自动匹配对应变体 implementation project(':mylibrary') app1521Implementation 'com.android.support:appcompat-v7:21.0.3' app1524Implementation 'com.android.support:appcompat-v7:24.2.0' }
library模块的修改与方案A一致(仅需移除publishNonDefault true)。
额外建议
- 考虑迁移到AndroidX:support库已停止维护,AndroidX是官方推荐的替代方案,可通过Android Studio的
Refactor > Migrate to AndroidX工具自动完成迁移。 - 统一compileSdkVersion和依赖版本:当前compileSdkVersion为28,但依赖的support库版本为21和24,建议使用与compileSdkVersion匹配的依赖版本(如28.0.0),避免潜在兼容性问题。
内容的提问来源于stack exchange,提问作者Panda World
相关产品推荐
相关产品推荐

