分享一个Android Gradle插件

前言:
不管什么平台的项目,采用何种语言开发,都是有项目架构的。打个比如,项目架构就像是一座高楼大厦的地基和框架,地基和框架搭好了,我们只需要添砖加瓦就行了,剩下的工作也就变得非常容易。
最近不忙了,就准备给大家分享一下自己搭建的一个新架构,个人觉得还是挺不错的,灵活多变,代码节省量高,很值得学习(哈哈,吹了)。

该项目架构采用了组件化,使用MVVM设计模式,Google官方的DataBinding+ViewModel+LiveData搭建而成,可以说不是很老套吧,还是值得一探究竟的。
项目要采用组件化的方式来构建,就免不了使用路由来中转,我在项目的初始版本使用了ARouter,大家应该都不陌生,也有不少相应的博客文章介绍及使用。ARouter功能强大,支持很多配置。但是,对于一般的项目而言,在开发中我发现其实用不了那么多功能,我只是想做个简单的页面跳转,或拿到对象而已。而且,每个Activity都需要定义并添加一个path注解,我觉得有些麻烦。所以,我想我们可以通过Class.forName()方法拿到类,也可以通过反射拿到对象,这样,只需要封装好基类和接口,我们就可以实现不同组件间的页面跳转和逻辑操作了。
Android项目在构建的时候会自动帮我们生成一个BuildConfig,包含一些配置信息,我们也可以自己在build.gradle里面使用buildConfigField()方法来添加一些常量。所以,我们依葫芦画瓢,生成一个自己的Config文件,在项目中拿到自己想要的class路径,CcpPlugin(Custom classes path plugin)插件便运用而生,它在BuildConfig文件生成后默认在同级目录下生成一个Config文件,目前主要功能是可以拿到项目中所有Activity的路径,可以配置包名,拿到某个包名下所有的文件路径,并可自定义配置文件名称。

  • 使用方法:
//项目的build.gradle中配置插件
buildscript {
    ext.kotlin_version = '1.3.31'
    repositories {
        google()
        jcenter()
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "gradle.plugin.com.zzming.plugin:ccpplugin:1.0.5"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
//在module的build.gradle中配置,一般配置在基类模块中,这样的话任意module都可以引用该配置文件
//需要在android{}配置之后引用
apply plugin: "com.zzming.ccpplugin"

ccpConfig{
    //配置文件的名称,默认为CcpConfig
    configName = 'ZzmConfig'
    //配置文件的路径,默认跟BuildConfig同一目录,一般不需要配置
    configFilePath = 'com.zzming.module.lib.core'
    //module集合,如果只有app则不需要配置
    moduleList = [
            'app',
            'module_lib_core',
            'module_user'
    ]
    //需要获取全路径的class,配置后会获取该包名下的所有的class,格式为:module名#包名
    classesPackagePath = [
            'module_lib_core#com.zzming.module.lib.core.pager',
            'module_homer#com.zzming.module.home.fragment',
            'module_user#com.zzming.module.user.fragment'
    ]
}
  • 生成的文件:

Config文件例子

既然能拿到Activity,Fragment,Pager等Class的全路径,我们就可以直接使用Class.forName()方法获取类来进行页面间的跳转,通过基类封装的方法拿到对象实现不同组件间功能的互相调用。
SO,给大家分享一下这个小插件,有兴趣的同学可以使用体验一下,有问题欢迎留言评论。
后续会跟大家分享个人封装的DEMO框架。

这篇文章早就写好了,由于2019年下半年发生了很多事,承受了很大的压力,所以本来计划的事情都延后了,希望2020年能够站起来走的更远。