为什么要组件化?
随着项目不断的迭代 , 代码越来越臃肿 , 人员也越来越多 , 同时在一个 module 中共同开发 , 首先来说维护成本极高 , 不易管理扩展 , 现在就有了模块化的思想 , 把模块之间共用的代码(网络框架, 图片框架, 异步框架, 日志框架, 显示小部件 View 等),不同的功能。抽取成单独的 core module 和多个功能 module 。这样每个人负责自己的 module 开发,便于管理,协同开发。
当 module 越来越多,这又出现了一个问题,编译时间很长,为了解决这个问题,最后把每个 module 做成可配置,支持单独调试,大大的提升了开发效率。
模块化、组件化、插件化
模块化
在项目中根据不同的功能需求,和共用的代码抽取出来,形成单独的 module , 这就是模块化。
组件化
组件化是建立在模块化思想上的一次升级,一个变种。组件化本来就是模块化的概念,只是具有可变性,在线上环境是 module lib , debug 环境是 application 。组件化的单位是 application
插件化
其实插件化也是基于模块化的思想,将一个完整的工程,按业务划分为不同的插件,来化整为零,相互配合。插件化的单位是 apk , 可以实现对 apk 的动态加载,更新,比组件化更灵活。
如何实现组件化
在实现之前我们先来看下最终效果吧
目录结构:
效果:
1. 组件支持单独调试(application , lib 切换)
1.1 项目 build.gradle 配置是否需要单独调试环境
ext {
// extend
// false: 组件模式
// true :集成模式
isModule = false
}
1.2 module 中 build.gralde 配置
//根据isModule标签动态的切换 集成/组件模式
if (isModule){
apply plugin: 'com.android.library'
}else{
apply plugin: 'com.android.application'
}
android{
...
defaultConfig {
//资源配置
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'
}
}
}
}
...
}
切换之后就可以单独运行了。
2. 代码隔离
将不同业务代码抽离成单独的 module,然后在宿主 APP 中根据调试环境依赖。
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
if (isModule) {
//对代码跟资源进行隔离
runtimeOnly project(path: ':modulea')
runtimeOnly project(path: ':moduleb')
}
}
这里如果有人对依赖方式不了解的话,可以看下面这张表
3. 组件之间交互
这里用到了我的轻量级 LYEventBus 通信框架,如果想详细了解怎么使用和原理的可以看下我之前写的这篇文章轻量级 EventBus 框架,根据 TAG 发送接收事件
4. UI 跳转
UI 跳转框架这里我没有自己写,用的 alibaba 开源的组件化路由框架 ARouter
总结
到这里我相信大家对组件化已经有了一定的了解, 我们已经把组件化的模型搭建好了,现在可以根据自己的业务需求搭建一套属于自己项目上的组件化框架。
文章中所有代码已上传 GitHub LIUYKComponent