Gradle 相關(guān)總結(jié)
APT 和 AGPTransform 區(qū)別
Gradle+Transform+Asm自動化注入代碼
Android 360加固+Walle多渠道自動化打包上傳蒲公英
什么是Task
一個Task代表一個構(gòu)建工作的原子操作。
在Gradle中,每一個Project在構(gòu)建的時候都包含一系列的Task,Project本質(zhì)上是Task對象的集合。每個任務執(zhí)行一些基本工作,例如編譯類,運行單元測試或壓縮WAR文件。
什么是 Transform ?
Transform 是專門處理構(gòu)建過程中的中間產(chǎn)物,Transform 可以被看作是 Gradle 在編譯項目時的一個 task,在 .class 文件轉(zhuǎn)換成 .dex 的流程中會執(zhí)行這些 task,對所有的 .class 文件(可包括第三方庫的 .class)進行轉(zhuǎn)換,轉(zhuǎn)換的邏輯定義在 Transform 的 transform 方法中。實際上平時我們在 build.gradle 中常用的功能都是通過 Transform 實現(xiàn)的,比如混淆(proguard)、dexBuilder等。
def hasAppPlugin = target.plugins.hasPlugin(AppPlugin.class)
if (hasAppPlugin) {
def android = target.extensions.getByType(AppExtension)
android.registerTransform(new MKRouterMappingTransform())
android.registerTransform(new ModifyClassExtendsTransform())
}
當編寫一個含有Transform的plugin插件的時候,只有引入 com.android.application插件的工程才存在AppExtension,而引入com.android.library的工程并沒有AppExtension,那么Google這樣設計本質(zhì)到底是什么呢,請看圖:

通常情況下對于Android 項目而言,其實最優(yōu)先啟動的是AppPlugin,用戶自定義的插件在Gradle配置(project.afterEvaluate)過程中,通過將自定義的Transform注冊到AppExtension(BaseExtension)中,最后在AppPlugin中通過AppExtension獲取到所以的自定義Transform,并將自定義Transform封裝為TransformTask(Task),即最后是將Transform轉(zhuǎn)換為Task,所以一個Transform就是gradle plugin中的一個Task,所以我們可以把Transform看成是Task ,實際上TransformTask接收到執(zhí)行Action動作然后將自身的事件分發(fā)給Transform。
我們知道Transform的本質(zhì)是Task,Transform和一個普通的Task一樣被執(zhí)行,而且會按照特定的依賴順序執(zhí)行,而每個Task又是一個Gradle Project中的最基礎的原子操作,所以Transform的執(zhí)行順序就是Task的執(zhí)行順序。
APT 和 Transform 區(qū)別
首先 Processor 會在編譯階段初始化,對當前模塊內(nèi)的代碼進行一次掃描,獲取到相應的需要處理的注解,并調(diào)用 Processor.process 方法,然后我們根據(jù)這些注解類來做一些后續(xù)相關(guān)操作,下面圖是java的編譯流程:

Java 源碼編譯由以下三個過程組成:
- 分析和輸入到符號表
- 注解處理
- 語義分析和生成 class 文件
整個編譯過程就是 .java(源代碼) -> processor(注解處理器) --> 字節(jié)碼生成器 -> .class文件。
所以APT技術(shù)是屬于編譯器在預編譯時掃描到指定注解時,然后調(diào)用能夠處理該注解的注解處理器進行處理,而Transform是Gradle中的一種特殊Task,處理的是字節(jié)碼文件和Java資源的。