本節將學習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工程中的測試。