多flavor导致的源码依赖问题-- Cannot choose between the following configurations of project :sample:
一、背景:
当我们在源码依赖的时候经常会导致一些问题。
我们的主工程有如下配置,它依赖了一个sample的本地工程
flavorDimensions "demo"
productFlavors {
flavor1 {
dimension 'demo'
}
flavor2 {
dimension 'demo'
}
}
dependencies {
compile project(':sample')
}
我们sample的本地工程配置如下
flavorDimensions "demo2"
productFlavors {
flavor3 {
dimension 'demo2'
}
flavo4 {
dimension 'demo2'
}
}
这时候你去assemble代码的时候,你会发现报出了如下的错误
> Could not resolve project :sample.
Required by:
project :app
> Cannot choose between the following configurations of project :sample:
这里的问题是,我们的主module无法判断,我们主module的flavor需要对应sample的那个flavor。那么我们需要怎么样解决这个问题呢?
二、解决思路
Gradle3.0以下
我们通过这样引用本地工程
dependencies {
api project(path:':sample',configuration:"default")
}
同时在sample配置
defaultPublishConfig "flavor3Release"
但这么写,你会发现一个非常奇葩的问题,你无法使用本地工程中的依赖,也就是依赖传递的问题(这里目前还没有implementation和api,只有compile)。
但终究是工程能够编译起来的。
Gradle3.0以上
在gradle3.0以上,google为我们提供了一种变体感知的依赖管理机制。这其实与上面的强制指定有异曲同工之处,但无疑这一种更加先进。
flavorDimensions "demo" flavorDimensions "demo2" productFlavors { productFlavors{ flavor1 { flavor3{ dimension 'demo' dimension 'demo2' } } flavor2 { flavor4{ dimension 'demo' dimension 'demo2' } } } } dependencies { compile project(':sample') }
app sample
我们可以看到我们的两个module,他们的flavorDimensions和productFlavors中的内容均不一样,那我们应该如何适配那?
使用missingDimensionStrategy和matchingFallbacks
如果你的app module是这样的,与sample一样,那么gradle会自动帮你匹配。也就是flavor相同的匹配。
flavorDimensions "demo2" productFlavors { flavor3 { dimension 'demo2' } flavo4 { dimension 'demo2' } }
如果你的appmodule是这样的,flavorDimension不一致,而flavor一致。那你就需要使用 missingDimensionStrategy 'demo2', 'flavor3', 'flavor4'
flavoorDimensions "demo"
productFlavors { flavor3 { dimension 'demo'
missingDimensionStrategy 'demo2', 'flavor3'
} flavo4 { dimension 'demo'
missingDimensionStrategy 'demo2', 'flavor4' 第一个参数是sample里面的flavordimensions,后面的可以依次填里面的flavor
}
}
如果你的appmodule是这样的,flavorDimension一致,而flavor不一致。那你就需要使用 matchingFallbacks
flavorDimensions "demo2" productFlavors { flavor1 { dimension 'demo2'
matchingFallbacks = ['flavor3'] } flavo2 { dimension 'demo2'
matchingFallbacks = ['flavor4']
} }
如果你遇到了我们上面的那种方式,那自然是两个都需要使用,这个就留给你们自己去尝试了。
有的朋友又问了,那我的app没有flavor唉怎么办,那这种又是什么情况呢??自然是flavorDimensions和flavor都不相同,那我们只要在defaultConfig中添加即可
missingDimensionStrategy 'demo2', 'flavor3', 'flavor4'