Android实现Gradle插件

上一篇Android使用FreeMarker制作代码模板中写道,利用FreeMarker来实现代码模板转换为java文件,这一篇将要描述如果通过插件将我们的FreeMarker工具类利用上。

1. 准备工作

在上一篇中所使用的项目的基础上进行更改,来实现通过利用Gradle插件自动生成java文件的功能。这里我使用的是Gradle-Plugins网站,通过这个网站,我们可以发布我们的插件应用。

    1.1 首先,打开Module下的build.gradle文件,输入如下部分,创建groovy的语言环境:

apply plugin: 'groovy'
apply plugin: 'maven'

dependencies {
    compile gradleApi()
    compile localGroovy()
}

repositories {
    mavenCentral()
}

1.2 在mian文件夹下,创建一个文件夹,命名为groovy,创建完成后,android studio会自动识别。在groovy文件夹下创建我们的包名,这里我创建的包名与java文件夹下的包名一样,但不影响,如下图:
Android实现Gradle插件_第1张图片
groovy和java的包

1.3 实现插件。如下代码PluginImpl所示,其主要部分是使用project.afterEvaluate将任务插入到所有任务中:

package com.hu.freemarkerlib

import com.hu.freemarkerlib.bean.PluginBean
import org.gradle.api.Plugin
import org.gradle.api.Project
import java.io.File
import com.hu.freemarkerlib.task.FreeMarkerTask

public class PluginImpl implements Plugin {
    void apply(Project project) {
        println "Hello gradle plugin"
        project.extensions.create('pluginImpl', PluginBean)

        project.task("showName") << {
            def pluginBean = project.extensions.pluginImpl
            println("--------------------------------------------------------------------------------------")
            println(pluginBean.outDirFile);
            println(pluginBean.packageName);
            println(pluginBean.clazzName);
            println(pluginBean.id);
            println(pluginBean.sex);
        }

        def freeMarkerTask = project.tasks.create("FreeMarkerTask", FreeMarkerTask)

        project.afterEvaluate {
            freeMarkerTask.execute()
        }
    }
}

然后在src/mian/resources/中创建文件夹META-INF/gradle-plugins/,在其下创建以.properties结尾的文件,名称任意,在文件中放入你的插件实现:

implementation-class=com.hu.freemarkerlib.PluginImpl

放入你的插件的路径的意义在于告知插件的位置所在。

2. 实现代码

FreeMarkerTask实现:

package com.hu.freemarkerlib.task

import com.hu.freemarkerlib.Generator
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction

class FreeMarkerTask extends DefaultTask {
  FreeMarkerTask() {
    super()
  }

  @TaskAction
  def doAction() {
    def pluginBean = project.extensions.pluginImpl
    println("----------------------------------------***************************--------------------")
    println(pluginBean.toString())
    def daoGenerator = new Generator()
    daoGenerator.generate(pluginBean.outDirFile,pluginBean.packageName, pluginBean.clazzName,pluginBean.id,pluginBean.sex,pluginBean.name)
  }
}

其PluginBean的实现如下:

package com.hu.freemarkerlib.bean

class PluginBean {
    private Integer id = 23;
    private String name = 'Jeck';
    private String sex = 'man';
    private String clazzName = 'defaultClassName';
    private String packageName = 'defaultPackage';
    private String outDirFile = 'defaultDir';

    Integer getId() {
        return id
    }
    void setId(Integer id) {
        this.id = id
    }
    String getName() {
        return name
    }
    void setName(String name) {
        this.name = name
    }
    String getSex() {
        return sex
    }
    void setSex(String sex) {
        this.sex = sex
    }
    String getClazzName() {
        return clazzName
    }
    void setClazzName(String clazzName) {
        this.clazzName = clazzName
    }
    String getPackageName() {
        return packageName
    }
    void setPackageName(String packageName) {
        this.packageName = packageName
    }
    String getOutDirFile() {
        return outDirFile
    }
    void setOutDirFile(String outDirFile) {
        this.outDirFile = outDirFile
    }

    @Override
    public String toString() {
        return "PluginBean{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", clazzName='" + clazzName + '\'' +
                ", packageName='" + packageName + '\'' +
                ", outDirFile='" + outDirFile + '\'' +
                '}';
    }
}
  • 添加发布插件配置信息

在Gradle-Plugins网站中可以了解到如何配置你的插件,这里贴出主要部分:

// First, apply the publishing plugin
buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath "com.gradle.publish:plugin-publish-plugin:0.9.10"
  }
}

apply plugin: "com.gradle.plugin-publish"

// Unless overridden in the pluginBundle config DSL, the project version will
// be used as your plugin version when publishing
version = "0.15"
group = "com.hu.freemarkerlib"

// The configuration example below shows the minimum required properties
// configured to publish your plugin to the plugin portal
pluginBundle {
    website = 'https://github.com/RaysHuch/'
    vcsUrl = 'https://github.com/RaysHuch/FreeMarkerDemo'
    description = 'Use FreeMarker for android and gradle'
    tags = ['freeMarkerPlugin']

    plugins {
        greetingsPlugin {
            id = 'com.hu.freemarkerlib'
            displayName = 'Gradle Greeting plugin'
        }
    }
}

在此同时,需要在C:\Users${电脑用户名}.gradle\gradle.properties中放入你的key和secret:

gradle.publish.key=************************************
gradle.publish.secret=*************************************

进行了以上操作后,你就可以将你的插件发布的网站中了,有时需要科学上网。

在你的项目中你会发现有如下变化:

Android实现Gradle插件_第2张图片
新增的Task

首选需要点击login的task,在Console中将会看到:

Android实现Gradle插件_第3张图片
执行"login"的Task

这里需要你点击一下链接,之后会出现成功的字样(当然是英文)。

到了最后一步,点击你的publishPlugins的Task,将你的插件发布,这样你的插件就真真正正可以使用了!

3、使用插件

插件的使用也是相当简单,按照如下配置,你的项目就可以起飞了:

buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath "gradle.plugin.com.hu.freemarkerlib:FreeMarkerLib:0.15"
  }
}

apply plugin: "com.hu.freemarkerlib"

4. 结语

由于是第一次使用插件,创建插件还是蛮简单的,但怎么执行Task就成了老大难的问题,一开始认为,直接在Plugin的apply方法中调用你的Java代码就可以了,说的没错,确实能够顺利执行,让我一度很兴奋,终于插件能跑了。但是,当我实现从build.gradle文件中读取配置信息的时候就面临了问题,无论怎样都不会读取到所写的配置信息,各种搜索才知道,需要在project.afterEvaluate中执行你的Task,build.gradle所配置的信息才会真正的加载运行环境里。

传送门:

FreeMarkerDemo

你可能感兴趣的:(Android实现Gradle插件)