组件化是将一个庞大的工程拆分成多个模块,从而达到代码的解耦,业务分离,加速编译测试,同时解决多人开发的混乱等问题。
一:组件化和插件化有什么区别:
组件化的单位是组件(module)。
插件化的单位是apk(一个完整的应用)。
组件化实现的是解耦与加快编译, 隔离不需要关注的部分。
插件化实现的也是解耦与加快编译,同时实现热插拔也就是热更新。
组件化的灵活性在于按加载时机切换,分离出独立的业务组件,比如微信的朋友圈
插件化的灵活性在于是加载apk, 完全可以动态下载,动态更新,比组件化更灵活。
组件化能做的只是, 朋友圈已经有了,我想单独调试,维护,和别人不耦合。但是和整个项目还是有关联的。
插件化可以说朋友圈就是一个app, 我需要整合了,把它整合进微信这个大的app里面
其实从框架名称就可以看出: 组 和 插。
组本来就是一个系统,你把微信分为朋友圈,聊天, 通讯录按意义上划为独立模块,但并不是真正意义上的独立模块。
插本来就是不同的apk, 你把微信的朋友圈,聊天,通讯录单独做一个完全独立的app, 需要微信的时候插在一起,就是一个大型的app了。
插件化的加载是动态的,这点很重要,也是灵活的根源。
二:如何实现组件化
组件化需要考虑的功能:
- 代码解耦,如何将一个庞大的工程拆分成有机的整体
- 组件的单独编译调试和集成调试
- ui页面跳转
- 数据传输,因为每个组件都会给其他组件提供服务,那么主项目和组件,组件和组件之间的数据传输
- 代码隔离,组件之间还是直接饮用交互的话,那么组件之间根本没有做到解耦
1:代码解耦:将庞大的工程拆分成一个个独立module组件,其中主module负责拼装其他的业务组件,形成一个完整的APP, 把每个组件都会用到的功能封装一个组件中,比如网络库,BaseActivity,颜色值,工具类等等,把这些封装成一个Library 组件,其他所以的组件都依赖这个library组件,其他的可根据具体的业务需求进行拆分,一般来说,一些独立业务模块可单独 拆分出来,比如播放视频中,播放的功能和逻辑
2:组件的单独编译和集成调试:这是组件化较核心的功能,相信大家有遇到过,若项目很大,集成了很多第三方的东西,每次 修改点代码编译测试一次就需要很长时间,这严重的降低了我们的开发效率,实现对某个模块进行单独编译很好的解决了这个问题。在工程目录下的gradle.properties中设置一个isModule=true值,然后在主项目的module的builde.gradle中的dependencies{}中去判断这个值
if (!isModule.toBoolean()) {
implementation project(':homemodule')
implementation project(':readermodule')
implementation project(':sharemodule')
}
如果是false就添加其他的业务组件的依赖,如果是true,则表明业务组件是可单独编译的,不需要添加依赖,同样在每个需要单独编译组件的build.gradle中判断这个值
if (isModule.toBoolean()) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
同时在module main下和java文件同层级中创建一个runalone文件,文件名可随便命名,在runalone下创建一个AndroidManifest.xml文件,在这个AndroidManifest.xml中添加module单独编译时的入口,然后在build.gradle中的android下设置AndroidManifest.xml
sourceSets {
main {
if (isModule.toBoolean()) {
manifest.srcFile 'src/main/runalone/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
//集成开发模式下排除debug文件夹中的所有Java文件
java {
exclude 'debug/**'
}
}
}
}
这样,只要我们改变这个isModule的值,就可以在集成编译和单独编译进行切换,改变这个值后必须要在Rebuild Project一下
3:ui跳转和数据传输:由于我们需要代码隔离,也就是每个业务组件不能依赖其他的组件,但通常开发中,不同业务组件需要进行数据交互和页面跳转,这个可以通过阿里巴巴开源的ARouter路由实现,这也是组件化过程中最重要的部分了,ARouter地址 https://github.com/alibaba/ARouter,ARouter不仅能实现页面跳转,数据传输,还能获取Fragment的实例,和拦截器的功能,具体不了解的可看这个文档 https://www.jianshu.com/p/6021f3f61fa6。