前言
在項目開發(fā)中捉超,不可避免用到support library。不僅自己撰寫的代碼中會引用這個庫,使用的一些第三方庫底層也會使用這個庫纤掸。往往你用的support library的版本和第三方的版本沖突阐肤。默認情況下凫佛,support庫會使用高版本讲坎。例如,你的工程中support library的版本是25.3.1愧薛,但某個第三方庫可能在你不知情的情況下晨炕,默默的使用了support 26.0.0。正常來說是沒有問題的毫炉。但是某些情況下瓮栗,support library版本兼容會有問題。這里記錄一個support library的兼容問題瞄勾。
代碼分析
今天再項目中升級的Google自己的Android Architecture Components版本號费奸,莫名其妙A(yù)pp一些地方直接崩潰了,提示support庫的一些類找不到进陡。
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/animation/AnimatorCompatHelper
AnimatorCompatHelper 這個類在support 26.0.0中好像不存在了愿阐。打印了Architecture Components升級前后的依賴樹:
在這個第三方庫的內(nèi)部,默默升級了support library的版本趾疚。
代碼實現(xiàn)
在項目中缨历,特別是比較大的項目,很難預(yù)料糙麦,其他module的模塊依賴辛孵。這個時候,我們希望的gradle 依賴選取策略不是直接取高版本喳资,而是希望整個項目可以在build的入口處統(tǒng)一指定一些公用底層庫的版本觉吭,避免一些由于版本引起的不可描述的bug。這里參考StackOverFlow上的解決方案:
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
if (!requested.name.startsWith("multidex")) {
details.useVersion '25.3.0'
}
}
}
}
添加如下代碼仆邓,可以對指定依賴模塊鲜滩,指定版本。這個非常有用节值,glide徙硅,okhttp等第三方庫也可以參考這個方法,統(tǒng)一管理版本搞疗。