booster 框架学习(一)

结合booster wiki以及官方博客学习booster的代码。

booster主要分为两个部分,一个是基于其task spi的自定义task,一个是基于transformer api 自定义 transformer,我的理解,其中所说的spi类似api一样的存在.

SPI全称Service Provider Interface,在Java中还是一个比较重要的概念,是Java提供的一套用来被第三方实现或者扩展的API,或者换句话说,SPI是一种服务发现机制。(摘之仓颉博客)

task spi

task的api仅仅是对gradle原生的BaseVariant 进行了一个简单的包装使用

interface VariantProcessor {
    fun process(variant: BaseVariant)// 变量为原生gradle类
}

transform spi

transformer稍微复杂些,首先在booster-transform-spi中定义了一系列interface,其中TransformListener 是对其自身 transform生命周期的监听,TransformContext是transform的上下文环境,其中主要包含一系列变量,例如transform name, project dir, build dir, temp dir . eg, 另外还有Transformer 为正主,Klass 特殊定义class,ArtifactManager artifacts常量的管理,KlassPool 根据name获取对应的Klass

这些都是其自己为了transform自定义的一些api,具体地和正宗的transform对接是在 booster-gradle-plugin 模块中,这里的booster transform继承了gradle的transform中,然后在 BoosterTransformInvocation 完成自定义transform spi和gradle transform的语义转换和对接

final override fun transform(invocation: TransformInvocation?) {
        invocation?.let {
            BoosterTransformInvocation(it).apply {
                dumpInputs(this)

                if (isIncremental) {
                    onPreTransform(this)
                    doIncrementalTransform()
                }
                // 很多代码
            }
        }

Build参数解析

buildsrc里面负责各个plugin的参数解析,主要工作是由BuildPropsPlugin以及BuildPropsGenerator完成,而BuildPropsPlugin由booster.gradle apply导入,主要是该Plugin在apply里面做了很多解析和生成工作,而每一个plugin均有apply booster.gradle

package com.didiglobal.booster.transform.thread;

// 生成文件举例
public interface Build {
    String GROUP = "com.didiglobal.booster"; // 组信息
    String ARTIFACT = "booster-transform-thread";  // 名称
    String VERSION = "0.22.0"; // version
    String REVISION = "3da1b919b1df72891993a98ac0fb80bffd4b3e8c";
}

一个典型transform gradle

apply from: '../gradle/booster.gradle' // 解析build参数,例如目标路径保存形式等等

dependencies {
    // AutoService : A configuration/metadata generator for java.util.ServiceLoader-style service providers

    kapt "com.google.auto.service:auto-service:1.0-rc4" // auto注解解析

    // 提供通用util功能,提供booster对于gradle的部分包装使用
    implementation project(':booster-android-gradle-api')
    implementation project(':booster-task-spi') // task spi
    implementation project(':booster-transform-asm')
    // transform spi 具体实现(asm实现)

   compileOnly 'com.android.tools.build:gradle:3.0.0'
    testCompileOnly 'com.android.tools.build:gradle:3.0.0'
}

在具体项目中包含对应的基本元素就可以开发出一个针对性的优化项检测或者插入字节码实现具体功能,这些模块最终根据产生的build文件打包成aar形式,使用的时候通过

classpath "com.didiglobal.booster:booster-gradle-plugin:$booster_version" // 引入需要集成的模块,还有对相应仓库的引入

知识点:

Gradle是一个编译框架类似ant / maven, 主要由两部分组成分别是task和transform,前者接触最多,例如 gradle clean,这个就是一个clean task, transform主要是在编译过程中实现各种转换的功能,例如现在的使用asm插入字节码,就是使用transform达到目的

DSL 是 Domain Specific Language 的缩写,既领域专用语言;

kapt 是Kotlin 的注解解析声明方式,类似annotationProcessor;

Gradle 5.0版本之前DSL语言仅仅为groovy,5.0之后增加kotlin作为DSL,所以再看xx.gradle文件时里面虽然是groovy的写法,但是可能包含kotlin语法。

原文地址:https://www.cnblogs.com/pjex/p/11551127.html

时间: 2024-11-26 01:28:06

booster 框架学习(一)的相关文章

滴滴Booster移动APP质量优化框架 学习之旅 二

推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 续写滴滴Booster移动APP质量优化框架学习之旅,上篇文章分析内置的transform:booster-transform-shrink booster-transform-shared-preferences,今天分析booster-task-compression以及定制task对资源索引文件resource.asrc进行优化(重复资源优化.无用资源优化

windows下scrapy框架学习笔记—'scrapy' 不是内部或外部命令

最近几天在深入的学习scrapy框架,但是装完各种需要的基础包之后却发现scrapy命令在别的路径下都用不了,我一开始是把python安装在F:\Python路径下的,安装了scrapy后它默认都会安装在这个路径下,scrapy在路径F:\Python\Scripts路径下,我的scrapy命令只能在此路径下用,因此创建什么工程也都只能在此文件下. 想了一下它的工作原理:它在F:\Python\Scripts路径下,就会在Scripts文件下存在一个scrapy批处理文件,那么在DOS下想要命令

Swagger框架学习分享

Swagger框架学习分享 转至元数据结尾 Created and last modified by 刘新宇 大约1分钟以前 转至元数据起始 一.背景介绍 1.1.项目简介 1.2.code repository 1.3.演示项目 二.开发准备 2.1.环境准备 2.2.项目搭建 2.2.1.jar仓库 2.2.2.相关依赖 2.2.3.编写配置文件 2.2.4.与swagger-ui集成 2.6.5.Controller配置 2.2.6.启动中间件 2.2.7.需求定制 三.学习感想 一.背景

某智能家居项目框架学习总结

这个月来第一篇博客,各种其他事情.. 之前负责过一个智能家居项目的二次开发,苏州一家公司做的,项目还是分了好几个系统,对业务流程的不同部分进行了划分,我是此项目的主要负责人,通过老师的指导,对这个项目也有了一些了解.此项目运用了一些框架,有些也是我第一次接触到的,下面将对项目用到的一些框架进行总结. 下面可能会出现几个有关智能家居的名词,介绍一下 1.机顶盒:每一个家庭都应该至少有一个机顶盒,控制电器开关都是由机顶盒向各电器的接收器发送命令 2.客户端:也就是用户的移动设备,手机.平板都可以,我

Spring框架学习之IOC(一)

Spring框架学习之IOC 先前粗浅地学过Spring框架,但当时忙于考试及后期实习未将其记录,于是趁着最近还有几天的空闲时间,将其稍微整理一下,以备后期查看. Spring相关知识 spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器.可单独使用,通常也与其他框架整合使用,例如SSH.SSM. IOC:控制反转 控制权由对象本身转向容器:由容器根据配置文件去创建实例并创建各个实例之间的依赖关系.等同于DI依赖注入 A

Android Afinal框架学习(一) FinalDb 数据库操作

框架地址:https://github.com/yangfuhai/afinal 对应源码: net.tsz.afinal.annotation.sqlite.* net.tsz.afinal.db.sqlite.* net.tsz.afinal.db.table.* net.tsz.afinal.utils.ClassUtils.net.tsz.afinal.utils.FieldUtils FinalDb 建库 FinalDb db = FinalDb.create(context, "my

spring框架学习(二)依赖注入

转自:http://blog.csdn.net/lishuangzhe7047/article/details/20740835 ———————————————————————————————————————————— spring框架为我们提供了三种注入方式,分别是set注入,构造方法注入,接口注入.接口注入不作要求,下面介绍前两种方式. 1,set注入 采用属性的set方法进行初始化,就成为set注入. 1)给普通字符类型赋值. [java] view plaincopyprint? pub

spring框架学习(一)

转自:http://blog.csdn.net/lishuangzhe7047/article/details/20740209 —————————————————————————————————————————————————— 1,什么是spring框架 spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,ibatis框架等组合使用. 2,架构概述 1)IoC(Inversi

从零开始编写自己的C#框架——框架学习补充说明

非常感谢轩辕公子提出了对本框架的看法与意见,所以这里也将回复贴出来,让大家都了解一下 本系列的快速开发指的是,框架构建完毕后,在这个基础上开发新功能非常快捷方便,基本不用写太多代码就可以在短时间内完成大量的基本功能.当然如果直接将全部代码贴出来,直接上例子的话可能更容易理解,但这样的话对于很多想了解整个框架实现过程的朋友来说,一下子太多代码就很难理解最初的思路了,同时大家也看到每一章都会附上独立的解决方案也是这么一回事,通过循序渐进的方式来进行学习.原本想要写得更细更多章节的,但由于个人空闲时间