爲了充分利用Android Plugin for Gradle 3.0+的優勢,將Android項目拆分紅多個module的作法愈來愈常見。然而,隨着module數量的增多,咱們很快就會遇到依賴管理的混亂問題。html
這是一種大多數人在採用的管理依賴的方法,但每次升級依賴庫時都須要作大量的手動更改。java
module_a/build.gradlereact
implementation "com.android.support:support-annotations:27.0.2" implementation "com.android.support:appcompat-v7:27.0.2" implementation "com.squareup.retrofit2:retrofit:2.3.0" implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0" implementation "io.reactivex.rxjava2:rxjava:2.1.9" 複製代碼
module_b/build.gradleandroid
implementation "com.android.support:support-annotations:27.0.2" implementation "com.android.support:appcompat-v7:27.0.2" implementation "com.squareup.retrofit2:retrofit:2.3.0" implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0" implementation "io.reactivex.rxjava2:rxjava:2.1.9" 複製代碼
這裏存在許多重複的配置,並且當你的項目有不少module時很難管理依賴庫的版本更新。bash
Google在Android官方文檔中推薦這種管理依賴的方法。許多項目例如ButterKnife、Picasso等都在使用這種方法。markdown
此方法很是適用於更新support library的版本,由於每一個support library都具備相同的版本號,你只須要在一個地方更改它就好了。 Retrofit等其它第三方庫也是如此。app
Root-level build.gradleide
ext { versions = [ support_lib: "27.0.2", retrofit: "2.3.0", rxjava: "2.1.9" ] libs = [ support_annotations: "com.android.support:support-annotations:${versions.support_lib}", support_appcompat_v7: "com.android.support:appcompat-v7:${versions.support_lib}", retrofit :"com.squareup.retrofit2:retrofit:${versions.retrofit}", retrofit_rxjava_adapter: "com.squareup.retrofit2:adapter-rxjava2:${versions.retrofit}", rxjava: "io.reactivex.rxjava2:rxjava:${versions.rxjava}" ] } 複製代碼
module_a/build.gradleoop
implementation libs.support_annotations
implementation libs.support_appcompat_v7
implementation libs.retrofit
implementation libs.retrofit_rxjava_adapter
implementation libs.rxjava
複製代碼
module_b/build.gradle測試
implementation libs.support_annotations
implementation libs.support_appcompat_v7
implementation libs.retrofit
implementation libs.retrofit_rxjava_adapter
implementation libs.rxjava
複製代碼
這種方法是手動管理的一大進步,可是缺乏IDE的支持,更準確的說是在更新依賴庫的時候IDE不能自動補全。
您須要在您的項目裏建立一個buildSrc模塊,而後編寫kotlin代碼來管理依賴庫,使得IDE支持自動補全。
當你運行Gradle時,它會檢查項目中是否存在一個名爲
buildSrc
的目錄。而後Gradle會自動編譯並測試這段代碼,並將其放入構建腳本的類路徑中。您不須要提供任何進一步的操做提示。
Dependencies.kt
)plugins {
`kotlin-dsl`
}
複製代碼
object Versions { val support_lib = "27.0.2" val retrofit = "2.3.0" val rxjava = "2.1.9" } object Libs { val support_annotations = "com.android.support:support-annotations:${Versions.support_lib}" val support_appcompat_v7 = "com.android.support:appcompat-v7:${Versions.support_lib}" val retrofit = "com.squareup.retrofit2:retrofit:${Versions.retrofit}" val retrofit_rxjava_adapter = "com.squareup.retrofit2:adapter-rxjava2:${Versions.retrofit}" val rxjava = "io.reactivex.rxjava2:rxjava:${Versions.rxjava}" } 複製代碼
通過上面兩個步驟後,執行一次Gradle Sync任務,如今咱們能夠在Android Studio中訪問Dependencies.kt中任何值了。
看起來結果與「ext」很是類似,可是它支持自動補全和單擊跳轉。
module_a/build.gradle
implementation Libs.support_annotations
implementation Libs.support_appcompat_v7
implementation Libs.retrofit
implementation Libs.retrofit_rxjava_adapter
implementation Libs.rxjava
複製代碼
module_a/build.gradle
implementation Libs.support_annotations
implementation Libs.support_appcompat_v7
implementation Libs.retrofit
implementation Libs.retrofit_rxjava_adapter
implementation Libs.rxjava
複製代碼
我強烈推薦您使用「Kotlin + buildSrc」的方法。它支持自動補全和單擊跳轉,使得您無需在文件之間手動來回切換,方便你更好的管理Gradle依賴。
新建的module名稱必須爲buildSrc
一開始我按照做者原文的描述,在Android Studio裏右鍵單擊項目,New 出一個名爲buildSrc的Android Library,試了好幾遍都提示「Gradle sync failed: Plugin with id 'com.android.library' not found」的錯誤。
後來我參考這裏的作法,手動建立了buildSrc這個模塊。步驟以下: