APT 和 AGPTransform 区别
Gradle 相关总结
APT 和 AGPTransform 区别
Gradle+Transform+Asm自动化注入代码
Android 360加固+Walle多渠道自动化打包上传蒲公英
什么是Task
一个Task代表一个构建工作的原子操作。
在Gradle中,每一个Project在构建的时候都包含一系列的Task,Project本质上是Task对象的集合。每个任务执行一些基本工作,例如编译类,运行单元测试或压缩WAR文件。
什么是 Transform ?
Transform 是专门处理构建过程中的中间产物,Transform 可以被看作是 Gradle 在编译项目时的一个 task,在 .class 文件转换成 .dex 的流程中会执行这些 task,对所有的 .class 文件(可包括第三方库的 .class)进行转换,转换的逻辑定义在 Transform 的 transform 方法中。实际上平时我们在 build.gradle 中常用的功能都是通过 Transform 实现的,比如混淆(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这样设计本质到底是什么呢,请看图:
-
通常情况下对于Android 项目而言,其实最优先启动的是AppPlugin,用户自定义的插件在Gradle配置(project.afterEvaluate)过程中,通过将自定义的Transform注册到AppExtension(BaseExtension)中,最后在AppPlugin中通过AppExtension获取到所以的自定义Transform,并将自定义Transform封装为TransformTask(Task),即最后是将Transform转换为Task,所以一个Transform就是gradle plugin中的一个Task,所以我们可以把Transform看成是Task ,实际上TransformTask接收到执行Action动作然后将自身的事件分发给Transform。
-
我们知道Transform的本质是Task,Transform和一个普通的Task一样被执行,而且会按照特定的依赖顺序执行,而每个Task又是一个Gradle Project中的最基础的原子操作,所以Transform的执行顺序就是Task的执行顺序。
APT 和 Transform 区别
首先 Processor
会在编译阶段初始化,对当前模块内的代码进行一次扫描,获取到相应的需要处理的注解,并调用 Processor.process
方法,然后我们根据这些注解类来做一些后续相关操作,下面图是java的编译流程:
Java 源码编译由以下三个过程组成:
- 分析和输入到符号表
- 注解处理
- 语义分析和生成 class 文件
整个编译过程就是 .java(源代码) -> processor(注解处理器) --> 字节码生成器 -> .class文件。
所以APT技术是属于编译器在预编译时扫描到指定注解时,然后调用能够处理该注解的注解处理器进行处理,而Transform是Gradle中的一种特殊Task,处理的是字节码文件和Java资源的。