再写这篇文章之前我看了很多关于组件化的文章,但大多数都是讲了一些'玄而又玄'的东西?,对我这种菜鸟来说真是难而又难,但是咋办呢,这总要用到对吧,再难也要啃对吧。于是开始动手尝试,一点一点试错,总算有所得。
什么是组件化
说到组件化很多人会想到插件化,模块化,总是搞不明白三者之间的关系。随着功能和需求的不断增加和迭代,代码量也与日俱增,程序也会变得越来越臃肿,这时候就会将需求和功能按模块化进行划分,各司其职,而如何进行模块化划分这就是Android实施方案的两大主流组件化和插件化。
组件化和插件化
不管是组件化亦或是插件化都必须实现单独调试、集成编译、数据传输、UI 跳转、生命周期和代码边界这六大功能。组件化和插件化最重要的区别就是插件化在线上可以动态增加和修改模块,而组件化动态修改能力较弱,只能加载和卸载而非动态修改和增加。
如何取舍
插件化和组件化都是为了解决代码耦合性过高,代码冗余量大,代码方法数量超过65535等等。不管是组件化还是插件化都是将代码进行MultiDex分包管理。
如果你的APP需要进行大量的线上操作,增加和减少模块功能,如电商类APP或者广告类APP动态需求比较强烈,需要在线上进行增加和减少模块,那么插件化将是你最好的选择,而如果你的线上需求修改不大,或者几乎不在线上进行修改,线上需求弱那么组件化将是你最好的选择。
为什么组件化
1.Android Sudio改变了项目构建方式,不同以往和eclipse下的project、module进行了区分,而且AndroidStudio使用Gradle构建和加载类库让组件化变得十分方便和高效。AndroidStudio下主APP,BaseModule和NetWorkRequestModule一目了然
2.随着业务的开展,APP的需求和功能变得更为复杂,迭代越多代码量越大,耦合性越高,而组件化能对有效的减小代码耦合性,去除冗余代码。
最初APP结构
随着需求和功能增加APP结构
可以看到我们的APP耦合性非常严重(有少许夸张但是能说明问题),几乎达到了牵一发而动全身,而组件化能有效的解决耦合性高的问题
APP组件化后
APP组件化后所有业务都有路由转发不在相互依赖,达到解耦目的
优缺点
优点:
1.业务逻辑明了,清楚,解耦度高
2.每一个模块都可以单独运行,并进行单独调试,测试方便
3.各个模块相互独立,单独构建工程,减少Building等待,对程序员来说时间就是金钱
4.迭代频繁的业务模块进行组件化可以避免相互干扰,减少阻力
5.为新业务增加提供基础,无需在源代码上进行修改,避免不必要bug
6.降低团队成员熟悉业务成本
缺点
1.对公司只有一个开发者的人员来说并没有必要如此,拆分越细工作量越大(?)
2.工程小,业务块少的APP也无需完全组件化
如何使用
既然说了module也可以单独运行那么其实module本质就是一个Application,那么我们只需要在适当的时候让他变成Module或者变成Application就可以了。
if (isDebug) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
引用也是分简单
具体实施肯定没有这简简单单的两三行代码就可以搞定的,但这两句话道出了组件化分化的精髓,一个判断一个引用。至于如何实现以及其他各个方面需要注意的问题,我将会在下一篇文章里加以说明。也会详细写出实现步骤,敬请期待
发现问题
1.文件冲突
a.包冲突
b.资源名冲突
c.AndroidManifest中Application及配置冲突
2.各个模块之间通信
a.事件总线的选择(Eventbus,RxBus等)
3.页面跳转,路由的选择
a.ActivityRouter,ARouter,DeeplinkDispatch,OkDeepLink路由框架选择
总结
组件化是在APP实现中的一种APP之间耦合严重,关联性过强的解决方案,尤其在中大型商业项目中尤为常见,以上内容也仅仅是对组件化APP的一种思考,仅个人浅见。实现组件化并非一朝一夕能完成的,这需要长时间的打磨,沉淀,优化,各个人员统一协调,有固定的模式及规则,主要突出团队协作能力而非突出个人能力。
愿与君共勉
特别感谢