Library Publication 是 Gradle 在0.9.0 時增加的一個新特性,它的作用是讓Lib也能發布不同的版本
在這之前,Lib只能發布release版本,你的項目中依賴的所有Lib也都只能是relaese版本的。這種做法看起來很合理,被依賴的庫當然應該是release的,debug狀態下怎么給其他項目提供依賴呀?但在實際多模塊項目中,被依賴的庫只是項目中普普通通的一部分,庫和項目同時被開發被調試,debug狀態的Lib也是非常正常的,於是很早就有人給Google提了一個issue:
https://code.google.com/p/android/issues/detail?id=52962 ,Google工程師便在gradle的0.9.0版本中增加了Library Publication特性來處理這個問題,不過好像直到1.0才完全處理好
(轉載請注明:博客園-閣剛廣志,地址:http://www.cnblogs.com/bellkosmos/p/6437171.html )
對我來說,我寫的很多工具包都會打印Log,而工具包自然會放在通用的模塊里,所以我當然希望Log能根據模塊當前的buildtype來決定是否打印,於是我對這個common lib 使用了Library Publication這個特性
Library Publication 不會改變之前的構建過程,只是在gradle腳本中增加了一些配置,就實現了Lib的多版本發布
Google工程師的實現思路非常簡單:
- 還是只需要選擇application的variant就可以直接打包
- 改動在於,讓 [application依賴的library的variant] 被 [application的variant] 控制
你具體的使用方式是也非常簡潔:
- 在library中設置讓library發布自己的全部variant:android.publishNonDefault = true
- 然后在application中的reference中標明不同的 [application的variant] 依賴的不同的 [library具體的variant] :debugCompile project(path: ':Library', configuration: 'debug')
更細的說明文檔:
http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Library-Publication可以看這里
但我在實際項目中使用時,發現直接就同步不過去,報錯信息是“more than one library with package name:XXX”
正常情況下,Gradle會處理好重復依賴的問題,但是這里居然會報這個錯誤,那一定是我們在Library Publication時出了問題
原來還是因為我的項目中依賴關系有些亂,造成了一個復雜的構建情況,導致了構建問題,這個問題的原理說起來非常簡單:
- 假設有這樣一個多模塊項目:
-
- 應用A依賴庫B和庫C,同時庫B和庫C又都依賴庫D
- 在庫D上使用了新特性發布全版本,然后在庫C上使用新特性控制:當C是debug的時候D也是debug、C是release的時候D也是release
- 同時在C上也發布全版本,A通過新特性控制C的版本就像C控制D一樣
- 而A對B不做控制,B對D也不做控制
- 這時,但是如果你進行debug構建,就會出現問題
- 因為當應用A是debug的時候,庫C是被新特性控制成debug的了,同樣D也是debug,另一邊庫B只默認構建release版本,就自然使用了release,而庫B依賴的庫D因為是普通依賴,自然也是默認的release
- 這樣整個項目中就會存在一個debug的庫D和一個release的庫D,Gradle就報了構建錯誤:more than one library with package name:XXX
- (如果你對應用A進行release構建,不會有問題,可以自己推理一下原因)
知道原因之后解決這個問題就可以直接對症下葯了:讓庫B也發布全版本,讓項目A控制庫B的版本,讓庫B控制庫D的版本