背景
之前我們寫了一篇定義關(guān)于如何定義Gradle插件,有興趣的朋友可以看一下,今天我們就來簡單講一個自定義Gradle插件的實戰(zhàn)Android項目Module間資源沖突檢測的Gradle插件。對應(yīng)的使用方法和源碼已經(jīng)在GitHub給出Android資源沖突檢測插件
解決問題
具體我們的插件的作用是干什么的呢?這里簡單解釋一下,就是當我們的項目越來越大的時候我們會將項目拆分為多個Module,這個時候,每個Module里面都有自己的資源文件,包括圖片,文字,顏色,字體大小等。如果我們在多個Module里面定義了相同名字的資源,但是對應(yīng)的資源內(nèi)容不一樣,這個時候項目并不會出錯,但是當我們最終打包的時候多個Module中的資源只會留下一個,這樣我們想要的效果就會出錯。這個插件就是用來跑整個項目所有Module將有沖突的資源提取出來,目前只支持String,Color,Dimen,其他的會在后續(xù)補充。
實現(xiàn)方式
首先,我們先接著自定義Gradle插件的思路往下講,關(guān)于自定義Gradle的一些基本知識:
大家也可以查看:Gradle官方文檔。
或者查看我的上一篇:如何定義Gradle插件。
1、先定義一個我們自己的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、我們怎么去調(diào)用我們定義的這個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
}
這個是定義在我們需要使用我們自己寫的插件的Module對應(yīng)的Gradle文件里面的checkResources表示Task的名字,下面的是對應(yīng)的方法和參數(shù)。當然,在這個Gradle里面需要引用我們的插件apply plugin: '插件名字'
3、使用傳遞進來的參數(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就可獲取到,我們傳遞進來的參數(shù),task.doLast這一步表示我們里面的代碼執(zhí)行在Task的之后保證可以獲取到參數(shù),這里稍微講一下插件代碼的運行時機:
如果我們直接寫在apply()方法中的代碼是執(zhí)行的編譯期,也就是一開始就執(zhí)行了,是執(zhí)行在任何之前的。
task.doFirst {}雖然也是在Task之前執(zhí)行,但是它是在要執(zhí)行Task的時候先執(zhí)行doFirst里面的代碼。
task.doLast{}這個是執(zhí)行在Task執(zhí)行之后的。
4、怎么實現(xiàn)資源檢測。
這個代碼比較簡單主要是獲取所有module下對應(yīng)資源的文件,然后進行解析和比較,具體的代碼這里就不寫了,有興趣的朋友可以下載完整代碼Android資源沖突檢測插件
如何使用
首先我們要在項目最外層的build.gradle里面引用我上傳的項目
apply plugin: 'geekplugin'
其次加載其代碼
classpath 'com.geek.check:AndroidResourceCheck:1.0.0'
這里注意是calsspath具體和compile的區(qū)別大家可以Google一下
然后設(shè)置參數(shù),用來配置我們需要檢測的資源
checkResources{
checkString true
checkColors true
checkDimens true
}
最后就是運行這個插件
我們可以在項目的根目錄運行這個Task
gradle checkResources
如果我們有資源沖突文件,最后會在項目的跟目錄生成ResourcesError目錄,對應(yīng)的沖突文件在里面,大家可以查看。
總結(jié)
好了,這個插件大概就這么多東西,相信大家通過這個也會對自定義Gradle插件有更深的一些認識,當然,這還只是一些皮毛,更深層次的使用還需要大家去研究,誰有更好的資料和建議也可以評論提出,我們一起進步。