網(wǎng)站首頁 編程語言 正文
前言
長期以來困擾我們的一個問題就是構(gòu)建速度,AndroidStudio 的構(gòu)建速度嚴重影響 Android 開發(fā)者的工作效率,尤其是更新一個版本號,導致整個項目重新構(gòu)建,在網(wǎng)絡慢的情況下,這是無法忍受的。
buildSrc 這種方式,在最近幾年是非常流行的,因為它有以下優(yōu)點:
共享 buildSrc 庫工件的引用,全局只有一個地方可以修改它
支持 AndroidStudio 自動補全
支持 AndroidStudio 單擊跳轉(zhuǎn)
有優(yōu)點的同時也有缺點,來看一下 Gradle 文檔
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.
buildSrc的更改會導致整個項目過時,因此,在進行小的增量更改時,-- --no-rebuild命令行選項通常有助于獲得更快的反饋。不過,請記住要定期或至少在完成后運行完整版本。
匯總一句話就是說,buildSrc 依賴更新將重新構(gòu)建整個項目,那么有沒有一種方法支持自動補全和單擊跳轉(zhuǎn),有不用重新構(gòu)建整個項目,Composing builds 就可以實現(xiàn),接下來我們來演示一下 buildSrc 和 Composing builds 它們的 build 的時間,相關(guān)代碼我已經(jīng)上傳到 GitHub 了:ComposingBuilds-vs-buildSrc
通過這篇文章你將學習到以下內(nèi)容,將在文末總結(jié)部分會給出相應的答案
- 什么是 buildSrc?
- 什么是 Composing builds?
- 如何使用 Composing builds 和 buildSrc
- buildSrc 和 Composing builds 優(yōu)勢劣勢對比?
- Composing builds 編譯速度怎么樣?
- buildSrc 如何遷移到 Composing builds?
- 管理 Gradle 依賴都有那幾種方式?以及效率怎么樣?
這篇文章涉及很多重要的知識點,請耐心讀下去,我相信應該會給大家?guī)砗芏嗖灰粯拥臇|西。
Composing builds 和 buildSrc 對比
接下來我們來演示一下 buildSrc 和 Composing builds 它們的優(yōu)勢劣勢對比,在分析之前,先來了解一下基本概念
什么是 buildSrc
摘自 Gradle 文檔:當運行 Gradle 時會檢查項目中是否存在一個名為 buildSrc 的目錄。然后 Gradle 會自動編譯并測試這段代碼,并將其放入構(gòu)建腳本的類路徑中, 對于多項目構(gòu)建,只能有一個 buildSrc 目錄,該目錄必須位于根項目目錄中, buildSrc 是 Gradle 項目根目錄下的一個目錄,它可以包含我們的構(gòu)建邏輯,與腳本插件相比,buildSrc 應該是首選,因為它更易于維護、重構(gòu)和測試代碼
什么是 Composing builds
摘自 Gradle 文檔:復合構(gòu)建只是包含其他構(gòu)建的構(gòu)建. 在許多方面,復合構(gòu)建類似于 Gradle 多項目構(gòu)建,不同之處在于,它包括完整的 builds ,而不是包含單個 projects
- 組合通常獨立開發(fā)的構(gòu)建,例如,在應用程序使用的庫中嘗試錯誤修復時
- 將大型的多項目構(gòu)建分解為更小,更孤立的塊,可以根據(jù)需要獨立或一起工作
buildSrc vs Composing builds
為了正確對比這兩種方式,新建了兩個空的項目分別是 Project-buildSrc 和 Project-ComposingBuild,這兩個項目引用的依賴都是一樣的,Project-buildSrc 包含 buildSrc,Project-ComposingBuild 包含 Composing builds。
Project-buildSrc 和 Project-ComposingBuild 它們的結(jié)構(gòu)都差不多,接下來我們來看一下,編譯速度 和 使用上有什么不同。
編譯速度
Project-buildSrc 和 Project-ComposingBuild 這兩個項目,它們的 androidx.appcompat:appcompat 的版本是 1.0.2,現(xiàn)在我們從 1.0.2 升級到 1.1.0 來看一下它們 Build 的時間。
- Project-buildSrc:修改了版本號 1.0.2 -> 1.1.0 重新 Build 用時 37s
- Project-ComposingBuild:修改了版本號 1.0.2 -> 1.1.0 重新 Build 用時 8s
當修改了版本號,Project-buildSrc 項目 Build 的時間幾乎是 Project-ComposingBuild 項目的 4.6 倍( PS: 每個人的環(huán)境不同,時間上會有差異,但是 Project-buildSrc 的時間總是大于 Project-ComposingBuild )
在更大的項目中,網(wǎng)絡慢的情況下,這種差異會更加明顯,幾分鐘的構(gòu)建都是常事,在 buildSrc 中做微小的更改,可能需要花很長時間構(gòu)建,等待團隊其他成員在他們提取更改之后,都將導致項目重新構(gòu)建,這個代價是非常昂貴的。
它們在使用上有什么不同呢
Project-buildSrc
- 在項目根目錄下新建一個名為 buildSrc 的文件夾( 名字必須是 buildSrc,因為運行 Gradle 時會檢查項目中是否存在一個名為 buildSrc 的目錄 )
- 在 buildSrc 文件夾里創(chuàng)建名為 build.gradle.kts 的文件,添加以下內(nèi)容
plugins { `kotlin-dsl` } repositories{ jcenter() }
- 在
buildSrc/src/main/java/包名/
目錄下新建 Deps.kt 文件,添加以下內(nèi)容
object Versions { ...... val appcompat = "1.1.0" ...... } object Deps { ...... val appcompat = "androidx.appcompat:appcompat:${Versions.appcompat}" ...... }
- 重啟你的 Android Studio,項目里就會多出一個名為 buildSrc 的 module,實現(xiàn)上面演示的效果
Project-ComposingBuild
- 新建的 module 名稱 versionPlugin
- 在 versionPlugin 文件夾下的 build.gradle 文件內(nèi),添加以下內(nèi)容
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' // 實現(xiàn)這個插件的類的路徑 implementationClass = 'com.hi.dhl.plugin.Deps' } } }
在 versionPlugin/src/main/java/包名/
目錄下新建 Deps.kt 文件,添加以下內(nèi)容
class Deps : Plugin<Project> { override fun apply(project: Project) { } companion object { val appcompat = "androidx.appcompat:appcompat:1.1.0" } }
在 settings.gradle 文件內(nèi)添加 includeBuild 'versionPlugin'
重啟你的 Android Studio
在 app 模塊 build.gradle 文件內(nèi)首行添加以下內(nèi)容,就可以實現(xiàn)上面演示的效果
plugins{ // 這個 id 就是在 versionPlugin 文件夾下 build.gradle 文件內(nèi)定義的 id id "com.hi.dhl.plugin" }
ps:plugins{} 需要放在 app 模塊 build.gradle 文件內(nèi)首行位置
Project-ComposingBuild 比 Project-buildSrc 多了兩步操作需要在 settings.gradle 和 build.gradle 引入插件,兩者在使用都是差不多的
如何快速使用 buildSrc
- 訪問 ComposingBuilds-vs-buildSrc 拷貝 buildSrc 文件夾到你的項目的根目錄
- 重啟你的 Android Studio,項目里就會多出一個名為 buildSrc 的 module
如何快速使用 Composing builds
- 訪問 ComposingBuilds-vs-buildSrc 拷貝 versionPlugin 文件夾到你的項目的根目錄
- 按照上面的配置方式,分配在 settings.gradle 和 app 模塊的 build.gradle 引用插件即可
總結(jié)
總共從以下幾個方面對比了 Composing builds 和 buildSrc
- 目錄結(jié)構(gòu):它們的基本目錄結(jié)構(gòu)是相同的,可以根據(jù)自己的項目進行不同的擴展
- 編譯速度:當修改了版本號,Project-buildSrc 項目 Build 的時間幾乎是 Project-ComposingBuild 項目的 4.6 倍( PS: 每個人的環(huán)境不同,時間上會有差異,但是 Project-buildSrc 的時間總是大于 Project-ComposingBuild )
- 使用上的區(qū)別:Composing builds 比 buildSrc 多了兩步操作需要在 settings.gradle 和 build.gradle 引入插件
Project-buildSrc 和 Project-ComposingBuild 相關(guān)代碼已經(jīng)上傳到 GitHub 了:ComposingBuilds-vs-buildSrc
到目前為止大概管理 Gradle 依賴提供了 4 種不同方法:
- 手動管理 :在每個 module 中定義插件依賴庫,每次升級依賴庫時都需要手動更改(不建議使用)
- 使用 ext 的方式管理插件依賴庫 :這是 Google 推薦管理依賴的方法 Android官方文檔
- Kotlin + buildSrc:自動補全和單擊跳轉(zhuǎn),依賴更新時 將重新 構(gòu)建整個項目
- Composing builds:自動補全和單擊跳轉(zhuǎn),依賴更新時 不會重新 構(gòu)建整個項目
buildSrc 如何遷移到 Composing builds?
如果當前項目使用的是 buildSrc 方式,遷移到 Composing builds 很簡單,需要將 buildSrc 內(nèi)容拷貝的 Composing builds 中,然后刪掉 buildSrc 文件夾就可以即可
參考文獻
Organizing Gradle Projects
Composing builds
Android官方文檔,使用 ext 的方式管理插件依賴庫
原文鏈接:https://juejin.cn/post/6844904176250519565
相關(guān)推薦
- 2023-06-20 Jupyter?Notebook中%time和%timeit的使用詳解_python
- 2022-10-27 Python入門之字符串操作詳解_python
- 2023-04-06 C++聚合體初始化aggregate?initialization詳細介紹_C 語言
- 2024-03-09 【Redis】Redis中的布隆過濾器
- 2023-02-09 go?sync?Once實現(xiàn)原理示例解析_Golang
- 2022-11-23 Pandas?DataFrame操作數(shù)據(jù)增刪查改_python
- 2023-01-19 python使用?f?格式化字符串的用法_python
- 2022-05-15 C++中類的轉(zhuǎn)換函數(shù)你了解嗎_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支