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插件有更深的一些认识,当然,这还只是一些皮毛,更深层次的使用还需要大家去研究,谁有更好的资料和建议也可以评论提出,我们一起进步。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值