參考
https://sites.google.com/a/android.com/tools/tech-docs/new-build-system/transform-api
https://www.jianshu.com/p/37df81365edf
如何理解 Transform API
https://juejin.im/post/6844903841230487560#heading-13
【Android 修煉手冊】Gradle 篇 -- Gradle 的基本使用
https://www.jianshu.com/p/811b0d0975ef
Android Gradle Plugin打包Apk過程中的Transform API
https://juejin.im/post/6863276629029126158
一起用Gradle Transform API + ASM完成代碼織入
https://mp.weixin.qq.com/s/jDSE24eSsme3JcMex97KnQ
transform幾個問題
簡介
Android Gradle 工具在 1.5.0 版本后提供了 Transfrom API,允許第三方插件在編譯過的class 文件轉換為dex文件之前對其進行操作。
目前 jarMerge、proguard、multi-dex、Instant-Run 都已經換成 Transform 實現。
很多黑科技就是通過transform實現的,插件化框架Shadow就是使用的transform技術。
Transform 是一個接口,實現此接口,並調用BaseExtension.registerTransform進行注冊,BaseExtension的實現類是AppExtension。
AppExtension android = project.extensions.getByType(AppExtension) android.registerTransform(new AJXTransform(project))
transformTask的執行順序
每個注冊的transform都會創建一個TransformTask與之對應。
該方法在 javaCompile 之后調用, 會遍歷所有的 transform,然后一一添加進 TransformManager。
而TransformTask之間的順序不是按照dependOn來指定的(當然在注冊時可以傳遞依賴的transform),而是根據transform的輸入輸出類型確定順序的,當然輸入輸出相同那么先后順序就是注冊的順序。
加完自定義的 Transform 之后,再添加 Proguard, JarMergeTransform, MultiDex, Dex 等 Transform。
和注解處理器的區別
他們其實都屬於aop技術。
l 在使用transform機制時,由於transform是運行在編譯之后,所以此處會對class文件進行處理,如果生成代碼是也是class文件(java字節碼文件),一般會用asm、Javassist。
l 而在注解處理器中,會在編譯之前對java文件進行處理,如果要生成的也是java文件,之后會放到一起去編譯,一般會用JavaPoet。