APT 和 AGPTransform 区别

2021-05-31  本文已影响0人  有没有口罩给我一个

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这样设计本质到底是什么呢,请看图:

Gradle_Transform.png

APT 和 Transform 区别

首先 Processor 会在编译阶段初始化,对当前模块内的代码进行一次扫描,获取到相应的需要处理的注解,并调用 Processor.process 方法,然后我们根据这些注解类来做一些后续相关操作,下面图是java的编译流程:

compiler.png

Java 源码编译由以下三个过程组成:

整个编译过程就是 .java(源代码) -> processor(注解处理器) --> 字节码生成器 -> .class文件。

所以APT技术是属于编译器在预编译时扫描到指定注解时,然后调用能够处理该注解的注解处理器进行处理,而Transform是Gradle中的一种特殊Task,处理的是字节码文件和Java资源的。

上一篇下一篇

猜你喜欢

热点阅读