1.概述
目标:編寫一個Gradle插件,學習自定義Gradle插件。
功能:利用lint自動删除無用資源。
實作思路:先執行lint任務,通過解析生成的xml檔案,找到id為UnusedResources的檔案路徑,并周遊删除,輸出日志。
開發工具:Android Studio 2.4。
2.内容
2.1建立一個工程,再建立一個Module作為插件子產品,删除裡面所有檔案,建立src/main/groovy檔案夾,留下build.gradle,目錄如下:
因為是基于groovy開發,所有代碼檔案要以.groovy結尾
2.2配置build.gradle
加入該插件依賴的庫,設定group和version,使用maven倉庫,這裡配置了上傳到本地檔案夾
2.3建立CleanTask.groovy,自定義Task
必須要繼承DefautTask,并使用@TaskAction來定義Task的入口函數
2.4建立PluginExtension.groovy,引入外部參數
2.5建立CleanResPlugin.groovy,定義插件入口
2.6聲明我是一個Gradle插件,定義插件id
main檔案夾下建立resources/META-INF/gradle-plugins目錄,再建立me.denghui.cleaner.properties檔案,這裡me.denghui.cleaner作為id,應用到project時要使用。裡面的内容指向插件入口
2.7編譯并上傳到本地
打開右側Task清單,輕按兩下執行uploadArchives
2.8檢視本地倉庫
2.9使用該插件時的小插曲
配置完後,報找不到插件,原因是在定義CleanResPlugin.groovy,沒有加入包名,需要加入,該目錄下每個groovy檔案都要加入這句
2.10重新編譯并上傳,就可以引入使用了
在根目錄的build.gradle配置
buildscript {
repositories {
maven {
url 'file:///Users/Allen/repos/'
}
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0'
classpath 'me.denghui.gradle:plugin:1.0.0'
}
}
在工程app的build.gradle配置
apply plugin: 'com.android.application'
apply plugin: 'me.denghui.cleaner'
android {
// ...
}
// ...
lintCleaner {
lintXmlPath "${buildDir}/outputs/lint-results-debug.xml"
outputPath "${buildDir}/outputs/lintlog.txt"
}
2.11加入幾張無用的資源,指令行執行 ./gradlew cleanUnusedRes 或者在右側Gradle的Tasks中找到并輕按兩下執行
2.12檢視log和結果
我們發現删除了無用的資源!插件開發完成~
3.小結
功能簡單,但包括了外部參數定義,任務依賴執行,上傳任務等知識點。
具體代碼參見:https://github.com/DengHuiJun/lintcleaner