一步步自定義Gradle插件

AndroidStudio現在的構建工具都是采用的gradle,可能很多小伙伴都感覺比較神秘,今天我們來從零開始自定義一個自動輸出Lint報告的Gradle插件,Lint報告中可以初步檢查出我們程序中的一些問題,輸出HTML或者XML文檔。

廢話不多說,直接開始開車了。

1.自定義Gradle插件的方式

Gradle是采用Groovy語言,編寫Gradle插件主要有三種方法

1.build.gradle腳本中直接使用。這種方式就是直接在Android Studioapp moudle的build.gradle 中進行插件的編寫,優點就是不用再上傳插件到maven或者其它地方,項目就可以直接使用;缺點也是很明顯,就是只能在自己的項目中使用,不能復用,這個不是我們今天要說的。

  1. buildSrc中使用。這種方式需要在項目中新建一個model命名為buildSrc,這個目錄就用來存放自定義插件。然后在src/main中建立兩個目錄,一個就是存放代碼的groovy目錄,一個是存放自定義插件名稱的resources目錄。這種定義方式也是只能在我們項目中進行使用,不好復用。我們今天要分享的是最靈活的方式,也就是第三點。

3.獨立Module中使用。這種方式就是完全獨立開發一個Module,可以隨便用。

我們現在一步步來自定義這個Module。

2.自定義Module

2.1配置

首先打開IntelliJ這個神器,可以說是Android Studio之父了,然后按照下面配置新建一個工程。

新建Module.PNG

接著就是配置目錄了,和上面說的第二種方式其實一樣的,配置好的目錄如下,其中groovy目錄就是放置代碼的地方,resources里面放置的是一個配置文件,文件的名字com.juexingzhe.cleaner就是在用這個插件的地方需要的名字,比如apply plugin:'com.juexingzhe.cleaner'

配置目錄.PNG

上面配置文件內容,其實就是一個映射關系,找到我們定義的插件CleanerPlugin,com.juexingzhe.mobile是CleanerPlugin這個插件類所在的包名。
implementation-class=com.juexingzhe.mobile.CleanerPlugin

2.2 擼代碼

環境都配置好了,接下來肯定就是實現 com.juexingzhe.mobile.CleanerPlugin這個插件了,先貼出代碼我們再做解釋。當然groovy也是完全兼容Java的,所以小伙伴們看起來完全無壓力啊。
定義插件首先要實現Plugin接口,然后在apply方法中實現插件功能。
我們這里實現的就是輸出Lint報告,很簡單就是兩句話,首先定義文檔的輸出位置xmlOutput 。

class CleanerPlugin implements Plugin<Project>{
    @Override
    void apply(Project project) {
        project.afterEvaluate {
            project.android.lintOptions.xmlOutput = new File(project.buildDir, "lintResult.xml")
        }
        project.tasks.create('cleanTest', CleanTestTask)
    }
}

為了直觀感受,我添加了一個task,也就是cleanTest,這個Task就是打印幾句話,證明這個插件確實起作用了,不是我在忽悠小伙伴們。看下Task的代碼,因為我們這里要輸出Lint報告,所以要依賴lint這個task,也就是dependsOn "lint"這行代碼的作用,task的具體工作就是@TaskAction這個注解標注的方法中了,代碼就沒什么好解釋的了。

class CleanTestTask extends DefaultTask{
    CleanTestTask() {
        super()
        dependsOn "lint"
    }
    @TaskAction
    def testClean(){
        System.out.println("==================")
        System.out.println("Test Clean Task")
        System.out.println("==================")
    }
}

到這里我們插件的代碼工作基本就完成了,剩下最后一個問題,怎么用這個插件呢?當然就是上傳Maven等等的倉庫中了,這里為了方便我就上傳到自己的本地了。

2.3 上傳插件

上傳插件就是在這個Module的build.gradle中寫Task了,看下代碼,我就上傳到工程目錄的平級目錄中的repo目錄下了。

apply plugin: 'maven'
group = 'com.juexingzhe.mobile'
version = '1.0.0'

uploadArchives {
    repositories {
        mavenDeployer {
            //本地的Maven地址設置為D:/repos
            repository(url: uri('../repo'))
        }
    }
}

OK,代碼的工作就真正完成了,這回沒騙人。點擊下build就能看見我們定義的uploadArchives這個Task了。

上傳Task.PNG

點擊下這個任務就能在我們的目錄下生成這個插件。


插件倉庫.PNG

這樣我們的插件就完成了,接下來就是怎么用的問題了。

3.使用插件

首先在要使用這個插件的app目錄下的build.gradle中添加下面代碼:

1.apply plugin的名字就是上面我們在resources中定義的properties文件的文件名;

2.maven倉庫就是我們上面的倉庫地址;
3.就是添加依賴,其中com.juexingzhe.mobile就是group,juexingzhe就是上面插件工程的工程名,1.0.0就是版本號了,group和version都是在上面的gradle中定義了,module沒定義就默認使用工程名了。

apply plugin: 'com.juexingzhe.cleaner'

buildscript {
    repositories {
        maven {
            url uri('E:/code/repo')
        }
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath 'com.juexingzhe.mobile:juexingzhe:1.0.0'
    }
}

添加上面代碼后Sync一下就能看見我們的Task了:


cleanTest.PNG

到這一步就是大功告成了,點擊下這個Task就能執行出報告和打印日志了。


日志.PNG

然后在工程目錄app目錄下的build就可以找到Lint輸出報告了:
lint報告.PNG

我在工程中故意強引用了一些漢字,沒有定義到string資源文件中,就能報告出來:


lint報告內容.PNG

4.總結

其實定義插件沒有那么困難,語言也是完全可以用Java來編寫,插件還是有很多可以用的地方,比如我們定義的編譯期注解就可以使用插件的方式來處理,在編譯的時候運行我們的插件,完成信息的獲取等。
定義過程要注意配置的一些小細節,一步步設置好了就能正常運行出結果的。

后期還會再定義一個處理注解的插件,這個也是路由的前提。

今天開車就到這了,如果覺得還不錯,歡迎關注歡迎點贊哦。

最后感謝@右傾傾的理解和支持。

本文結!

歡迎關注公眾號:JueCode

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容