美文网首页
APT 和 AGPTransform 区别

APT 和 AGPTransform 区别

作者: 有没有口罩给我一个 | 来源:发表于2021-05-31 16:25 被阅读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
    • 通常情况下对于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的编译流程:

    compiler.png

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

    • 分析和输入到符号表
    • 注解处理
    • 语义分析和生成 class 文件

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

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

    相关文章

      网友评论

          本文标题:APT 和 AGPTransform 区别

          本文链接:https://www.haomeiwen.com/subject/ezrbsltx.html