天天看點

使用AndroidStudio自定義Gradle插件

1.概述

目标:編寫一個Gradle插件,學習自定義Gradle插件。
功能:利用lint自動删除無用資源。
實作思路:先執行lint任務,通過解析生成的xml檔案,找到id為UnusedResources的檔案路徑,并周遊删除,輸出日志。
開發工具:Android Studio 2.4。
           

2.内容

2.1建立一個工程,再建立一個Module作為插件子產品,删除裡面所有檔案,建立src/main/groovy檔案夾,留下build.gradle,目錄如下:

使用AndroidStudio自定義Gradle插件

因為是基于groovy開發,所有代碼檔案要以.groovy結尾

2.2配置build.gradle

使用AndroidStudio自定義Gradle插件

加入該插件依賴的庫,設定group和version,使用maven倉庫,這裡配置了上傳到本地檔案夾

2.3建立CleanTask.groovy,自定義Task

使用AndroidStudio自定義Gradle插件

必須要繼承DefautTask,并使用@TaskAction來定義Task的入口函數

2.4建立PluginExtension.groovy,引入外部參數

使用AndroidStudio自定義Gradle插件

2.5建立CleanResPlugin.groovy,定義插件入口

使用AndroidStudio自定義Gradle插件

2.6聲明我是一個Gradle插件,定義插件id

使用AndroidStudio自定義Gradle插件

main檔案夾下建立resources/META-INF/gradle-plugins目錄,再建立me.denghui.cleaner.properties檔案,這裡me.denghui.cleaner作為id,應用到project時要使用。裡面的内容指向插件入口

2.7編譯并上傳到本地

使用AndroidStudio自定義Gradle插件

打開右側Task清單,輕按兩下執行uploadArchives

2.8檢視本地倉庫

使用AndroidStudio自定義Gradle插件

2.9使用該插件時的小插曲

使用AndroidStudio自定義Gradle插件

配置完後,報找不到插件,原因是在定義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中找到并輕按兩下執行

使用AndroidStudio自定義Gradle插件

2.12檢視log和結果

使用AndroidStudio自定義Gradle插件

我們發現删除了無用的資源!插件開發完成~

3.小結

功能簡單,但包括了外部參數定義,任務依賴執行,上傳任務等知識點。

具體代碼參見:https://github.com/DengHuiJun/lintcleaner