1. 程式人生 > >Android資源衝突檢測Gradle外掛

Android資源衝突檢測Gradle外掛

背景

之前我們寫了一篇定義關於如何定義Gradle外掛,有興趣的朋友可以看一下,今天我們就來簡單講一個自定義Gradle外掛的實戰Android專案Module間資源衝突檢測的Gradle外掛。對應的使用方法和原始碼已經在GitHub給出Android資源衝突檢測外掛

解決問題

具體我們的外掛的作用是幹什麼的呢?這裡簡單解釋一下,就是當我們的專案越來越大的時候我們會將專案拆分為多個Module,這個時候,每個Module裡面都有自己的資原始檔,包括圖片,文字,顏色,字型大小等。如果我們在多個Module裡面定義了相同名字的資源,但是對應的資源內容不一樣,這個時候專案並不會出錯,但是當我們最終打包的時候多個Module中的資源只會留下一個,這樣我們想要的效果就會出錯。

這個外掛就是用來跑整個專案所有Module將有衝突的資源提取出來,目前只支援String,Color,Dimen,其他的會在後續補充。

實現方式

首先,我們先接著自定義Gradle外掛的思路往下講,關於自定義Gradle的一些基本知識:
大家也可以檢視:Gradle官方文件
或者檢視我的上一篇:如何定義Gradle外掛
1、先定義一個我們自己的Task,繼承DefaultTask,用來接收一些引數

public class GeekTask extends DefaultTask {
    private boolean strings;
    private boolean
colors; private boolean dimens; public boolean getStringFlag() { return strings; } @Input public void checkString(boolean flag) { this.strings = flag; } public boolean getColorFlag() { return colors; } @Input public void checkColors(boolean
flag) { this.colors = flag; } @Input public void checkDimens(boolean flag){ this.dimens = flag; } public boolean getDimensFlag(){ return dimens; } @TaskAction void sayGreeting() { System.out.printf("%s, %s!\n", getStringFlag(), getColorFlag()); } }

2、我們怎麼去呼叫我們定義的這個Task呢?

 @Override
    void apply(Project project) {
        GeekTask task = project.getTasks().create("checkResources", GeekTask.class)
}

其中checkResources是我們定義的Task的名稱,後面我們可以呼叫它。

checkResources{
    checkString true
    checkColors true
    checkDimens true
}

這個是定義在我們需要使用我們自己寫的外掛的Module對應的Gradle檔案裡面的checkResources表示Task的名字,下面的是對應的方法和引數。當然,在這個Gradle裡面需要引用我們的外掛apply plugin: ‘外掛名字’
3、使用傳遞進來的引數。

GeekTask task = project.getTasks().create("checkResources", GeekTask.class)
task.doLast {
            System.out.println(task.getStringFlag())
            if (task.getStringFlag()) {
               // do check string
            }
            if (task.getColorFlag()) {
                 // do check color
            }
            if (task.getDimensFlag()) {
                 // do check dimen
            }
        }

上面我們通過我們定義的task就可獲取到,我們傳遞進來的引數,task.doLast這一步表示我們裡面的程式碼執行在Task的之後保證可以獲取到引數,這裡稍微講一下外掛程式碼的執行時機:
如果我們直接寫在apply()方法中的程式碼是執行的編譯期,也就是一開始就執行了,是執行在任何之前的。
task.doFirst {}雖然也是在Task之前執行,但是它是在要執行Task的時候先執行doFirst裡面的程式碼。
task.doLast{}這個是執行在Task執行之後的。
4、怎麼實現資源檢測。
這個程式碼比較簡單主要是獲取所有module下對應資源的檔案,然後進行解析和比較,具體的程式碼這裡就不寫了,有興趣的朋友可以下載完整程式碼Android資源衝突檢測外掛

如何使用

首先我們要在專案最外層的build.gradle裡面引用我上傳的專案

apply plugin: 'geekplugin'

其次載入其程式碼

classpath 'com.geek.check:AndroidResourceCheck:1.0.0'

這裡注意是calsspath具體和compile的區別大家可以Google一下
然後設定引數,用來配置我們需要檢測的資源

checkResources{
    checkString true
    checkColors true
    checkDimens true
}

最後就是執行這個外掛
我們可以在專案的根目錄執行這個Task

gradle checkResources

如果我們有資源衝突檔案,最後會在專案的跟目錄生成ResourcesError目錄,對應的衝突檔案在裡面,大家可以檢視。

總結

好了,這個外掛大概就這麼多東西,相信大家通過這個也會對自定義Gradle外掛有更深的一些認識,當然,這還只是一些皮毛,更深層次的使用還需要大家去研究,誰有更好的資料和建議也可以評論提出,我們一起進步。