参考
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。