组件化原理
组件化是在模块化的基础上,通过修改build.gradle的参数,使各个模块可以在library和application之间转换.
每个模块可以单独运行,开发好后组装在一起形成完整的apk
路由框架
使用组件化和模块化开发时,由于各个组件之间不能相互依赖(你依赖我,我又反过来依赖你),各个模块之间的通信成为了组件化的痛点.
为了解决这个问题,引入了路由框架
路由框架的原理是,在需要通信的文件上添加注释,编译时通过AbstractProcessor拿到注释和相关的文件,创建一个路由表,路由表记录注释(路由地址)和相应的文件信息.然后通过Apt动态生成一个类,封装路由表中的信息,其他的模块使用路由地址在这个Apt封装类中拿到路由信息,实现模块间的通信.
组件化的项目架构
分为app模块,base模块,模块1,模块2,路由框架模块
app模块是一个壳,base模块封装通用的基础功能,比如工具类,网络请求等等
模块一和模块2是模拟具体的业务模块
路由模块负责模块间的通信
build.gradle的配置
模块间通过build.gradle的配置来实现library和application之间的转化
首先创建一个config.gradle来配置一些全局的通用属性
ext{}代表全局的属性
isModule用来控制模块化和组件化之间的转换
android=[]用来配置每个模块的sdk版本和version版本
appId用来记录每个模块的包名,在转换为组件化之后,需要配置appId,不然无法当做一个application运行
supportLibrary表示兼容包的版本
dependencies用来表示v7包
然后再项目的build.gradle中通过apply from: "config.gradle"引入config.gradle,这样相当于将config.gradle中配置的属性黏贴到Project的build.gradle中,在项目的各个模块中就可以使用config.gradle中的属性了
然后再来看每个模块的build.gradle配置
首先看app模块,app模块是项目的入口,也是项目的壳,用来组装各个业务模块
apply plugin:'com.android.application'表示app模块是一个application模块
def cfg = rootProject.ext.android表示将config.gradle中配置的android = [] 中的属性,赋值给cfg
appId同理
然后在android{}中使用config.gradle中android=[] 和 appId=[]中的类容
在dependencies{}中,通过isModule来决定是否添加功能模块的依赖,如果功能模块处于application模式下,无法添加为依赖的
再来看base模块,base模块是通用功能模块
apply plugin:'com.android.library'表示base模块是一个library模块,可以供其他模块依赖
同时,library模块也通过api project(':router-core')依赖了router-core模块
再来看看功能模块,以module2为例
首先通过isModule来配置module2为library还是application
buildConfigField("boolean","isModule",String.valueOf(isModule))是将isModule配置进module2的BuildConfig文件中
applicationId appId['module2']如果是组件化,添加appId
sourceSets{
main{
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'
}
}
}
在组件化下,使用src/main/module/AndroidManifest.xml下的清单文件,这个清单文件里面配置了启动的Activity
同理 java.srcDirs 'src/main/module/java',src/main/java"表示,在组件化下,编译时会编译src/mian/module/java下的java文件