后期我会面试50家互联网公司,不断总结完善和思考,写出一本完美的安卓面试书籍,大家支持我吗?
1、组件化和插件化区别:
1.1组件化开发:
(1)、组件化是将一个app分成多个Module,每个Module都是一个组件;
(2)、组件化在发布的时候,所有组件以lib的形式被主app工程依赖,并打包成1个apk,不支持动态加载。
插件化开发:
(1)、插件化是将整个app拆分成很多模块,这些模块包括一个宿主和多个插件,每个模块都是一个apk;
(2)插件化在发布的时候,可以将宿主apk和插件apk,分开或者联合打包,在运行时,宿主apk可以动态加载某个插件apk。
相同点:
(1)、两者都是为了使项目模块化解耦;
(2)、二者中组件或者插件都可以单独调试。
2、组件化的优点和缺点:
2.1组件化的有点
(1)、业务隔离;
(2)、单独以app运行能提高开发及调试效率;
(3)、组件化之后,很容易地实现一些组件层面的AOP,比如打开页面的时候进行异步数据加载;
2.2组件化的缺点:
(1)、每个组件都需要依赖公用库,会拖慢整体编译速度;
3、CC组件化原理
cc组件化中,组件之间通信采用了组件总线通信的方式,在组件管理类(ComponentMananger)中注册了所有组件对象,当请求某个组件服务时,ComponentMananger通过查找映射表找到组件对象并调用并返回结果,它支持同步异步调用组件和同步异步实现组件,并且支持跨app调用组件。
3.1、app内部调用流程是
app内部调用流程.png
当组件a需要请求组件b的服务时,它就通过cc去调用cm,然后cm查找路由表,找到对应组件,进行调用,最后将结果返回给组件a。
3.2、跨app调用流程
跨app调用流程.png
当app1中的组件a请求app2中的组件B的服务时,它依然是通过cc调用cm,cm路由表中不存在组件B,它会通过BroadReceiver+Localsocket和app2建立通信,然后app2中的cm去查找自身的路由表,如果存在组件B,就就行调用,然后将结果通过LocalSocke返回给组件a。
3.3、app内部,组件之间的具体调用流程
app内部组件调用流程.png
3.4、跨app调用流程
跨app组件调用流程
3.5、cc监控策略
在ChainProcessor开启拦截器链的之前是调用CCMonitor.addMonitorFor(cc);将此次调用流程加入到监控队列中。
在CCMonitor中维护这一个ConcurrentHashMap<String, CC>,并且使用minTimeoutAt记录ConcurrentHashMap中cc的最短超时时间,当ConcurrentHashMap不为时,就会开启一个监控线程去检测这个map中的cc,具体的过程就是监控线程先阻塞minTimeoutAt秒,然后去遍历map,超时cc从map中去除并调用cc.timeout,终止调用流程(设置将finished设为ture,每个拦截器调用chain.proceed之前会检测finished,如果为true就终止流程),然后在遍历的过程中筛选出队列中剩余最短的超时时间minTimeoutAt,再次循环检测。直到map为空,监控线程停止。(注意:当新加入的cc超时时间比minTimeoutAt小时,主动唤醒监控线程)。
网友评论