像微信、qq、网易等app运行时都有多个进程在跑,而喜马拉雅甚至有4个,原因是?
推送(或者其他需要保持运行的功能)
由于c2dm已经结束,而且在天朝,gcm是不能用的,推送只能自己实现
国内网络的特殊性,使得我们再实现微信推送机制时,需要维持准确的心跳周期。如果一段时间没有活动,运营商便会将长连接断开以回收资源,这时服务器发消息给客户端就接收不到了。进一步研究发现,运营商网络的时间限制各个地区不同,有的地区有两分钟,有的地区有半个小时,这种情况是不可接受的。我们的解决方案是缩短心跳间隔,在网络运营商把客户端到接入点之间的连接断开之前,我再发送一次心跳,主动维持住这个长连接的活性。这个我们称之为长连接的保活。
1.GCM:Google Cloud Messaging
2.C2DM:Android Cloud to Device Messaging
Android运行时的择优置换机制,会选取占用资源最多的程序结束掉,而结果就是在用户手机运行APP比较多的时候,应用会被系统杀掉回收资源,消息收取不及时的问题就出来了。
微信的解决方法:
微信选择的,是轻重进程拆分的思路。通过在微信3.5版本时候做的架构重构,实现了不受功能增长、系统缺陷影响的稳定推送方案。
对比v1.x版本的微信客户端架构图,将右下角Network的部分用轻重进程分离的思想,独立到一个单独的进程(:push)中,而上面两个层级依然跑在微信的主进程(:worker)中。而对于有内存泄露问题的webview或者其他不频繁使用的功能,再把其分离到独立的工具进程(:tools)中。通过分离进程,微信第一次重构解决了系统因为微信资源消耗,主动干掉微信服务的困境。分离后的push进程内存占用以及被系统kill回收的几率大幅降低,而对于worker和tools进程,不再要求其一定存在,只在用户收到消息,或者进入h5相关功能界面时存在即可。