Gradle Plugin入门使用

  • Post author:
  • Post category:其他




一、学习目标

  • 1、 了解 Gradle Plugin 的作用是什么?
  • 2、 如何去定义一个 Gradle Plugin?



一、Gradle Plugin 的作用是什么?

  • 1、模块化构建脚本的功能
  • 2、公共的功能可以抽取出来成为插件,可以供多个 build.gradle 使用,增加复用性。



二、定义一个 Gradle Plugin



2.1、插件的处理和应用

为了将构建脚本的逻辑封装到插件中,Gradle 需要做以下两件事:

处理插件



应用插件到目标中

  • 1、处理插件

Gradle 会自动找到插件所在的位置,例如一个

buildSrc

名字 module 就会 Gradle 识别为插件工程。

  • 2、应用插件

一旦插件被应用到执行的构建脚本中,那么插件对应的

apply(T target)

方法就会被调用。



2.2、 Gradle Plugin 创建

将插件定义在 buildSrc 中,这里的 buildSrc 就是当前工程下的一个 module ,Gradle 规定当一个module被命名为 buildSrc 时就会被当成插件去处理。

按照以下的步骤来创建一个简单的插件工程吧:

  • 1、在当前工程下创建一个 Java Library 的 module,起名字为

    buildSrc

  • 2、将 main/src/java 修改为 main/src/groovy

    项目结构

  • 3、创建类

    PluginTest

    实现 Plugin 接口并覆写 apply(T garget) 接口

Plugin 是一个泛型接口,在定义插件是应该将这个泛型填为 Project 即可。

class PluginTest implements Plugin<Project> {

    @Override
    void apply(Project project) {
		//定义一个 Task 
        project.task("MyTask") {
            doLast {
                println "MyTask doLast invoke..."
            }
        }
    }
}
  • 4、在外部应用这个插件
//在 app 下的 build.gradle 引用这个插件
apply plugin: PluginTest
  • 5、验证效果

app module 引用了这个 PluginTest 插件,因此 app 这个 project 就有 MyTask 这个任务了,我们来执行一下验证一下效果吧。

./gradlew :app:MyTask      

好了,通过上面几个步骤,就可以创建一个简单的 Gradle Plugin 工程了,但是回想一下,我们新建一个工程之后,在 build.gradle 中,Gradle 会帮我们引用 Android 插件

apply plugin: 'com.android.application'

,它们引用方式就跟我们上面引用方式是不一样哦。

那这种引用方式是怎么定义的呢?

这里其实是给我们的 Plugin 起了个别名,然后在外部就是用这个别名来引用。接下来我们通过源码来看看’com.android.application’`是怎么定义的?

【举例】Gradle Android Plugin 中定义了一个叫

AppPlugin

的插件,这个插件是 Gradle 插件对 Android 的扩展,内部定义 Android 相关的一些东西,例如 我们所熟知

android{}

内部的东西都是属于 Gradle 插件对 Android 的扩展。详细的内容可以参考另一篇博客:

从源码角度分析 Gradle 插件对 Android 的扩展

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.plugin"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

而这个

AppPlugin

就是

build.gradle

引入

apply plugin: 'com.android.application'

,查看源码,这个别名是定义在一个

文件名

上的,文件内容对这个 AppPlugin 的映射关系。

AppPlugin 别名

那么我们依样画葫芦,我们也来定义一下我们插件的别名吧:

下面来看一下如何来声明我们自己的 Plugin ID 的

  • 1、如下图所示在

    src/main/resources/META-INF.gradle-plugins

    文件夹下创建文件

因为插件类的包名为 com.example.buildsrc ,所以该文件明就是

包名.properties

buildSrc结构

  • 2、文件内容

文件内容的 implementation-class 对应的值为

插件类的全限名称

implementation-class=com.example.buildsrc.PluginTest
  • 3、引用插件

在 app 下的 build.gradle 引用这个插件

apply plugin:'com.example.buildsrc'
  • 4、验证效果

app module 引用了这个 PluginTest 插件,因此 app 这个 project 就有 MyTask 这个任务了,我们来执行一下验证一下效果吧。

./gradlew :app:MyTask      

好了,就这样,我们也可以像引用 Android Gradle Plugin ID 一样来引用我们自己的插件咯。



# 参考

记录于 2019年2月23日



版权声明:本文为lwj_zeal原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。