為了充分利用Android Plugin for Gradle 3.0+的優點,將Android專案拆分成多個module的做法越來越常見。然而,隨著module數量的增多,我們很快就會遇到依賴管理的混亂問題。
管理Gradle依賴的三種不同方法:
- 手動管理
- 使用Google推薦的“ext”
- Kotlin + buildSrc
1) 手動管理
這是一種大多數人在採用的管理依賴的方法,但每次升級依賴庫時都需要做大量的手動更改。
module_a/build.gradle
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.gradle
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時很難管理依賴庫的版本更新。
Google推薦:使用gradle的extra屬性
Google在Android官方文件中推薦這種管理依賴的方法。許多專案例如ButterKnife、Picasso等都在使用這種方法。
此方法非常適用於更新support library的版本,因為每個support library都具有相同的版本號,你只需要在一個地方更改它就行了。 Retrofit等其它第三方庫也是如此。
Root-level build.gradle
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.gradle
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不能自動補全。
Kotlin + buildSrc == Android Studio Autocomplete ? ?
您需要在您的專案裡建立一個buildSrc模組,然後編寫kotlin程式碼來管理依賴庫,使得IDE支援自動補全。
Gradle文件中有這樣一段話:
當你執行Gradle時,它會檢查專案中是否存在一個名為
buildSrc
的目錄。然後Gradle會自動編譯並測試這段程式碼,並將其放入構建指令碼的類路徑中。您不需要提供任何進一步的操作提示。
你只需要在buildSrc module中新建兩個檔案:
- build.gradle.kts
- 編寫Kotlin程式碼的檔案 (本文中是指
Dependencies.kt
)
buildSrc/build.gradle.kts:
plugins {
`kotlin-dsl`
}
複製程式碼
buildSrc/src/main/java/Dependencies.kt
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這個模組。步驟如下:
- 在專案根目錄下新建一個名為buildSrc的資料夾(與專案裡的app資料夾同級)。
- 在buildSrc資料夾裡建立名為build.gradle.kts的檔案,檔案內容參考之前的描述。
- 在buildSrc資料夾裡建立src/main/java資料夾,如下圖所示。並在該資料夾下建立Dependencies.kt檔案,檔案內容參考之前的描述。
4. build一遍你的專案,然後重啟你的Android Studio,專案裡就會多出一個名為buildSrc的module。