像微信、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相關功能界面時存在即可。