APT 和 AGPTransform 區(qū)別

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ì)到底是什么呢,請看圖:

Gradle_Transform.png

  • 通常情況下對于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的編譯流程:

compiler.png

Java 源碼編譯由以下三個過程組成:

  • 分析和輸入到符號表
  • 注解處理
  • 語義分析和生成 class 文件

整個編譯過程就是 .java(源代碼) -> processor(注解處理器) --> 字節(jié)碼生成器 -> .class文件。

所以APT技術(shù)是屬于編譯器在預編譯時掃描到指定注解時,然后調(diào)用能夠處理該注解的注解處理器進行處理,而Transform是Gradle中的一種特殊Task,處理的是字節(jié)碼文件和Java資源的。

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

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

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