Android资源冲突检测插件
背景
之前我们写了一篇定义关于如何定义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插件有更深的一些认识,当然,这还只是一些皮毛,更深层次的使用还需要大家去研究,谁有更好的资料和建议也可以评论提出,我们一起进步。
作者:Only凹凸曼
链接:https://www.jianshu.com/p/9d2a047f2c22
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。