長期以來困擾咱們的一個問題就是構建速度,AndroidStudio 的構建速度嚴重影響 Android 開發者的工做效率,尤爲是更新一個版本號,致使整個項目從新構建,在網絡慢的狀況下,這是沒法忍受的。html
buildSrc 這種方式,在最近幾年是很是流行的,由於它有如下優勢:java
有優勢的同時也有缺點,來看一下 Gradle 文檔android
A change in buildSrc causes the whole project to become out-of-date. Thus, when making small incremental changes, the --no-rebuild command-line option is often helpful to get faster feedback. Remember to run a full build regularly or at least when you’re done, though.git
buildSrc的更改會致使整個項目過期,所以,在進行小的增量更改時,-- --no-rebuild命令行選項一般有助於得到更快的反饋。不過,請記住要按期或至少在完成後運行完整版本。github
彙總一句話就是說,buildSrc 依賴更新將從新構建整個項目,那麼有沒有一種方法支持自動補全和單擊跳轉,有不用從新構建整個項目,Composing builds 就能夠實現,接下來咱們來演示一下 buildSrc 和 Composing builds 它們的 build 的時間,相關代碼我已經上傳到 GitHub 了:ComposingBuilds-vs-buildSrc算法
經過這篇文章你將學習到如下內容,將在文末總結部分會給出相應的答案編程
這篇文章涉及不少重要的知識點,請耐心讀下去,我相信應該會給你們帶來不少不同的東西。數組
接下來咱們來演示一下 buildSrc 和 Composing builds 它們的優點劣勢對比,在分析以前,先來了解一下基本概念性能優化
摘自 Gradle 文檔:當運行 Gradle 時會檢查項目中是否存在一個名爲 buildSrc 的目錄。而後 Gradle 會自動編譯並測試這段代碼,並將其放入構建腳本的類路徑中, 對於多項目構建,只能有一個 buildSrc 目錄,該目錄必須位於根項目目錄中, buildSrc 是 Gradle 項目根目錄下的一個目錄,它能夠包含咱們的構建邏輯,與腳本插件相比,buildSrc 應該是首選,由於它更易於維護、重構和測試代碼bash
摘自 Gradle 文檔:複合構建只是包含其餘構建的構建. 在許多方面,複合構建相似於 Gradle 多項目構建,不一樣之處在於,它包括完整的 builds ,而不是包含單個 projects
爲了正確對比這兩種方式,新建了兩個空的項目分別是 Project-buildSrc 和 Project-ComposingBuild,這兩個項目引用的依賴都是同樣的,Project-buildSrc 包含 buildSrc,Project-ComposingBuild 包含 Composing builds。
Project-buildSrc 和 Project-ComposingBuild 它們的結構都差很少,接下來咱們來看一下,編譯速度 和 使用上有什麼不一樣。
Project-buildSrc 和 Project-ComposingBuild 這兩個項目,它們的 androidx.appcompat:appcompat 的版本是 1.0.2,如今咱們從 1.0.2 升級到 1.1.0 來看一下它們 Build 的時間。
當修改了版本號,Project-buildSrc 項目 Build 的時間幾乎是 Project-ComposingBuild 項目的 4.6 倍( PS: 每一個人的環境不一樣,時間上會有差別,可是 Project-buildSrc 的時間老是大於 Project-ComposingBuild )
在更大的項目中,網絡慢的狀況下,這種差別會更加明顯,幾分鐘的構建都是常事,在 buildSrc 中作微小的更改,可能須要花很長時間構建,等待團隊其餘成員在他們提取更改以後,都將致使項目從新構建,這個代價是很是昂貴的。
Project-buildSrc
plugins {
`kotlin-dsl`
}
repositories{
jcenter()
}
複製代碼
buildSrc/src/main/java/包名/
目錄下新建 Deps.kt 文件,添加如下內容object Versions {
......
val appcompat = "1.1.0"
......
}
object Deps {
......
val appcompat = "androidx.appcompat:appcompat:${Versions.appcompat}"
......
}
複製代碼
Project-ComposingBuild
buildscript {
repositories {
jcenter()
}
dependencies {
// 由於使用的 Kotlin 須要須要添加 Kotlin 插件
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.72"
}
}
apply plugin: 'kotlin'
apply plugin: 'java-gradle-plugin'
repositories {
// 須要添加 jcenter 不然會提示找不到 gradlePlugin
jcenter()
}
gradlePlugin {
plugins {
version {
// 在 app 模塊須要經過 id 引用這個插件
id = 'com.hi.dhl.plugin'
// 實現這個插件的類的路徑
implementationClass = 'com.hi.dhl.plugin.Deps'
}
}
}
複製代碼
versionPlugin/src/main/java/包名/
目錄下新建 Deps.kt 文件,添加如下內容class Deps : Plugin<Project> {
override fun apply(project: Project) {
}
companion object {
val appcompat = "androidx.appcompat:appcompat:1.1.0"
}
}
複製代碼
includeBuild 'versionPlugin'
重啓你的 Android Studioplugins{
// 這個 id 就是在 versionPlugin 文件夾下 build.gradle 文件內定義的 id
id "com.hi.dhl.plugin"
}
複製代碼
ps:plugins{} 須要放在 app 模塊 build.gradle 文件內首行位置
Project-ComposingBuild 比 Project-buildSrc 多了兩步操做須要在 settings.gradle 和 build.gradle 引入插件,二者在使用都是差很少的
如何快速使用 buildSrc
如何快速使用 Composing builds
總共從如下幾個方面對比了 Composing builds 和 buildSrc
Project-buildSrc 和 Project-ComposingBuild 相關代碼已經上傳到 GitHub 了:ComposingBuilds-vs-buildSrc
到目前爲止大概管理 Gradle 依賴提供了 4 種不一樣方法:
buildSrc 如何遷移到 Composing builds?
若是當前項目使用的是 buildSrc 方式,遷移到 Composing builds 很簡單,須要將 buildSrc 內容拷貝的 Composing builds 中,而後刪掉 buildSrc 文件夾就能夠便可
致力於分享一系列 Android 系統源碼、逆向分析、算法、翻譯、Jetpack 源碼相關的文章,能夠關注我,若是你喜歡這篇文章歡迎 star,一塊兒來學習,期待與你一塊兒成長
因爲 LeetCode 的題庫龐大,每一個分類都能篩選出數百道題,因爲每一個人的精力有限,不可能刷完全部題目,所以我按照經典類型題目去分類、和題目的難易程度去排序
每道題目都會用 Java 和 kotlin 去實現,而且每道題目都有解題思路,若是你同我同樣喜歡算法、LeetCode,能夠關注我 GitHub 上的 LeetCode 題解:Leetcode-Solutions-with-Java-And-Kotlin,一塊兒來學習,期待與你一塊兒成長