Gradle Plugin简单实现

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

猜你喜欢

转载自blog.csdn.net/xingzhong128/article/details/80305014