編譯優(yōu)化跌落神壇

最近在一次技術(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。

KAEDetector

花點(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ù)不迷路

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容