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"; // versionString REVISION = "3da1b919b1df72891993a98ac0fb80bffd4b3e8c";
}
一个典型transform gradle
apply from: '../gradle/booster.gradle' // 解析build参数,例如目标路径保存形式等等dependencies {// AutoService : A configuration/metadata generator for java.util.ServiceLoader-style service providerskapt "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 spiimplementation 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
booster 框架学习(一)相关推荐
- 滴滴Booster移动APP质量优化框架 学习之旅 三
推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 滴滴Booster移动App质量优化框架-学习之旅 二对重复资源 ...
- 滴滴Booster移动APP质量优化框架 学习之旅 二
推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 续写滴滴Booster移动APP质量优化框架学习之旅,上篇文章分 ...
- jQuery框架学习第二天:jQuery中万能的选择器
jQuery框架学习第一天:开始认识jQuery jQuery框架学习第二天:jQuery中万能的选择器 jQuery框架学习第三天:如何管理jQuery包装集 jQuery框架学习第四天:使用jQu ...
- ssm框架requestmapping找不到_框架学习,就是介么简单
框架学习 程序员凯小白 最近实训ssm框架,SSM框架,是Spring + Spring MVC + MyBatis的缩写,这个是继SSH之后,目前比较主流的Java EE企业级框架,适用于搭建各种大 ...
- rose框架学习总结
rose框架学习总结 rose框架为paoding rose框架 具体可见https://code.google.com/p/paoding-rose/ 1 对rose框架的整体认识 1.1B/S ...
- Hadoop学习笔记—18.Sqoop框架学习
Hadoop学习笔记-18.Sqoop框架学习 一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据 ...
- jQuery框架学习第一天:开始认识jQuery
jQuery框架学习第一天:开始认识jQuery jQuery框架学习第二天:jQuery中万能的选择器 jQuery框架学习第三天:如何管理jQuery包装集 jQuery框架学习第四天:使用jQu ...
- Android接口和框架学习
Android接口和框架学习 缩写: HAL:HardwareAbstraction Layer,硬件抽象层 CTS:CompatibilityTest Suite,兼容性测试套件 Android让你 ...
- selenium + python自动化测试unittest框架学习(二)
1.unittest单元测试框架文件结构 unittest是python单元测试框架之一,unittest测试框架的主要文件结构: File >report >all_case.py &g ...
- SpringMVC框架--学习笔记(下)
接上篇:SpirngMVC框架--学习笔记(上):https://blog.csdn.net/a745233700/article/details/81038382 17.全局异常处理: 系统中异常包 ...
最新文章
- [Spark][Flume]Flume 启动例子
- linux开启kafka消费者命令,Linux kafka常用命令
- 人生影响最大的三位老师
- lisp调用qleader端点_标注时自动切换到DIM图层 lisp程序
- xrkmonitor监控mysql_xrkmonitor字符云监控系统
- E2017E0605-hm
- 系统架构工作笔记-数据展示进程与读取数据进程分离,实现低耦合(展示软件可适用任意厂家数据库)
- 大道至简读后感(七八章)
- VirtualBox中虚拟Ubuntu添加新的虚拟硬盘
- 不小心执行了rm -f,除了跑路,如何恢复?
- AndroidStudio使用XmlPullParser解析xml文件
- python writelines_详解详解Python中writelines()方法的使用
- linux路由表命令,在linux下永久保存路由表的写法(转)
- 013_itop4412设置多个GPIO
- mindmanager2021下载 最新版如何更新
- 【旧资料整理】硬盘-数据错误(循环冗余检查)
- 【密码学/密码分析】基于TMTO的密码分析方法
- excel如何拆分表格
- python双人对决小游戏
- uniapp:在HBuilderX里使用夜神模拟器
热门文章
- 瀚高DB兼容MySQL if函数
- 全球前沿技术趋势报告;华为发布Mate 40/Pro 系列新机;Windows 计算器移植到到 Linux...
- PAT Basic 1031
- LCD带字符液晶显示I LOVE YOU
- Shell脚本之正则表达式详解
- 鸿鹄系统和鸿蒙系统区别,荣耀智慧屏正式发布 鸿蒙系统+鸿鹄818芯片 售价3799元起...
- linux怎样安装xz工具,linux xz解压工具
- 2019年终总结2020个人规划和目标
- 网线插座板上网络模块接线
- linux磁盘镜像技术,Linux 下使用 dd 和 gzip 命令来代替 Ghost 做磁盘镜像