Android资源冲突检测插件

作者: Only凹凸曼 | 来源:发表于2018-01-11 22:43 被阅读276次

    背景

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

    相关文章

      网友评论

        本文标题:Android资源冲突检测插件

        本文链接:https://www.haomeiwen.com/subject/zbdwnxtx.html