android组件化现在来说算是比较老生常谈的一种方式了,写此文主要是回顾+锻炼自己表达能力,主要描述下思想,具体的代码实现不做过多赘述,主要是仿照实现了ARouter的功能
常用的开发大体上来说分为了模块化,组件化,插件化,像模块化主要是将一些公共功能以及一些业务模块进行抽离,其实来说是适用大多数项目的,组件化以及插件化个人感觉比较适用于大一些的项目,团队与团队之间配合这样的,这里主要说下组件化的实现思想,插件化在后面再说
各个组件之间是没有直接联系的,但是可以共用一些图片资源,公共的业务以及一些工具类之类的存在,而组件化的好处是最终打包时可以快速选择要匹配进去的包,也可以快速替换,平时开发时则可以各个组件自己打包,能挺高打包效率
那么现在我们就需要解决两个问题了
1.怎么配置相互关系以及各自打包
2.模块间如何进行通信
现在我们先来解决第一个问题,我们知道android打包其实进行的task任务,是通过gradle来进行配置的,所以这里我们可以通过gradle来解决这个问题,因为像compileSdkVersion,minSdkVersion这些是通用的,所以我们可以统一抽离一下创建config.gradle
ext { //extend
// false: 组件模式 代表各个模块可以自己运行
// true :集成模式 只有一个主工程
isModule = true
android = [
compileSdkVersion: 28,
minSdkVersion : 19,
targetSdkVersion : 28,
versionCode : 1,
versionName : "1.0"
]
appId = ["app" : "com.tgp.routerapp",
"module1": "com.tgp.module1",
"module2" : "com.tgp.module2" ]
supportLibrary = "28.0.0"
dependencies = [
"appcompat-v7" : "com.android.support:appcompat-v7:${supportLibrary}",
]
}
用isModule来区分是单独运行还是打包进主工程中,我们平时创建一个类库或者工程项目的时候,可以看到apply plugin是不同的
if (isModule) {
apply plugin: 'com.android.library'
} else {
apply plugin: 'com.android.application'
}
同时,类库和工程的清单文件也是不一样的,所以我们需要根据参数判断引入哪个清单文件以及代码,这个在gradle的sourceSets中进行设置就可以了
//资源配置
sourceSets {
main {
//在组件模式下 使用不同的manifest文件
if (!isModule) {
manifest.srcFile 'src/main/module/AndroidManifest.xml'
java.srcDirs 'src/main/module/java', 'src/main/java'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
java {
//排除java/debug文件夹下的所有文件
exclude '*module'
}
}
}
}
所以我们用这个来区分就可以实现更改配置来解决第一个问题点了
接下来就是第二点的问题了,组件化中最主要的问题也是不同组件之间如何进行通信
这里就需要我们使用到java中的注解处理器来处理了,我们在ARouter可以看到我们使用的时候只是在添加了一些注解就可以实现相应的跳转操作,其实是我们标注了注解之后,注解处理器在编译器就把我们生成相应的代码去实现一些跳转功能,这里仿照实现的时候是存储了一个map集合中,那主要的key,value是什么呢?我们接着往下看
每个组件里面可能会有多个添加了注解的类,如果组件非常多的话,会越来越复杂,而查找的时候先直接通过module来是可以很快找到的,在一个组件里面的类中,会进行分组,可以按照不同的功能方向等来进行区分,也是方便更快的查找,所以我们可以看到
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
annotationProcessor project(':router_compiler')
implementation project(':base')
}
这样的配置存在,当然除了跳转,还有调用方法,接收字段这些都需要注解处理器来进行处理,在编译时就生成相关代码
这些就是搭建组件化的基本思路,有更好的方式的欢迎提供学习