学习扔物线进阶视频课程笔记。Gradle相关

Gradle配置

基本概念

Gradle是Android的构建工具,使用Groovy语言,Groovy是一种动态语言
配置文件里面的buildscript、allprojects、dependencies等都是方法的调用,用闭包来写成看起来是JSON的格式
Groovy闭包,Closure,是一个可以传递的方法,和Lambda类似
methodMissing,groovy中尝试调用方法时,如果找不到方法不会报错,会尝试在methodMissing找方法的定义,比如classpath,可以动态添加方法

buildTypes和productFlavors

buildTypes用于指定版本类型,比如发布版本release,内测版本test,自测版本debug等,比如如果是测试版本在界面的角落添加色块用于提示。在src目录下面创建不同的目录(和buildTypes同名),和main同级,不同的buildTypes会执行对应目录下面的代码

productFlavors产品风味,可以用于区分免费版和付费版,或者区分上架平台,使用flavorDimensions来指定维度,和buildTypes一样可以添加目录,执行对应的代码

buildTypes针对开发的不同,productFlavors针对用户的不同,可以管理不同的资源

compile,implementation和api

implementation不会传递依赖
compile/api,会传递依赖,api是compile的替代品,效果相同
传递依赖时,0级项目可以使用二级依赖的代码,不传递时不可以使用
当依赖被传递时,二级依赖的改动会导致0级项目重新编译;当依赖不传递时,二级依赖的改动不会导致0级项目重新编译,在库项目中才会生效

gradle wrapper

通过【只同步版本,不同步文件】的方式来减少协作项目的大小
每个人电脑上的gradle存放在固定位置,然后使用GradleWrapper取用对应版本,而不用把gradle放进项目

task

task任务,是Gradle构建执行的一个原子工作单元,Android使用Gradle构建时,就是在执行多个task
执行方式:./gradlew taskName
结构:

普通代码块:在task创建过程中就会被执行,发生在configuration(配置)阶段
doFirst和doLast,在task执行过程中被执行,发生在execution(执行)阶段,如果用户没有直接或者间接执行task,那么doLast和doFirst代码不会被执行
doFirst和doLast都是task代码,启动doFirst是往队列的前面插入代码,doLast是往队列的后面插入代码
task的依赖,可以使用task taskName(dependsOn:b)的形式来定依赖,指定依赖后,task会在自己执行前先执行自己依赖的task

gradle生命周期

三个阶段:
初始化阶段:执行setting.gradle 确定project和子project
配置阶段:执行每个project的build.gradle,确定出所有task所组成的有向无环图
执行阶段:按照上一阶段所确定出的有向无环图来执行指定的task
如果想要在阶段之间插入代码
在一二阶段之间:在settings.gradle的最后
在二三阶段之间:在项目的build.gradle中使用afterEvaluate{ 插入代码 }

Gradle Plugin

Gradle Plugin即Gradle插件,本质是把逻辑独立的代码抽取和封装,方便复用

自定义插件

创建名为buildSrc的JavaLib类型的Model,在settings.gradle中删除对这个Model的引用,在buildSrc的main下创建目录resources/META-INF/gradle-plugins/,目录下创建文件*.properties,目录结构如下:

*是插件的名称,例如com.hencoder.plugindemo.properties,最终在应用插件的代码为:apply plugin: 'com.hencoder.plugindemo'

在*.properties文件中只有一行内容,格式为:implementation-class=com,hencoder.plugin_demo.DemoPlugin,等号右边指定了Plugin具体是哪个类

关于buildSrc目录:这是gradle的一个特殊目录,这个目录的build.gradle会自动被执行,所以不需要也不能配置仅settings.gradle中。buildSrc所配置出来的Plugin会被自动添加到编译过程中的每一个project的classpath,因此可以直接使用apply plugin:"xxx'的方式来应用plugin

Transform

Transform是由Android提供的,在项目构建过程中把编译后的文件(jar文件和class文件)添加自定义的中间处理过程的工具

先在buildSrc的gradle中添加依赖:

然后创建一个类继承com.android.build.api.transform.Transform
在这个类的transform方法中进行处理
对class文件修改字节码,可以使用javassist或者ASM工具

使用transform在编译时动态修改字节码,可以实现以下功能:
对全局的class插桩,做UI、内存、网络等方面的性能监控,或者统计和分析用户行为
某个三方依赖使用起来有点问题,又不想拿他的源码重新编译,可以直接对他的class做修改

注:在新的Gradle8.0中,Transform被移除