本节将学习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工程中的测试。