AndroidStudio現在的構建工具都是采用的gradle,可能很多小伙伴都感覺比較神秘,今天我們來從零開始自定義一個自動輸出Lint報告的Gradle插件,Lint報告中可以初步檢查出我們程序中的一些問題,輸出HTML或者XML文檔。
廢話不多說,直接開始開車了。
1.自定義Gradle插件的方式
Gradle是采用Groovy語言,編寫Gradle插件主要有三種方法
1.build.gradle腳本中直接使用。這種方式就是直接在Android Studioapp moudle的build.gradle 中進行插件的編寫,優點就是不用再上傳插件到maven或者其它地方,項目就可以直接使用;缺點也是很明顯,就是只能在自己的項目中使用,不能復用,這個不是我們今天要說的。
- buildSrc中使用。這種方式需要在項目中新建一個model命名為buildSrc,這個目錄就用來存放自定義插件。然后在src/main中建立兩個目錄,一個就是存放代碼的groovy目錄,一個是存放自定義插件名稱的resources目錄。這種定義方式也是只能在我們項目中進行使用,不好復用。我們今天要分享的是最靈活的方式,也就是第三點。
3.獨立Module中使用。這種方式就是完全獨立開發一個Module,可以隨便用。
我們現在一步步來自定義這個Module。
2.自定義Module
2.1配置
首先打開IntelliJ這個神器,可以說是Android Studio之父了,然后按照下面配置新建一個工程。
接著就是配置目錄了,和上面說的第二種方式其實一樣的,配置好的目錄如下,其中groovy目錄就是放置代碼的地方,resources里面放置的是一個配置文件,文件的名字com.juexingzhe.cleaner
就是在用這個插件的地方需要的名字,比如apply plugin:'com.juexingzhe.cleaner'
。
上面配置文件內容,其實就是一個映射關系,找到我們定義的插件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了。
點擊下這個任務就能在我們的目錄下生成這個插件。
這樣我們的插件就完成了,接下來就是怎么用的問題了。
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了:
到這一步就是大功告成了,點擊下這個Task就能執行出報告和打印日志了。
然后在工程目錄app目錄下的build就可以找到Lint輸出報告了:
我在工程中故意強引用了一些漢字,沒有定義到string資源文件中,就能報告出來:
4.總結
其實定義插件沒有那么困難,語言也是完全可以用Java來編寫,插件還是有很多可以用的地方,比如我們定義的編譯期注解就可以使用插件的方式來處理,在編譯的時候運行我們的插件,完成信息的獲取等。
定義過程要注意配置的一些小細節,一步步設置好了就能正常運行出結果的。
后期還會再定義一個處理注解的插件,這個也是路由的前提。
今天開車就到這了,如果覺得還不錯,歡迎關注歡迎點贊哦。
最后感謝@右傾傾的理解和支持。
本文結!
歡迎關注公眾號:JueCode