vs怎么更改編譯的堆空間_再見吧 buildSrc, 擁抱 Composing builds 提升 Android 編譯速度...

2e9af65530fb09c7f1889be67ea8ecde.png

前言

長期以來困擾我們的一個問題就是構建速度,AndroidStudio 的構建速度嚴重影響 Android 開發者的工作效率,尤其是更新一個版本號,導致整個項目重新構建,在網絡慢的情況下,這是無法忍受的。

buildSrc 這種方式,在最近幾年是非常流行的,因為它有以下優點:

  • 共享 buildSrc 庫工件的引用,全局只有一個地方可以修改它
  • 支持 AndroidStudio 自動補全

65a80e6f68d8e880130ad06e535175af.png
  • 支持 AndroidStudio 單擊跳轉

dde6d0c2a5236901c30e0b233cb7d1ba.png

有優點的同時也有缺點,來看一下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 依賴更新將重新構建整個項目,那么有沒有一種方法支持自動補全和單擊跳轉,有不用重新構建整個項目,Composing builds 就可以實現,接下來我們來演示一下 buildSrc 和 Composing builds 它們的 build 的時間

通過這篇文章你將學習到以下內容,將在文末總結部分會給出相應的答案

  • 什么是 buildSrc?
  • 什么是 Composing builds?
  • 如何使用 Composing builds 和 buildSrc
  • buildSrc 和 Composing builds 優勢劣勢對比?
  • Composing builds 編譯速度怎么樣?
  • buildSrc 如何遷移到 Composing builds?
  • 管理 Gradle 依賴都有那幾種方式?以及效率怎么樣?

這篇文章涉及很多重要的知識點,請耐心讀下去,我相信應該會給大家帶來很多不一樣的東西。

Composing builds 和 buildSrc 對比

接下來我們來演示一下 buildSrc 和 Composing builds 它們的優勢劣勢對比,在分析之前,先來了解一下基本概念

什么是 buildSrc

摘自 Gradle 文檔:當運行 Gradle 時會檢查項目中是否存在一個名為 buildSrc 的目錄。然后 Gradle 會自動編譯并測試這段代碼,并將其放入構建腳本的類路徑中, 對于多項目構建,只能有一個 buildSrc 目錄,該目錄必須位于根項目目錄中, buildSrc 是 Gradle 項目根目錄下的一個目錄,它可以包含我們的構建邏輯,與腳本插件相比,buildSrc 應該是首選,因為它更易于維護、重構和測試代碼

什么是 Composing builds

摘自 Gradle 文檔:復合構建只是包含其他構建的構建. 在許多方面,復合構建類似于 Gradle 多項目構建,不同之處在于,它包括完整的 builds ,而不是包含單個 projects

  • 組合通常獨立開發的構建,例如,在應用程序使用的庫中嘗試錯誤修復時
  • 將大型的多項目構建分解為更小,更孤立的塊,可以根據需要獨立或一起工作

buildSrc vs Composing builds

為了正確對比這兩種方式,新建了兩個空的項目分別是 Project-buildSrc 和 Project-ComposingBuild,這兩個項目引用的依賴都是一樣的,Project-buildSrc 包含 buildSrc,Project-ComposingBuild 包含 Composing builds。

f9e05337c0c64e3b9c8f8dadad6109a4.png

Project-buildSrc 和 Project-ComposingBuild 它們的結構都差不多,接下來我們來看一下,編譯速度 和 使用上有什么不同。

編譯速度

Project-buildSrc 和 Project-ComposingBuild 這兩個項目,它們的 androidx.appcompat:appcompat 的版本是 1.0.2,現在我們從 1.0.2 升級到 1.1.0 來看一下它們 Build 的時間。

  • Project-buildSrc:修改了版本號 1.0.2 -> 1.1.0 重新 Build 用時 37s

69f5929082a32c9cf6ea7b8b4e46939a.png
  • Project-ComposingBuild:修改了版本號 1.0.2 -> 1.1.0 重新 Build 用時 8s

8dbc3507e165b000f9c5148fe6f616f1.png

當修改了版本號,Project-buildSrc 項目 Build 的時間幾乎是 Project-ComposingBuild 項目的 4.6 倍( PS: 每個人的環境不同,時間上會有差異,但是 Project-buildSrc 的時間總是大于 Project-ComposingBuild )

在更大的項目中,網絡慢的情況下,這種差異會更加明顯,幾分鐘的構建都是常事,在 buildSrc 中做微小的更改,可能需要花很長時間構建,等待團隊其他成員在他們提取更改之后,都將導致項目重新構建,這個代價是非常昂貴的。

它們在使用上有什么不同呢

Project-buildSrc

  • 在項目根目錄下新建一個名為 buildSrc 的文件夾( 名字必須是 buildSrc,因為運行 Gradle 時會檢查項目中是否存在一個名為 buildSrc 的目錄 )
  • 在 buildSrc 文件夾里創建名為 build.gradle.kts 的文件,添加以下內容
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}"......
}
  • 重啟你的 Android Studio,項目里就會多出一個名為 buildSrc 的 module,實現上面演示的效果

Project-ComposingBuild

  • 新建的 module 名稱 versionPlugin
  • 在 versionPlugin 文件夾下的 build.gradle 文件內,添加以下內容
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 否則會提示找不到 gradlePluginjcenter()
}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"}
}
  • 在 settings.gradle 文件內添加 includeBuild 'versionPlugin' 重啟你的 Android Studio
  • 在 app 模塊 build.gradle 文件內添加以下內容,就可以實現上面演示的效果
plugins{// 這個 id 就是在 versionPlugin 文件夾下 build.gradle 文件內定義的 idid "com.hi.dhl.plugin"
}

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 引用插件即可

總結


總共從以下幾個方面對比了 Composing builds 和 buildSrc

  • 目錄結構:它們的基本目錄結構是相同的,可以根據自己的項目進行不同的擴展
  • 編譯速度:當修改了版本號,Project-buildSrc 項目 Build 的時間幾乎是 Project-ComposingBuild 項目的 4.6 倍( PS: 每個人的環境不同,時間上會有差異,但是 Project-buildSrc 的時間總是大于 Project-ComposingBuild )
  • 使用上的區別:Composing builds 比 buildSrc 多了兩步操作需要在 settings.gradle 和 build.gradle 引入插件

Project-buildSrc 和 Project-ComposingBuild 相關代碼已經上傳到 GitHub 了:ComposingBuilds-vs-buildSrc

到目前為止大概管理 Gradle 依賴提供了 4 種不同方法:

  • 手動管理 :在每個 module 中定義插件依賴庫,每次升級依賴庫時都需要手動更改(不建議使用)
  • 使用 ext 的方式管理插件依賴庫 :這是 Google 推薦管理依賴的方法 Android官方文檔
  • Kotlin + buildSrc:自動補全和單擊跳轉,依賴更新時 將重新 構建整個項目
  • Composing builds:自動補全和單擊跳轉,依賴更新時 不會重新 構建整個項目

buildSrc 如何遷移到 Composing builds?

如果當前項目使用的是 buildSrc 方式,遷移到 Composing builds 很簡單,需要將 buildSrc 內容拷貝的 Composing builds 中,然后刪掉 buildSrc 文件夾就可以即可

作者:HiDhl 來源:掘金
鏈接:https://juejin.im/post/5ed3ef906fb9a047bf7070b6

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539377.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539377.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539377.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java map的遍歷

轉載地址&#xff1a;http://www.cnblogs.com/shenliang123/archive/2012/08/28/2660705.html -------------------------------------------------------------------------------------------------------------------- java中的遍歷 import java.util.Collection; import j…

python循環for...in_python循環while和forin實例

python 循環while和for in簡單實例#!/uer/bin/env python# _*_ coding: utf-8 _*_lucknumber 5b 0while b <3:print(guss count:,b)a int(input(you guse number))if a > lucknumber:print (youaerbiger)elif a lucknumber:print (youare righet)break #跳出這個層級…

android懸浮功能實現,Android實現系統級懸浮按鈕

本文實例為大家分享了Android系統級懸浮按鈕的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下具體的需求1、就是做一個系統級的懸浮按鈕&#xff0c;就像iPhone 桌面的那個懸浮按鈕效果一樣&#xff0c;能隨意拖動&#xff0c;并且手一放開&#xff0c;懸浮按鈕就自動…

oracle decode_錯過血虧!一文搞懂Oracle鎖相關視圖及相關操作

本文主要研究鎖的相關視圖&#xff0c;以及鎖的相關操作&#xff0c;通過視圖查鎖的問題。 一、v$transaction視圖第一個視圖是v$transaction&#xff0c;就是Oracle數據庫所有活動的事務數&#xff0c;所有活動的事務每一個活動的事務在這里有一行。v$transactionXIDUSN表示當…

Linux文件系統與命令行

什么是命令行? 接收鍵盤命令并將其傳給操作系統執行的程序(用于輸入和管理命令的程序),統稱命令行,也叫: Shell&#xff0c;幾乎所有Linux發行版都提供了一個 Shell 程序,叫做: Bash (Bourne-Again Shell, 因為最初的 Shell 是由 Steve Bourne 編寫的原始 Unix 程序, Again 表…

freeMarker 遍歷 list,map,listmap

List List<String> clientSourceDatanew ArrayList<String>();clientSourceData.add("field字段");clientSourceData.add("title標題");ftl&#xff1a; <#if clientSourceData?exists><#list clientSourceData as key> <tr&g…

qtableview不選中_如何選中/取消選中QTableView并觸發setData()

我有一個自定義的QTableModel&#xff0c;我在PyQt中使用QTableView顯示它。我有一些字段設置為可檢查&#xff0c;我想添加“全部檢查”和“不檢查”按鈕。我覺得應該有一種方法可以使setData()從代碼中被調用&#xff0c;這樣檢查狀態就會改變&#xff0c;就像我已經用setDat…

android 自定義菜單欄,GitHub - earthWo/AndroidBottomNavigation: android 底部菜單欄,自定義樣式,自定義菜單數量,添加滾動動畫和水波紋動畫...

AndroidBottomNavigation截圖使用方法gradle:compile com.whitelife.library:library:1.0.1maven:com.whitelife.librarylibrary1.0pomandroid:id"id/bottom_navigation"android:layout_width"match_parent"android:layout_height"56dp"android:…

windows怎么打開python_windows怎么打開Python

Windows中運行Python的兩種運行方式認識編程環境 1 直接命令行啟用Python。當然&#xff0c;如果直接在cmd中輸入python&#xff0c;需要在windows中的path環境變量中做好設置。 此時&#xff0c;cmd中運行python就可以出現 “>>>” 符號。意味著python進入了交互運行…

sqldeveloper創建賬號_用oralce 自帶工具sql developer 創建表空間,用戶,權限

用oralce 自帶工具sql developer 創建/*第1步&#xff1a;創建臨時表空間 */create temporary tablespace hudongtemptablespacetempfile E:\worksubject\WY-Honda_Ess\Oracle11g\hudongtemptablespace.dbfsize 50mautoextend onnext 50m maxsize 20480mextent management loc…

AOE網與關鍵路徑簡介

前面我們說過的拓撲排序主要是為解決一個工程能否順序進行的問題&#xff0c;但有時我們還需要解決工程完成需要的最短時間問題。如果我們要對一個流程圖獲得最短時間&#xff0c;就必須要分析它們的拓撲關系&#xff0c;并且找到當中最關鍵的流程&#xff0c;這個流程的時間就…

Java 集合體系詳解——List體系有序集合

引言 面向對象語言對事物的體現必然是以對象的形式&#xff0c;Java工程師為了方便多多個對象的操作&#xff0c;就對對象進行存儲&#xff0c;集合就是存儲對象的一種方式&#xff0c;他們的底層都是基于不同的數據結構。當然集合和數組一樣都是容器&#xff0c;數組也是可以存…

android 定義固定數組,Android 圖片數組定義和讀取

位置&#xff1a;packages/apps/Launcher21、圖片數組定義、資源讀取如果有多張圖片&#xff0c;這些圖片的使用與順序無關&#xff0c;可以采取這種方式。drawable-nodpi中有3張圖片&#xff0c;wallpaper_1.jpg、wallpaper_2.jpg、wallpaper_3.jpgXML中定義數組IDwallpaper_1…

alert閃一下就沒了_尾部貫穿式鍍鉻銀飾條除了丑,還能閃瞎眼

尾部貫穿式鍍鉻銀飾條&#xff0c;在2010年代成為諸多汽車品牌車型爭相采用的新世紀新標配&#xff0c;配以雙邊排氣&#xff0c;讓整個車尾看起來層次感強烈&#xff0c;視覺收窄&#xff0c;幾十萬的奧迪A8L有&#xff0c;十幾萬的斯柯達速派有&#xff0c;A級車有&#xff0…

docker 指定網卡_Docker | Docker技術基礎梳理(五) Docker網絡管理

為什么需要容器的網絡管理&#xff1f;容器的網絡默認與宿主機、與其他容器相互隔離&#xff0c;且容器中可以運行一些網絡應用&#xff0c;比如nginx、web應用、數據庫等&#xff0c;如果需要讓外部也可以訪問這些容器中運行的網絡應用&#xff0c;那么就需要配置網絡來實現。…

java.net.URLEncode編碼 與 URLDecode解碼問題

原文&#xff1a;http://blog.csdn.net/luojian520025/article/details/9139293 -------------------------------------------------------------------------------------------- String mytext java.net.URLEncoder.encode("中國", "utf-8")…

Android安裝兩次才成功,Android應用從市場安裝完成打開與桌面打開,被啟動兩次的問題...

問題描述&#xff1a;1、從Android應用市場下載并安裝應用&#xff0c;安裝完成后&#xff0c;當前界面下方會出現“打開”按鈕&#xff0c;這時候我們點擊“打開”&#xff0c;會啟動應用&#xff0c;進入到應用的啟動頁面&#xff0c;然后進入應用的主界面&#xff0c;這個時…

事務保存點

在SQL Server中使用rollback會回滾所有的未提交事務狀態&#xff0c;但是有些時候我們只需要回滾部分語句&#xff0c;把不需要回滾的語句提到事務外面來&#xff0c;雖然是個方法&#xff0c;但是卻破壞了事務的ACID。 SQL中使用事務保存點 即可解決這個問題. 一.SQL 事務中存…

鼎信諾審計前端取數工具_給2019前端的5個建議

2019 農歷新年即將到來&#xff0c;是時候總結一下團隊過去一年的技術沉淀。過去一年我們支撐的數據相關業務突飛猛進&#xff0c;其中兩個核心平臺級產品代碼量分別達到30萬行和80萬行&#xff0c;TS 模塊數均超過1000個&#xff0c;協同開發人員增加到20人。由于歷史原因&…

Hadoop HA

HA概念&#xff1a; high avalability 高可用性。 hadoop 1.x非ha設計 Secondnode對元數據的可靠性有了保障&#xff0c;但服務的可用性不高。 即&#xff1a;當Namenode節點宕機了&#xff0c;整個hadoop就不能使用了&#xff0c;影響了client的使用。 hadoop 2.x的ha設計 新…