Settings类
它占据了Gradle的第一个阶段也就是初始化阶段,这个阶段就是根据Settings.gradle文件的配置生成project对象,用户可以在settings.gradle文件中调用Settings的各种方法配置项目,最常用的就是include方法,它可以将用户新建的module加入项目中。
SourceSet类
管理源码资源库等存放的路径,如果用户未曾修改过会采用默认的路径配置,也就是约定优于配置。Android配置SourceSet接口是AndroidSourceSet,里面有各种资源、源码、so文件等路径的配置。
sourceSets {
main {
jniLibs.srcDirs = ['libs']
res.srcDirs = ['src/main/res', 'src/main/res-hello', 'src/main/res-world']
}
}
Gradle Plugin
可以将完成某一个特定功能的所有任务都封装在同一个插件中,只要用户安装了这个插件就拥有了完成此项功能的逻辑。在Android Studio的项目文件加下,buildSrc文件夹会被自动视作gradle插件文件夹,它的内部结构如下:
这个文件结构无法通过自动生成的方式创建,需要用户手动创建,最后需要在properties文件中注册Plugin对应的类。注意properties文件的名字会作为用户在构建脚本中apply plugin:‘properties文件名’使用。
implementation-class=com.example.plugin.MyPlugin
// build.gradle内容
apply plugin: 'groovy'
sourceSets {
main {
groovy {
srcDir 'src/main/groovy'
}
resources {
srcDir 'src/main/resources '
}
}
}
接下来需要定义传递进入插件的参数,通常都会把参数定义成一个数据对象,用户配置好数据对象,插件任务再从project属性中拿到用户配置的参数。
// 参数对象
class VersionEntity {
String versionCode
String versionName
String versionInfo
}
class MyPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
println 'Hello world, I am a plugin...'
project.extensions.create("myVersion", VersionEntity)
project.task("writeTask", type: WriteTask)
}
}
上面的project.extensions.create就是在创建配置对象,类型是VersionEntity类,接着又向project的taskContainer对象里添加了类型WriteTask类型的任务,任务名称为writeTask。现在需要自定义WriteTask类型,通常自定义的任务都是继承自DefaultTask类型,里面被@TaskAction注解的方法就是任务执行execute方法时调用的动作。
class WriteTask extends DefaultTask {
@TaskAction
void write() {
String versionCode = project.myVersion.versionCode
String versionName = project.myVersion.versionName
String versionInfo = project.myVersion.versionInfo
println("versionCode = $versionCode, versionName = $versionName, versionInfo = $versionInfo")
}
}
在WriteTask内部会先从project对象的myVersion属性对象里拿出用户配置的数据,接下来将所有数据分别打印出来,简单的插件已经开发完成,接着需要在构建脚本中使用插件功能。
// 应用插件
apply plugin: 'com.example.plugin'
// 配置传递给插件的参数
myVersion {
versionName = '1.0.0'
versionCode = '1000'
versionInfo = 'Hello-World1000-1.0.0'
}
// 将WriteTask任务挂接到assemble任务的最后再执行
afterEvaluate { Project project ->
def assemble = project.tasks.findByName("assemble")
assemble.doLast {
def writeTask = project.tasks.findByName("writeTask")
writeTask.execute()
}
}
运行gradle assemble命令接着查看结果,会发现在配置阶段打印和执行阶段分别执行了插件的输出命令。
// 配置阶段
Hello world, I am a plugin...
// 执行阶段
versionCode = 1000, versionName = 1.0.0, versionInfo = Hello-World1000-1.0.0