Android資源沖突檢測(cè)插件

背景

之前我們寫了一篇定義關(guān)于如何定義Gradle插件,有興趣的朋友可以看一下,今天我們就來簡(jiǎn)單講一個(gè)自定義Gradle插件的實(shí)戰(zhàn)Android項(xiàng)目Module間資源沖突檢測(cè)的Gradle插件。對(duì)應(yīng)的使用方法和源碼已經(jīng)在GitHub給出Android資源沖突檢測(cè)插件

解決問題

具體我們的插件的作用是干什么的呢?這里簡(jiǎn)單解釋一下,就是當(dāng)我們的項(xiàng)目越來越大的時(shí)候我們會(huì)將項(xiàng)目拆分為多個(gè)Module,這個(gè)時(shí)候,每個(gè)Module里面都有自己的資源文件,包括圖片,文字,顏色,字體大小等。如果我們?cè)诙鄠€(gè)Module里面定義了相同名字的資源,但是對(duì)應(yīng)的資源內(nèi)容不一樣,這個(gè)時(shí)候項(xiàng)目并不會(huì)出錯(cuò),但是當(dāng)我們最終打包的時(shí)候多個(gè)Module中的資源只會(huì)留下一個(gè),這樣我們想要的效果就會(huì)出錯(cuò)。這個(gè)插件就是用來跑整個(gè)項(xiàng)目所有Module將有沖突的資源提取出來,目前只支持String,Color,Dimen,其他的會(huì)在后續(xù)補(bǔ)充。

實(shí)現(xiàn)方式

首先,我們先接著自定義Gradle插件的思路往下講,關(guān)于自定義Gradle的一些基本知識(shí):
大家也可以查看:Gradle官方文檔
或者查看我的上一篇:如何定義Gradle插件。
1、先定義一個(gè)我們自己的Task,繼承DefaultTask,用來接收一些參數(shù)

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、我們?cè)趺慈フ{(diào)用我們定義的這個(gè)Task呢?

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

其中checkResources是我們定義的Task的名稱,后面我們可以調(diào)用它。

checkResources{
    checkString true
    checkColors true
    checkDimens true
}

這個(gè)是定義在我們需要使用我們自己寫的插件的Module對(duì)應(yīng)的Gradle文件里面的checkResources表示Task的名字,下面的是對(duì)應(yīng)的方法和參數(shù)。當(dāng)然,在這個(gè)Gradle里面需要引用我們的插件apply plugin: '插件名字'
3、使用傳遞進(jìn)來的參數(shù)。

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就可獲取到,我們傳遞進(jìn)來的參數(shù),task.doLast這一步表示我們里面的代碼執(zhí)行在Task的之后保證可以獲取到參數(shù),這里稍微講一下插件代碼的運(yùn)行時(shí)機(jī):
如果我們直接寫在apply()方法中的代碼是執(zhí)行的編譯期,也就是一開始就執(zhí)行了,是執(zhí)行在任何之前的。
task.doFirst {}雖然也是在Task之前執(zhí)行,但是它是在要執(zhí)行Task的時(shí)候先執(zhí)行doFirst里面的代碼。
task.doLast{}這個(gè)是執(zhí)行在Task執(zhí)行之后的。
4、怎么實(shí)現(xiàn)資源檢測(cè)。
這個(gè)代碼比較簡(jiǎn)單主要是獲取所有module下對(duì)應(yīng)資源的文件,然后進(jìn)行解析和比較,具體的代碼這里就不寫了,有興趣的朋友可以下載完整代碼Android資源沖突檢測(cè)插件

如何使用

首先我們要在項(xiàng)目最外層的build.gradle里面引用我上傳的項(xiàng)目

apply plugin: 'geekplugin'

其次加載其代碼

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

這里注意是calsspath具體和compile的區(qū)別大家可以Google一下
然后設(shè)置參數(shù),用來配置我們需要檢測(cè)的資源

checkResources{
    checkString true
    checkColors true
    checkDimens true
}

最后就是運(yùn)行這個(gè)插件
我們可以在項(xiàng)目的根目錄運(yùn)行這個(gè)Task

gradle checkResources

如果我們有資源沖突文件,最后會(huì)在項(xiàng)目的跟目錄生成ResourcesError目錄,對(duì)應(yīng)的沖突文件在里面,大家可以查看。

總結(jié)

好了,這個(gè)插件大概就這么多東西,相信大家通過這個(gè)也會(huì)對(duì)自定義Gradle插件有更深的一些認(rèn)識(shí),當(dāng)然,這還只是一些皮毛,更深層次的使用還需要大家去研究,誰(shuí)有更好的資料和建議也可以評(píng)論提出,我們一起進(jìn)步。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,323評(píng)論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評(píng)論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,286評(píng)論 6 342
  • 前言 為什么需要學(xué)Gradle? Gradle 是 Android 現(xiàn)在主流的編譯工具,雖然在Gradle 出現(xiàn)之...
    真笨笨魚閱讀 1,595評(píng)論 0 0
  • 感恩~今天是值得喜慶的日子,是黨96歲的生日,也是香港回歸祖國(guó)20周年的日子。感恩我們能身處這個(gè)偉大的時(shí)代,生活安...
    毛毛細(xì)雨mmxy閱讀 293評(píng)論 0 0

友情鏈接更多精彩內(nèi)容