最近在一次技術(shù)分享中,有網(wǎng)友問我小公司可以考慮做哪些編譯優(yōu)化?我覺得這個(gè)課題也還是挺有必要展開下講講的。
編譯優(yōu)化方面其實(shí)我個(gè)人覺得并不一定是特別高大上的東西,除了一些特別深水區(qū)的地方,還是有些東西還是能從細(xì)微處進(jìn)行展開的。今天我們就嘗試下拉他下水。
組件化
組件化和編譯優(yōu)化有啥關(guān)系? 有些人甚至覺得可能會(huì)拖慢整個(gè)工程編譯速度吧。
在我的認(rèn)知中gradle是一個(gè)并行編譯的模式,所以當(dāng)我們的工程的taskGraph確定之后,很多沒有依賴關(guān)系的模塊是可以并行編譯的。這樣的情況下我們就可以充分的使用并行編譯的能力。
而且從另外一個(gè)角度gradle build cache出發(fā),我們可以擁有更細(xì)致的buildcache。如果當(dāng)前模塊沒有變更,那么在增量過程中也可以變得更快。
巧用DI或者SPI
以前我其實(shí)挺反感DI(依賴注入)的,我認(rèn)為會(huì)大大的增加工程的復(fù)雜度。畢竟掌握一門DI(依賴注入)還是挺麻煩的。
但是最近我突然想通了,我之前看GE(Gradle Enterprise)的時(shí)候,發(fā)現(xiàn)有些業(yè)務(wù)模塊之間有依賴關(guān)系,導(dǎo)致了這些模塊的編譯順序必須在相對(duì)靠后的一個(gè)狀態(tài),但是因?yàn)?code>com.android.application會(huì)依賴所有業(yè)務(wù)模塊,這個(gè)時(shí)候就會(huì)觸發(fā)水桶理論,該模塊的編譯就是整個(gè)水桶最短的短板。也讓整個(gè)工程的并行編譯有一段時(shí)間不可用。
那么這種問題我們可以通過DI(依賴注入)或者SPI(服務(wù)發(fā)現(xiàn))的形式進(jìn)行解決。模塊并不直接依賴業(yè)務(wù)的實(shí)現(xiàn)而是依賴于業(yè)務(wù)的一個(gè)抽象接口進(jìn)行編程,這樣可以優(yōu)化既有工程模塊間的依賴關(guān)系。
道理雖然簡(jiǎn)單,但是真的去抽象也會(huì)考驗(yàn)對(duì)應(yīng)開發(fā)的代碼能力。
關(guān)注AGP優(yōu)化方案
這部分我覺得是很容易被開發(fā)遺忘的,比如我們最近在做的buildConfig,AIDL編譯時(shí)默認(rèn)關(guān)閉,還有去年到今年一直在進(jìn)行的非傳遞R文件的改造。官方的Configuration Cache,還有后續(xù)的全局AGP通用屬性,還有默認(rèn)關(guān)閉Jetfied等等,這些跟隨AGP迭代的屬性。
結(jié)果上看關(guān)閉非必要模塊的buildConfig AIDL可以讓全量編譯時(shí)間縮短大概2min,當(dāng)然主要是我們模塊多。而非傳遞R可以讓我們的工程的R文件變更的增量緩存更好管理。
Kotlin技術(shù)棧更新
kt已經(jīng)發(fā)布很長(zhǎng)時(shí)間了,最近最讓我期待的是kt2.0帶來的K2的release版本。能大大的提升kotlin compiler編譯速度。
另外還有kt之前發(fā)布的ksp,是一個(gè)非常牛逼的kapt的替代方案。而且官方也在逐步對(duì)ksp進(jìn)行支持。比如room這個(gè)框架就已經(jīng)適配好了ksp。我自己也寫過好幾個(gè)ksp插件。我個(gè)人認(rèn)為還是非??岬摹?/p>
最后還有一些廢棄東西的下架,比如KAE(kotlin-android-extensions)這種已經(jīng)被明確說是后續(xù)不繼續(xù)進(jìn)行支持的框架。我們最近嘗試的方案是通過Android Lint把所有聲明KAE的進(jìn)行報(bào)錯(cuò)處理。剩下的就是業(yè)務(wù)自行決定是改成findViewById還是viewBinding。
花點(diǎn)錢接個(gè)GE
如果這個(gè)老板不太差這么點(diǎn)錢,我真的覺得GE(Gradle Enterprise)是個(gè)非常好的選擇??梢院苤庇^的看出一些工程的編譯問題,而且對(duì)接的gradle同學(xué)也都很專業(yè)。
不要輕易魔改Gradle
非必要的情況下,個(gè)人是不太建議同學(xué)們改這個(gè)的。非常容易破壞整個(gè)編譯緩存系統(tǒng)!這里不僅僅只針對(duì)Transform,還有對(duì)任意編譯產(chǎn)物進(jìn)行修改的,比如xml,資源等等。當(dāng)然如果可以的話,盡可能的使用最新AGP提供的一些新的api去進(jìn)行修改吧。這個(gè)可以多參考下2BAB大神的一些文章。
另外比如很多非必要的Transform轉(zhuǎn)化建議本地編譯的時(shí)候就直接關(guān)閉了,雖然可能會(huì)出現(xiàn)一些本地行為不一致的情況,但是可以大大的優(yōu)化一些編譯速度。字節(jié)碼不是炫技的工具,謹(jǐn)記!
總結(jié)
最近基本沒有做一些特別適合分享的內(nèi)容,文章也就沒有更新了。各位大佬們體諒啊,抱拳了。
大家有空沒空關(guān)注下我個(gè)人簡(jiǎn)介,技術(shù)不迷路