前言
现在市面上出现了各种很多的组件化方案,比较知名度高的有以下几种
- ARouter
- WMRouter
- ActivityRouter
- CC
其实不管出现几种,其实就只有两种形式的:
- 基于 Uri 设计的,包含了服务发现的功能
- 支持跨模块调用,然后实现代码自己写
CC 就是属于第二种,其他的都是属于第一种.其实 CC 这种形式倒是挺新鲜的.它通过 Gradle 插件在编译器扫描到每一个业务模块实现了特定接口的类(你可以理解到每一个业务模块的 Application)
然后在使用的时候,根据用户传入的 host(获取是 moduleName之类的) 找到业务模块下的特定方法,解析Action去做自己的事情
首先从技术的角度上,它的这种方式开始确实让我耳目一新,觉得是一个好东西.毕竟它做到了一件事情,就是除了帮助你跨模块的调用,其他的实现都是自己实现的.那么为什么我就不推荐你使用 CC 呢?往下看吧!
为什么否决 CC
CC 配置不简单
我觉得一个框架应该让配置尽可能的简单,让人配置起来方便并且能懂。但是 CC 我是真的没看出来
- 它配置的方式,我不说的话新人一脸懵逼吧?
随便对比一个其他组件化框架某个业务模块全部的配置
应该基于 Uri
组件化一般都是和 iOS 端同时提供,方便H5和后台针对 Uri 对移动端跳转的控制,而不是像 CC 一样自己玩自己的,有人说 CC 也可以支持跳转 Url 呀,把 Host和Path拿出来调用 CC不就行了吗?
这样说的人应该去了解下基于 Uri 的框架,一个基于 Uri 的路由框架,在路由方面肯定有比你好很多
CC 在很多目标界面需要 CC.sendCCResult
这截图是我在登陆界面截图的,它用于返回登陆的是否成功的信息,这样子发起的地方就能收到回调了
我感觉这段真的是整段垮掉,我一个登陆界面应该是干干净净的,登陆成功与否应该是通过系统的方式 setResult 返回,你不能要求我一定要写这句话,如果你觉得自己的界面能接受.那么对于系统或者第三方的界面呢?都是通过 setResult 返回信息给你的,你怎么把 CC.sendCCResult 放到不是你写的界面上?
而相反,其他基于 Uri 的框架,没有叫你需要对目标界面进行整改的
CC所谓的跨进程调用,渐进式组件化
CC 可以让你可以先运行一个包含完整代码的Apk到手机上,然后运行新开发的业务模块,因为单独运行速度很快,还可以支持跨进程调用主 Apk 中的实现,比如登陆功能在主 Apk,单独运行的那个 Apk 并不包含登录相关的代码,这点看起来很让人兴奋.但是你听我说明:
- CC 跨进程调用传递的是 json,难道你还会新建一个实体对象去接 json 吗?比如登录界面返回给你的 User,你肯定也是拿 User 去接,很明显 User 对象已经下沉如果你能开发新的业务模块了,那么你的基本的一些base或者实体对象已经下沉了.那么其实这时候你随便使用哪个组件化方案,其实拆分的速度都会很快,因为你只要保证切断每一个界面的联系和调用就可以移动相关的类到所属的模块了.可以优先移动那些使用频率高的业务界面,比如登陆相关率先移动到 User 模块下.那么后面开发的业务模块直接包含 User 业务模块模块即可单独运行.其实在我看来根本没有必要所以的跨进程调用
- 需要让开发者弄这些花里胡哨的吗?问问你自己,以前参加饿了么的技术分享,它们的测试运行包都是去平台上选择需要测试的业务模块然后平台会负责依赖选择的模块然后打出一个 Apk.如果有可能我建议你们去实现像大公司这样子的平台化,方便你我他
- 另外 AndroidStuido 不管更新,3.5中对热部署有了一个新的支持,我觉得 CC 这种跨进程的方式真的没必要了.害人害己,最主要是我建议是能贴近原生就贴近原生,我们要相信Google,能用最小的改动实现就ok
CC 中的事件总线
这件事情其实我没啥看法, CC毕竟是为了实现它的框架
写在最后
当然了方案的采取还得看你如何的思考,我也欢迎你们留言和我讨论.我写这篇文章,最主要的就是让它们慎重的用 CC,不要让一件简单的事情变得那么的复杂!真的没要。
如果你想选个稳定的改动最小的,我建议你从 ARouter 和 WMRouter 中挑选一个吧.各有特色,WMRouter中的页面拦截器设计的很好,我很喜欢.不懂的可以搜索一下 WMRouter
我自己呢参考了所有的组件化方案用了将近一年的时间也出了一个组件化方案,拓展了一些很好用的点
- 路由可手动取消
- 路由自动取消,当发起Fragment或者Activity销毁
- 零配置实现任何地方拿到目标界面返回的需要在onActivityResult拿的Intent
- 用户自定义的拦截器的实现方法和Callback回调方法都是在主线程,并且以Callback机制,让你可以在拦截器中做任何事情
- 把服务发现和Router跳转分开,Arouter,WMRouter等都是一起的,我个人认为分开更好
- 采取了WMRouter等框架设计的页面拦截器(具体怎么回事看wiki)
- Rx扩展库扩展完美结合了 RxJava2
对源码或者实现感兴趣的可以参考
Component
还有一个配套的AndroidStudio插件哦,帮助你快速的在目标界面和目标拦截器和使用的地方跳转
RouterGoPlugin
用得好的话请给我一个 star,谢谢,欢迎加我的QQ [email protected] 来讨论