玩转Android studio 插件开发、测试、JCenter库发布(3)

本节将学习android studio 插件的开发。
插件的开发,可以采用两种方式:

1、利用android stuido和groovy开发插件

利用android studio开发插件和前面依赖库的开发类似,唯一不同的是需要建立如下的目录:
– resources
| —– META-INF
| —– —-gradle-plugins
| —– ———-插件名称.properties
利用android studio开发插件,此处不再讲解。看完下面的内容后,结合前几节讲解的内容,我相信大家很容易利用android studio开发插件。

2、纯gradle开发插件

下面来讲解下纯gradle插件的开发

A、创建工程目录和脚本文件

创建目录plugin,并在里面创建build.gradle脚本文件,脚本文件的内容如下:

group = 'com.myplugin.gradle'
version = '1.0.0'

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

sourceCompatibility = 1.7

dependencies {
    compile gradleApi()

    testCompile 'junit:junit:4.12'
}

repositories {
    mavenCentral()
    mavenLocal()
}

首先定义group和version,其含义与前面讲解依赖库时的group和version含义相同,主要用于插件的引用。
然后应用了两个插件Groovy 和maven ,其中Groovy 插件可以使我们编写 Groovy代码,而Maven是一个仓库插件,用于插件的安装和测试。
接下来,定义了兼容java jdk版本1.7
下面接着定义了依赖库,gradleApi用于创建Gradle插件,而junit用于测试插件
最后定义了,使用本地Maven仓库

B、创建工程名称
在plugin目录下,创建settings.gradle,内容如下:

rootProject.name = 'demoPlugin'

C、创建插件
创建插件class文件DemoPlugin,文件路径为:
– plugin
| —– src
| —– -main
| —– —-java
| —– ——com
| —– ——–myplugin
| —– ————-DemoPlugin.java

DemoPlugin.java文件的内容为:

package com.myplugin;

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

public class DemoPlugin implements Plugin<Project> {
    @Override
    public void apply(Project project) {
        project.getExtensions().create("myDo", DemoPluginExtension.class);
        project.getTasks().create("demo", DemoTask.class);
    }
}

首先,需要说明的是gradle插件是gradle的扩展,要想插件正常运行,需要重写apply函数。
在apply(Project project)中首先定义了一个扩展类DemoPluginExtension.class和”myDo”,其中”myDo”用于使用该插件的用户,在build.gradle中定义的一个节点,而该节点中的内容与DemoPluginExtension.class中定义的成员变量一一对应(myDo节点中的内容可以不用覆盖DemoPluginExtension.class的全部成员变量)。
而这两处的作用为,当使用插件的用户,在build.gradle中定义了”myDo”节点后,该插件就会用”myDo”节点中的内容,覆盖DemoPluginExtension.class中与之相同的成员变量的值,否则默认采用DemoPluginExtension.class中成员变量的值。
接下来,定义了一个名叫demo的任务,而该任务的定义在DemoTask.class文件中。

D、定义插件的apply plugin 名称
在应用插件时,一般要采用如下的格式:

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

其中’groovy’和’maven’就是apply plugin 名称。而我们的插件的apply plugin 名称定义如下:
添加文件com.myplugin.demo.properties文件,文件的目录为:

src/main/resources/META-INF/gradle-plugins/com.myplugin.demo.properties

该文件的内容为:

implementation-class=com.myplugin.DemoPlugin

E、实现DemoPluginExtension.java和DemoTask.java
DemoPluginExtension.java文件的路径为:

src/main/java/com/myplugin/DemoPluginExtension.java

内容为:

package com.myplugin;

public class DemoPluginExtension {
    private String message = "Default Value";

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

DemoTask.java文件路径为:

src/main/java/com/myplugin/DemoTask.java

内容为:

package com.myplugin;

import org.gradle.api.DefaultTask;
import org.gradle.api.tasks.TaskAction;

public class DemoTask extends DefaultTask {
    @TaskAction
    public void myTask() {
        DemoPluginExtension extension =   getProject().getExtensions().findByType(DemoPluginExtension.class);
        if (extension == null) {
            extension = new DemoPluginExtension();
        }

        String message = extension.getMessage();
        HelloWorld helloWorld = new HelloWorld(message);
        System.out.println(helloWorld.getMsg());
    }
}

F、HelloWorld.java实现
HelloWorld.java文件路径为:

src/main/java/com/myplugin/HelloWorld.java

内容为:

package com.myplugin;

public class HelloWorld {
    private String message;

    public HelloWorld(String message) {
        this.message = message;
    }

    public String getMsg() {
        return message;
    }
}

G、测试
插件的测试文件为DemoPluginTest.groovy
路径为:src/test/groovy/com/myplugin/DemoPluginTest.groovy
内容为:

package com.myplugin;

import org.junit.Test
import org.gradle.testfixtures.ProjectBuilder
import org.gradle.api.Project
import static org.junit.Assert.*

class DemoPluginTest {
    @Test
    public void demo_plugin_should_add_task_to_project() {
        Project project = ProjectBuilder.builder().build()
        project.getPlugins().apply 'com.myplugin.demo'

        assertTrue(project.tasks.demo instanceof DemoTask)
    }
}

DemoTask的测试文件为DemoTaskTest.groovy
路径为:src/test/groovy/com/myplugin/DemoTaskTest.groovy
内容为:

package com.myplugin;

import org.junit.Test
import org.gradle.testfixtures.ProjectBuilder
import org.gradle.api.Project
import static org.junit.Assert.*

class DemoTaskTest {
    @Test
    public void should_be_able_to_add_task_to_project() {
        Project project = ProjectBuilder.builder().build()
        def task = project.task('demo', type:DemoTask)
        assertTrue(task instanceof DemoTask)
    }
}

H、工程的目录结构
插件工程的目录结构为:
plugin
|– build.gradle
|– settings.gradle
– src
|— main
| |—- java
| | —— com
| | ——— myplugin
| | |———– DemoPlugin.java
| | |———– DemoPluginExtension.java
| | |———– DemoTask.java
| | |———– HelloWorld.java
| – resources
| — META-INF
| ——— gradle-plugins
| – ————-com.myplugin.demo.properties
– test
|— groovy
| —— com
| ——– –myplugin
| |———— DemoPluginTest.groovy
| |—– ——- DemoTaskTest.groovy

I、插件的构建
构建命令为:

gradle build install

如图所示:
这里写图片描述

J、插件的使用
新建一个android studio工程来使用该插件,为了简单,我就建一个简单的gradle工程来演示了。
新建目录pluginTest,在该目录下新建文件build.gradle,文件内容为:

apply plugin: 'com.myplugin.demo'

myDo {
    message = "New Value"
}

buildscript {
    repositories {
        mavenLocal()
    }
    dependencies {
        classpath 'com.myplugin.gradle:demoPlugin:1.0.0'
    }
}

添加了myDo节点,根据上面的讲解,myDo节点会替换掉DemoPluginExtension中的默认的成员变量的值。还有一点,注意,此处采用的本地maven仓库测试,而Jcenter仓库的发布过程可以参考前一节的讲解。
执行命令:

gradle task

如下:
这里写图片描述

可以看到有一个demo任务
执行demo任务:

gradle demo

输出如下:
这里写图片描述

可以看到输出了我们定义的值,并成功应用了插件。
下面我们将myDo节点去掉,在看下输出。
build.gradle脚本为:

apply plugin: 'com.myplugin.demo'

buildscript {
    repositories {
        mavenLocal()
    }
    dependencies {
        classpath 'com.myplugin.gradle:demoPlugin:1.0.0'
    }
}

输出为:
这里写图片描述

关于android studio gradle插件的开发,就到此处吧,下一节讲解下插件在android studio工程中的测试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值