一、背景:
當我們在源碼依賴的時候經常會導致一些問題。
我們的主工程有如下配置,它依賴了一個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'
