如何使用Android Studio开发Gradle插件系列教程(一)

转载自:http://blog.csdn.net/sbsujjbcy/article/details/50782830

缘由

首先说明一下为什么会有这篇文章。前段时间,插件化以及热修复的技术很热,Nuwa热修复的工具NuwaGradle,携程动态加载技术DynamicAPK,还有希望做最轻巧的插件化框架的Small。这三个App有一个共同的地方就是大量的使用了Gradle这个强大的构建工具,除了携程的框架外,另外两个都发布了独立的Gradle插件提供自动化构建插件,或者生成热修复的补丁。所以学习一下Gradle插件的编写还是一件十分有意义的事。

插件类型

Gradle的插件一般有这么几种:

  • 一种是直接在项目中的gradle文件里编写,这种方式的缺点是无法复用插件代码,在其他项目中还得复制一遍代码(或者说说复制一遍文件)
  • 另一种是在独立的项目里编写插件,然后发布到中央仓库,之后直接引用就可以了,优点就是可复用。就和上面的Nuwa和Small一样。

Gradle相关语法

本篇文章不会详细说明Gradle相关的语法,如果要学习gradle相关的东西,请查看Gradle for Android

Gradle插件开发

Gradle插件是使用Groovy进行开发的,而Groovy其实是可以兼容Java的。Android Studio其实除了开发Android App外,完全可以胜任开发Gradle插件这一工作,下面来讲讲具体如何开发。

  1. 首先,新建一个Android项目。
  2. 之后,新建一个Android Module项目,类型选择Android Library。
  3. 将新建的Module中除了build.gradle文件外的其余文件全都删除,然后删除build.gradle文件中的所有内容。
  4. 在新建的module中新建文件夹src,接着在src文件目录下新建main文件夹,在main目录下新建groovy目录,这时候groovy文件夹会被Android识别为groovy源码目录。除了在main目录下新建groovy目录外,你还要在main目录下新建resources目录,同理resources目录会被自动识别为资源文件夹。在groovy目录下新建项目包名,就像Java包名那样。resources目录下新建文件夹META-INF,META-INF文件夹下新建gradle-plugins文件夹。这样,就完成了gradle 插件的项目的整体搭建,之后就是小细节了。目前,项目的结构是这样的。

这里写图片描述

打开Module下的build.gradle文件,输入

<code class="hljs mathematica has-numbering">apply plugin: <span class="hljs-string">'groovy'</span>
apply plugin: <span class="hljs-string">'maven'</span>

dependencies <span class="hljs-list">{
    compile gradleApi()
    compile localGroovy()
}</span>

repositories <span class="hljs-list">{
    mavenCentral()
}</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul>

下面我们在包名下新建一个文件,命名为PluginImpl.groovy,注意有groovy后缀,然后在里面输入,注意包名替换为你自己的包名。

<code class="hljs axapta has-numbering">package cn.edu.zafu.gradle

import org.gradle.api.Plugin
import org.gradle.api.Project

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">PluginImpl</span> <span class="hljs-inheritance"><span class="hljs-keyword">implements</span></span> <span class="hljs-title">Plugin</span><<span class="hljs-title">Project</span>> {</span>
    <span class="hljs-keyword">void</span> apply(Project project) {
       project.task(<span class="hljs-string">'testTask'</span>) << {
            println <span class="hljs-string">"Hello gradle plugin"</span>
        }
    }
}</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul>

然后在resources/META-INF/gradle-plugins目录下新建一个properties文件,注意该文件的命名就是你只有使用插件的名字,这里命名为plugin.test.properties,在里面输入

<code class="hljs avrasm has-numbering">implementation-class=cn<span class="hljs-preprocessor">.edu</span><span class="hljs-preprocessor">.zafu</span><span class="hljs-preprocessor">.gradle</span><span class="hljs-preprocessor">.PluginImpl</span></code><ul class="pre-numbering" style=""><li>1</li></ul><ul class="pre-numbering" style=""><li>1</li></ul>

注意包名需要替换为你自己的包名。

这样就完成了最简单的一个gradle插件,里面有一个叫testTask的Task,执行该task后会输出一段文字,就像当初我们输出HelloWorld一样。

发布到本地仓库

接着,我们需要将插件发布到maven中央仓库,我们将插件发布到本地仓库就好了,在module项目下的buidl.gradle文件中加入发布的代码。

<code class="hljs cs has-numbering">repositories {
    mavenCentral()
}
<span class="hljs-keyword">group</span>=<span class="hljs-string">'cn.edu.zafu.gradle.plugin'</span>
version=<span class="hljs-string">'1.0.0'</span>

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: uri(<span class="hljs-string">'../repo'</span>))
        }
    }
}</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li></ul>

上面的group和version的定义会被使用,作为maven库的坐标的一部分,group会被作为坐标的groupId,version会被作为坐标的version,而坐标的artifactId组成即module名,我们让其取一个别名moduleName。然后maven本地仓库的目录就是当前项目目录下的repo目录。
这时候,右侧的gradle Toolbar就会在module下多出一个task

这里写图片描述

点击uploadArchives这个Task,就会在项目下多出一个repo目录,里面存着这个gradle插件。

这里写图片描述

目录就像上图这样,具体目录结构和你的包名等一系列有关,time是我的module名。

发布到本地maven仓库后,我们就使用它,在叫app的android项目下的gradle.build的文件中加入

<code class="hljs matlab has-numbering">buildscript <span class="hljs-cell">{
    repositories {
        maven {
            url uri(<span class="hljs-string">'../repo'</span>)
        }</span>
    }
    dependencies <span class="hljs-cell">{
        classpath <span class="hljs-string">'cn.edu.zafu.gradle.plugin:time:1.0.0'</span>
    }</span>
}
apply plugin: <span class="hljs-string">'plugin.test'</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul>

apply plugin后面引号内的名字就是前文plugin.test.properties文件的文件名。而class path后面引号里的内容,就是上面grade中定义的group,version以及moduleName所共同决定的,和maven是一样的。

同步一下gradle,右侧app下other分类下就会多出一个testTask,双击执行这个Task,控制台就会输出刚才我们输入的字符串

这里写图片描述

发布到Jcenter仓库

接下来我们将其发布到jcenter中央仓库。参考之前写的一篇文章 使用Android Studio将开源库发布到Jcenter中央库

在项目根目录下的build.gradle文件中加入。

<code class="hljs matlab has-numbering">dependencies <span class="hljs-cell">{
        classpath <span class="hljs-string">'com.android.tools.build:gradle:2.0.0-beta6'</span>
        classpath <span class="hljs-string">'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'</span>
        classpath <span class="hljs-string">'com.github.dcendents:android-maven-plugin:1.2'</span>
    }</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>

在项目根路径下新建bintray.gradle文件,输入

<code class="hljs scala has-numbering">apply plugin: <span class="hljs-string">'com.jfrog.bintray'</span>
apply plugin: <span class="hljs-string">'maven-publish'</span>

<span class="hljs-keyword">def</span> projectName = <span class="hljs-string">"timePlugin"</span>
<span class="hljs-keyword">def</span> mavenDesc = <span class="hljs-string">'your desc'</span>
<span class="hljs-keyword">def</span> baseUrl = <span class="hljs-string">'https://github.com/yourBaseUrl'</span>
<span class="hljs-keyword">def</span> siteUrl = baseUrl
<span class="hljs-keyword">def</span> gitUrl = <span class="hljs-string">"${baseUrl}/yourGitUrl"</span>
<span class="hljs-keyword">def</span> issueUrl = <span class="hljs-string">"${baseUrl}/yourGitIssueUrl"</span>

<span class="hljs-keyword">def</span> licenseIds = [<span class="hljs-string">'Apache-2.0'</span>]
<span class="hljs-keyword">def</span> licenseNames = [<span class="hljs-string">'The Apache Software License, Version 2.0'</span>]
<span class="hljs-keyword">def</span> licenseUrls = [<span class="hljs-string">'http://www.apache.org/licenses/LICENSE-2.0.txt'</span>]
<span class="hljs-keyword">def</span> inception = <span class="hljs-string">'2016'</span>

<span class="hljs-keyword">def</span> username = <span class="hljs-string">'lizhangqu'</span>

install {
    repositories {
        mavenInstaller {
            pom.project {
                <span class="hljs-comment">// Description</span>
                name projectName
                description mavenDesc
                url siteUrl

                <span class="hljs-comment">// Archive</span>
                groupId project.group
                artifactId archivesBaseName
                version project.version

                <span class="hljs-comment">// License</span>
                inceptionYear inception
                licenses {
                    licenseNames.eachWithIndex { ln, li ->
                        license {
                            name ln
                            url licenseUrls[li]
                        }
                    }
                }
                developers {
                    developer {
                        name username
                    }
                }
                scm {
                    connection gitUrl
                    developerConnection gitUrl
                    url siteUrl
                }
            }
        }
    }
}

task sourcesJar(<span class="hljs-keyword">type</span>: Jar) {
    from sourceSets.main.allGroovy
    classifier = <span class="hljs-string">'sources'</span>
}


task javadocJar(<span class="hljs-keyword">type</span>: Jar, dependsOn: groovydoc) {
    from groovydoc.destinationDir
    classifier = <span class="hljs-string">'javadoc'</span>
}

artifacts {
    archives javadocJar
    archives sourcesJar
}


bintray {
    user = BINTRAY_USER
    key = BINTRAY_KEY
    configurations = [<span class="hljs-string">'archives'</span>]
    pkg {
        repo = <span class="hljs-string">'maven'</span>
        name = projectName
        desc = mavenDesc
        websiteUrl = siteUrl
        issueTrackerUrl = issueUrl
        vcsUrl = gitUrl
        labels = [<span class="hljs-string">'gradle'</span>, <span class="hljs-string">'plugin'</span>, <span class="hljs-string">'time'</span>]
        licenses = licenseIds
        publish = <span class="hljs-keyword">true</span>
        publicDownloadNumbers = <span class="hljs-keyword">true</span>
    }
}</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li></ul>

将对应的描述性文字修改为你自己的信息,尤其是最前面的一系列的def定义,然后在gradle.properties文件中加入BINTRAY_USER和BINTRAY_KEY。

在你的module中apply该grade文件

<code class="hljs cs has-numbering">apply <span class="hljs-keyword">from</span>: <span class="hljs-string">'../bintray.gradle'</span></code><ul class="pre-numbering" style=""><li>1</li></ul><ul class="pre-numbering" style=""><li>1</li></ul>

右侧的gradle的toolbar就会多出几个task

这里写图片描述

之后我们先运行other下的install这个task,再执行bintrayUpload这个task,如果不出意外,就上传了,之后不要忘记到后台add to jcenter。成功add到jcenter之后就会有link to jcenter的字样

这里写图片描述

耐心等待add to center成功的消息,之后就可以直接引用了,将module下的gradle文件maven部分的定义

<code class="hljs scss has-numbering">        maven {
            url <span class="hljs-function">uri(<span class="hljs-string">'../repo'</span>)</span>
        }</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul>

前面加入

<code class="hljs scss has-numbering">    <span class="hljs-function">jcenter()</span></code><ul class="pre-numbering" style=""><li>1</li></ul><ul class="pre-numbering" style=""><li>1</li></ul>

最终的内容如下

<code class="hljs matlab has-numbering">buildscript <span class="hljs-cell">{
    repositories {
        jcenter()
        maven {
            url uri(<span class="hljs-string">'../repo'</span>)
        }</span>
    }
    dependencies <span class="hljs-cell">{
        classpath <span class="hljs-string">'cn.edu.zafu.gradle.plugin:time:1.0.0'</span>
    }</span>
}

apply plugin: <span class="hljs-string">'plugin.test'</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li></ul>

就是这么简单,再次运行一下测试下是否成功。

最佳实践

最佳实践的来源是源自multidex,为什么呢,因为最近当方法数超了之后,如果选择multidex,编译的过程就会慢很多很多,为了检测到底是哪一步的耗时,需要编写一个插件来统计各个task执行的时间,因此就有了这么一个最佳实践。

在PluginImpl同级目录下新建TimeListener.groovy文件。输入

<code class="hljs avrasm has-numbering">package cn<span class="hljs-preprocessor">.edu</span><span class="hljs-preprocessor">.zafu</span><span class="hljs-preprocessor">.gradle</span>

import org<span class="hljs-preprocessor">.gradle</span><span class="hljs-preprocessor">.BuildListener</span>
import org<span class="hljs-preprocessor">.gradle</span><span class="hljs-preprocessor">.BuildResult</span>
import org<span class="hljs-preprocessor">.gradle</span><span class="hljs-preprocessor">.api</span><span class="hljs-preprocessor">.Task</span>
import org<span class="hljs-preprocessor">.gradle</span><span class="hljs-preprocessor">.api</span><span class="hljs-preprocessor">.execution</span><span class="hljs-preprocessor">.TaskExecutionListener</span>
import org<span class="hljs-preprocessor">.gradle</span><span class="hljs-preprocessor">.api</span><span class="hljs-preprocessor">.initialization</span><span class="hljs-preprocessor">.Settings</span>
import org<span class="hljs-preprocessor">.gradle</span><span class="hljs-preprocessor">.api</span><span class="hljs-preprocessor">.invocation</span><span class="hljs-preprocessor">.Gradle</span>
import org<span class="hljs-preprocessor">.gradle</span><span class="hljs-preprocessor">.api</span><span class="hljs-preprocessor">.tasks</span><span class="hljs-preprocessor">.TaskState</span>
import org<span class="hljs-preprocessor">.gradle</span><span class="hljs-preprocessor">.util</span><span class="hljs-preprocessor">.Clock</span>

class TimeListener implements TaskExecutionListener, BuildListener {
    private Clock clock
    private times = []

    @Override
    void beforeExecute(Task task) {
        clock = new org<span class="hljs-preprocessor">.gradle</span><span class="hljs-preprocessor">.util</span><span class="hljs-preprocessor">.Clock</span>()
    }

    @Override
    void afterExecute(Task task, TaskState taskState) {
        def ms = clock<span class="hljs-preprocessor">.timeInMs</span>
        times<span class="hljs-preprocessor">.add</span>([ms, task<span class="hljs-preprocessor">.path</span>])
        task<span class="hljs-preprocessor">.project</span><span class="hljs-preprocessor">.logger</span><span class="hljs-preprocessor">.warn</span> <span class="hljs-string">"${task.path} spend ${ms}ms"</span>
    }

    @Override
    void buildFinished(BuildResult result) {
        println <span class="hljs-string">"Task spend time:"</span>
        for (time <span class="hljs-keyword">in</span> times) {
            if (time[<span class="hljs-number">0</span>] >= <span class="hljs-number">50</span>) {
                printf <span class="hljs-string">"%7sms  %s\n"</span>, time
            }
        }
    }

    @Override
    void buildStarted(Gradle gradle) {}

    @Override
    void projectsEvaluated(Gradle gradle) {}

    @Override
    void projectsLoaded(Gradle gradle) {}

    @Override
    void settingsEvaluated(Settings settings) {}
}
</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li></ul>

然后将PluginImpl文件中的apply方法修改为

<code class="hljs cmake has-numbering">void apply(<span class="hljs-keyword">Project</span> <span class="hljs-keyword">project</span>) {
       <span class="hljs-keyword">project</span>.gradle.addListener(new TimeListener())
    }</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul>

完成后打包发布到jcenter()。之后你只要引用了该插件,就会统计各个task执行的时间,比如运行app,就会输出像下面的信息。

这里写图片描述

最佳实践的末尾,推广一下这个插件,这个插件我已经将其发布到jcenter仓库,如果要使用的话加入下面的代码即可

<code class="hljs matlab has-numbering">buildscript <span class="hljs-cell">{
    repositories {
        jcenter()
    }</span>
    dependencies <span class="hljs-cell">{
        classpath <span class="hljs-string">'cn.edu.zafu.gradle.plugin:time:1.0.0'</span>
    }</span>
}

apply plugin: <span class="hljs-string">'plugin.time'</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li></ul>

传递参数

上面的是小试牛刀了下,接下来我们需要获得自定义的参数。

首先按照上面的步骤新建一个module。新建PluginExtension.groovy,输入

<code class="hljs cs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> PluginExtension {
    def param1 = <span class="hljs-string">"param1 defaut"</span>
    def param2 = <span class="hljs-string">"param2 defaut"</span>
    def param3 = <span class="hljs-string">"param3 defaut"</span>
}</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>

然后我们希望能传入嵌套的参数,再新建一个PluginNestExtension.groovy,输入

<code class="hljs cs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> PluginNestExtension {
    def nestParam1 = <span class="hljs-string">"nestParam1 defaut"</span>
    def nestParam2 = <span class="hljs-string">"nestParam2 defaut"</span>
    def nestParam3 = <span class="hljs-string">"nestParam3 defaut"</span>
}</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>

然后新建一个CustomTask.groovy,继承DefaultTask类,使用 @TaskAction注解标注实现的方法

<code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CustomTask</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">DefaultTask</span> {</span>

    <span class="hljs-annotation">@TaskAction</span>
    <span class="hljs-keyword">void</span> output() {
        println <span class="hljs-string">"param1 is ${project.pluginExt.param1}"</span>
        println <span class="hljs-string">"param2 is ${project.pluginExt.param2}"</span>
        println <span class="hljs-string">"param3 is ${project.pluginExt.param3}"</span>
        println <span class="hljs-string">"nestparam1 is ${project.pluginExt.nestExt.nestParam1}"</span>
        println <span class="hljs-string">"nestparam2 is ${project.pluginExt.nestExt.nestParam2}"</span>
        println <span class="hljs-string">"nestparam3 is ${project.pluginExt.nestExt.nestParam3}"</span>
    }
}</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul>

只是做了拿到了参数,然后做最简单的输出操作,使用 ${project.pluginExt.param1}${project.pluginExt.nestExt.nestParam1}等拿到外部的参数。

别忘了在META-INF/gradle-plugins目录下新建properties文件指定插件的接口实现类。

复制之前新建的PluginImpl.groovy到包下,修改apply方法

<code class="hljs axapta has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">PluginImpl</span> <span class="hljs-inheritance"><span class="hljs-keyword">implements</span></span> <span class="hljs-title">Plugin</span><<span class="hljs-title">Project</span>> {</span>
    <span class="hljs-keyword">void</span> apply(Project project) {
        project.extensions.create(<span class="hljs-string">'pluginExt'</span>, PluginExtension)
        project.pluginExt.extensions.create(<span class="hljs-string">'nestExt'</span>, PluginNestExtension)
        project.task(<span class="hljs-string">'customTask'</span>, type: CustomTask)
    }
}</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul>

将插件发布到本地maven后,进行引用。

<code class="hljs matlab has-numbering">buildscript <span class="hljs-cell">{
    repositories {
        maven {
            url uri(<span class="hljs-string">'../repo'</span>)
        }</span>
    }
    dependencies <span class="hljs-cell">{
        classpath <span class="hljs-string">'cn.edu.zafu.gradle.plugin:test:1.0.0'</span>
    }</span>
}
apply plugin: <span class="hljs-string">'plugin.test'</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul>

定义外部参数,这里我们定义了param1,param2,nestParam1,nestParam2,此外param3和nestParam3保持默认。

<code class="hljs matlab has-numbering">pluginExt <span class="hljs-cell">{
    param1 = <span class="hljs-string">'app param1'</span>
    param2 = <span class="hljs-string">'app param2'</span>
    nestExt{
        nestParam1=<span class="hljs-string">'app nestParam1'</span>
        nestParam2=<span class="hljs-string">'app nestParam2'</span>

    }</span>
}</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul>

同步一下gradle,执行customTask。

这里写图片描述

上面的代码很简单,不用解释也能看到,所以不再解释了。



参考文章

源码

最后上本篇文章的源码
http://download.csdn.net/detail/sbsujjbcy/9451566


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值