玩轉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工程中的測試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章