Android gradle plugin-transform简介

参考

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。

原文地址:https://www.cnblogs.com/muouren/p/13949091.html