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文件夹下的包名一样,但不影响,如下图:
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<Project> {
    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=*************************************

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

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

新增的Task

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

执行"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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容