Android組件化架構學習筆記——組件化編譯

Gradle本質上是一個Android Studio的自動化編譯工具,每個module中的Project對象在編譯時會運行內部所有的構建Task。Gradle就如工廠合成的工具一樣,很大程度上已經制定了基本流程,但生產時總會有不同的問題,如需要配置不同的原料(Gradle參數),加入特定的工序(加入Task任務)。

一.Android基礎編譯流程:

官方提供的構建流程,介紹了編譯打包的四個流程。

代碼編譯->代碼合成->資源打包->簽名和對齊:

  • Java編譯器對工程的代碼資源進行編譯,代碼資源包括app的源代碼。apt編譯生成的R文件和AIDL文件生成的Java接口文件。通過Java編譯器生成的xxx.class文件;
  • 通過dex工具,將xxx.class文件和工程以來的第三方庫文件生成虛擬機可執行的.dex文件,如使用了MultiDex,會產生多個dex文件,包含編譯後的所有class文件,也包括自身的.class文件和依賴.class文件;
  • aplbuilder工具將.dex文件/apt編譯後的資源文件/依賴中的第三方庫內的資源文件打包生成簽名對齊的apk文件;
  • 使用Jarsigner和Zipalign對文件進行簽名和對齊操作,最終生成apk文件。

二.Instant Run:

Android Studio2.0推出了Instant Run,意瞬間編譯。在編譯開發中能減少應用部署和構建的時間。Gradle需要使用2.0.0以上版本,支持minSdkVersion 15以上版本。

Instant Run的整個構建流程:

代碼變更->編譯->應用構建->應用部署->app重啓->Activity重啓->完成修改變更。

Instant Run實時即時運行的機制是修改代碼後,增量構建(產生增量dex的形式),然後通過判斷更新資源的複雜度去選擇執行熱更新/溫更新/或者冷更新:

  • 熱部署:當代碼變更後傳輸到app內,生效時不需要重啓應用。也不需要重建當前Activity。適合多數簡單的修改,如方法實現的修改/變量值的修改;
  • 溫部署:需要Activity重啓後才能看到更新,如代碼修復需要變更當前頁面的資源文件;
  • 冷部署:app需要完全重啓,但並不是重新安裝。如一些繼承規則/方法簽名等變更的情況。

三.Gradle構建策略:

從更大的粒度分析,引入更優的Gradle優化策略,從硬件角度考慮,就需要增強電腦配置,高配置會讓工程的編譯速度有質的提升。同時,Android Studio也提供了一些其他優化項供我們選擇。

Properties配置:

縮小考量粒度,Gradle編譯過程中很大程度上是依賴JVM的運算的,那麼可以考慮使用更新/更快的虛擬機,或者提升Java版本等。

再進一步縮小粒度,可以對Android Studio環境配置機制進行優化。

在項目工程gradle.properties中進行設置。

  • 開啓並行編譯:
  • org.gradle.parallel = true
  • 使用編譯緩存:
  • android.enableBuildCache = true
  • 保證JVM編譯命令在守護進行中編譯apk,daemon可以大大減少加載JVM和classes的時間:
  • org.gradle.daemon = true
  • 爲了在大型項目中更快地進行構建,可以配置以下的參數:
  • org.gradle.configureondemand = true
  • 加大編譯時Android Studio使用內存空間:
  • org.gradle.jvmargs = -Xmx3072M -XX\:MaxPermSize\=512m

四.不重複執行任務:

Library module編譯時比較耗時,因爲其debug和release的Task都執行了,這樣就重複執行了,可以避免這種情況。

默認情況下Library只發布Release版本,並被所有依賴於Library的project依賴,這與project的build type無關,這是Android Studio本身的一種限制。

在Library module的build.gradle中添加如下代碼,這樣就可以同時編譯debug版本:

  •    defaultConfig {
            defaultPublishConfig 'release'
            publishNonDefault true
           
        }

然後在Application module中配置其他的Library module依賴:

  • dependencies {
        debugCompile project(path:'web',configuration:'debug')
        releaseCompile project(path: 'web',configuration:'release')
    }

此時Debug版本的Application將依賴Debug版本的Library,編譯時,會跳過Library的packageReleaseJarArtfact任務,此方法有效提高了編譯速度。

五.增量build:

Project是不支持Annotation processors的增量build的,它會依賴於Gradle的變化。在module中減少使用Annotation processors將有助於編譯速度。

六.使用Gradle新特性:

Gradle4.1以後會添加implementation的依賴隔離模式,提供模塊解耦機制,也爲Gradle在構建工程時提供了最少量編譯的機制。

Gradle4.1以前使用compile機制,因爲底層接口時向上暴露的,如底層模塊代碼改動,會造成連鎖效應,上層的模塊也需要重新編譯。爲了安全起見,Gradle會完全編譯整個app。所以需要更長時間。

Gradle4.1的implementation機制,因爲具有跨模塊接口的隱蔽性,修改波及的範圍會減弱,Gradle藉助implementation引用優化了代碼檢測機制,準確定位需要編譯的模塊,這樣減少了編譯模塊。所以Android Studio3.0的工程默認都是implementation的方式引入依賴。

七.設置API新特性:

Android 5.0以後使用ART支持apk文件中加載.dex文件,ART會在app安裝之前提前編譯,可以掃描多個.dex文件,編譯一個單獨的.oat文件。

原因是每個module生成自身的.dex文件,然後不經修改直接放置apk中,看一下build過程,Android 5.0以下的版本超過方法數會執行transformClassWithMultidexlist,但是使用ART之後並不執行。

可以使用productFlavors進行配置,也可以使用buildTypes中的Debug和Release版本的配置:

  • buildTypes{
        debug{
            defaultConfig{minSdkVersion 21}
        }
        release{
            defaultConfig{minSdkVersion 14}
        }
    }

八.極速增量編譯Freeline

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章