IM推送保障及网络优化详解(一):如何实现不影响用户体验的后台保活
對于移動 APP 來說,IM 功能正變得越來越重要,它能夠創建起人與人之間的連接。社交類產品中,用戶與用戶之間的溝通可以產生出更好的用戶粘性。
在復雜的 Android 生態環境下,多種因素都會造成消息推送不能及時達到客戶端。另外,不穩定的移動網絡也給數據傳輸的速率和可靠性增加了障礙。
本文詳解了網易云信 IM SDK 在應對弱網環境、移動端硬件限制以及 Android 復雜的生態現狀時的探索與心得.如何實現不影響用戶體驗的后臺?;?#xff0c;改善的長連接加推送組合方案,以及在弱網環境大數據傳輸的優化實踐。
帶著思考閱讀:
1.什么是 IM
2. IM SDK?如何實現不影響用戶體驗的后臺保活
3.如何做長連接加推送組合方案
4.如何在弱網環境下優化大數據傳輸
IM?的定義
IM 由兩個字組成:Instant,Messaging。即時性要求有新消息時能夠立即收到,如果程序在后臺,則要能立即收到推送通知。
通信則要求穩定可靠,系統不宕機,程序不崩潰,安全,傳遞消息時不會被攔截監聽,消息不丟,順序不亂,不重復,如果包含音視頻聊天,則要求延遲低,流暢不卡頓。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
要真正做出一套穩定可靠的商用級?IM系統,挑戰非常大。
第一個問題是消息推送。iOS?有 APNS 做推送,相當穩定。Android 本身也有 GCM 可以用,但是在國內有“墻”,直接就把GCM 等等 google 的服務全部擋在外面。為了實現即時穩定的消息推送,從易信時代開始,網易就開始研究,隨著時間的推移,困難和方法也在不停的變化。
對于 IM,當 APP 退到后臺,是必須還能夠收到新消息提醒的,沒有 GCM,怎么辦?在最初,唯一能做的,就是后臺運行了。這幾乎是接收推送的唯一途徑,就算是到現在,也是最主要的途徑。Android 從設計上,就是支持真后臺運行的,后臺運行的特性也是Android現在能如此成功的原因之一,但另一面,Android 長久以來一直擺脫不了的卡頓,耗電等壞名聲,后臺運行也拖不了干系。因此,系統對于后臺運行也不會放任自流。
APP?在后臺運行所面對的四大障礙
第一個障礙是 Android?的 LowMemory Killer 機制。手機的內存有限,當后臺運行的進程越來越多,內存剩余量也就隨之減少。當有一個新的 APP 想要啟動,如果內存不夠,LMK 機制就會啟動,從正在運行的進程中挑選一個清理掉,釋放出空間,然后新的 APP 就可以運行了。
LMK?有兩個尺度去評判。一個是進程優先級,優先級越低,被清理的可能性越大,另一個是內存占用,占的內存越多,被清理的權重自然也越大。
因為 LMK?機制的存在,雖然 APP 允許在后臺運行,但同樣也面臨隨時被清理的風險。因此,網易需要在被清理后及時的重新啟動。
第二個障礙是 alarm,鬧鐘,有循環鬧鐘和一次性鬧鐘兩種,在鬧鐘觸發后啟動對應的組件。
第三個障礙是在 Manifest?文件中靜態注冊的 Receiver,通過監聽各種系統事件,比如開機,網絡變化,mount/unmounts等,在這些事件發生時啟動組件,因為這種方式會造成在這些事件發生時系統容易卡頓,在7.0里面,Android 增加了限制。
第四個障礙是 JobScheduler,這是在5.0里面新增的,允許 APP 在特定事件發生時做一些動作,比如充電,切換到 wifi 等。
雖說無論怎么做,APP?終究免不了一死,但通過對照 LMK 的評判準則,還是可以降低 APP 被清理的概率的。第一個就是降低進程的內存占用。如果采用單進程的模式,由于進程中包含了 UI,Webview,各種圖片緩存等內容,內存必然會居高不下,降不下來。IM 軟件一般都會采用雙進程甚至多進程的策略,將 push 進程獨立出來,在 push 進程里只處理網絡連接和 push 業務,不參與任何其他業務邏輯,更不包含任何 UI。
?
以下是網易云信 Android SDK?的架構,按照分層的結構模式設計。最底下青色的一層是 push 層,他就是作為一個獨立進程運行的。他只負責處理網絡長連接的相關工作,比如安全加密,心跳,鑒權,封包解包等工作,所有業務邏輯都交給 UI 進程的服務模塊去做。來看一下云信 demo 的進程內存占用情況。上面一個是主進程,看第四列 PSS 的數據,內存占用是 50M 左右,下面一個是push進程,內存占用只有 10M 左右。當處于后臺時,push 進程被清理概率比 UI 主進程低很多。
(網易云信 SDK?架構)
降低被清理概率的第二個手段是提升進程優先級。先看這個例子,這是綠色守護的一個截圖,最上面是“暫不自動休眠”,因為這里列出的兩個 APP?的狀態都是工作中,對應的進程優先級是“可視進程”。但這兩個 APP 并沒有提供桌面小部門在運行,也沒有指示前臺服務的常駐通知欄提醒,事實上,他們就只是在后臺運而已。通常進程退到后臺后,其進程優先級類型就變成了較低的后臺進程,而不是這樣的“可視進程”,他們是通過什么方法來提升優先級,降低被清理概率呢?
(綠色守護截圖)
Android?在設計前臺服務上有一個漏洞,通過兩個服務配合就能創建一個隱形的前臺服務。這里有兩個已經啟動的 service: A?和B。先在A中調用 startForeground,提供一個 NOTIFY_ID , 然后 A 就變成前臺服務了,同時有了一個 ID 為 NOTIFY_ID 的常駐通知欄提醒,然后網易在B中也調用 startForeground,提供相同的 NOTIFY_ID, B 也變成了前臺服務,因為兩個通知 ID 相同,因此這一次就不會創建新的通知欄提醒了。然后再在 A 中調用 stopForeground,A 的前臺屬性被取消,同時,常駐通知欄提醒也會被移除,但是,service B 并不會受到任何影響,還是前臺服務,這是再把 A 停掉,進程就只剩下前臺服務 B 了,進程也變成了前臺進程,但用戶不會有任何感知。
正常來說,做了上面3步之后,進程就能夠比較穩定的在后臺運行了。
但在有些情況下,推送進程卻永遠起不來。跟蹤之后發現,除了系統能夠殺掉后臺運行的進程外,用戶也一樣是可以殺死進程的。用戶殺掉進程的方式有兩種,一種是在最近任務列表中將 app?劃掉,這種方式和系統殺掉進程效果相同。另外一種就是通過這里的 force stop,這種方式比系統清理更加徹底。不但 app 正在運行的進程會被清理,app 當前在重啟列表中的待重啟服務,注冊的各種鬧鐘,事件監聽組件等都會被移除,除非用戶在主動點擊或者系統重啟等外力,app 沒法再自己重新爬起來了。
在有些國內的像 MIUI?一類的 ROM 上,用戶從最近任務列表中將 app 移除,效果竟然也是 force stop 。正常來說,如果是用戶主動操作,app 本身也不應該再重啟了。但有些時候這個并不是用戶本意,況且,對于 IM 軟件來說,消息推送是一定要得到保障的,否則不明正確的吃瓜群眾們會覺得是軟件不行,連消息推送都做不好。
APP安卓進程?;畹暮棉k法
第一個是通過兩次 fork?加上 exec 的方式。兩個 fork 后,第一次 fork 的進程退出,第二次 fork 出來的進程就會被 init 進程領養。用戶此時再 force stop,因為這個進程復進程是 init,而不是 Zygote,因此不會被清理。由于這個進程還是從 android 進程 fork 出來的,帶有 android 運行時環境以及復進程的資源,所以內存會比較大,這里可以再通過 exec 命令,打開一個純linux 的可執行文件,開啟一個 daemon 進程,其內存占用大概只有100K+,對用戶也就完全無感了。利用這個后臺進程,可以定時的將 push 進程拉起來。此種方式只在5.0以下的系統中有效,在4.4及以上系統中,SELinux 特性是強制開啟的,exec 沒有權限執行,同時在5.0之后,ActivityManager 在做 force stop 以及移除任務時,只要是具有相同的 uid 的進程,就會全部清理掉,不再漏掉沒有虛擬機環境的進程。
最后一個后臺保活的手段是一個大殺器。因為前面所列的所有保活手段都不是那么保險,因此想出來這么一個互相?;畹姆绞?。當一個 APP?進程起來后,他就去掃描已安裝的應用列表,看看有沒有自己的兄弟姐妹,比如說同一個長的 APP,或者是集成了同一個 SDK 的 APP,如果有,就把這些 APP 都拉起來。這也就是現在比較出名的“全家桶”方案。雖說這種方法確實能夠帶來較高的后臺存活率,特別是那些大廠和應用廣泛的 sdk,但是這種方式對于用戶的傷害也非常大,如果有后臺推送的必要性,且不會對用戶體驗造成太大傷害時,此方式還可以使用,但如果只是為了推廣告,則會對用戶造成傷害,反過來,也可能會導致用戶直接卸載 APP。
現在各種手機管理軟件都會對這種全家桶喚醒方式做限制,特別是在 root?過的機器上,可以做到完全切斷這些喚醒路徑。同時,很多 ROM 也會自帶管理軟件,限制后臺運行和后臺喚醒,以便給設備換取更長的續航。在目前國內的 Android 生態環境中,無論采用什么方式,想要一直在后臺運行時越來越難了,需要重新想另外的辦法來保障消息推送。另一方面,作為開發者,也有義務為用戶提供更好體驗的軟件,而不是無休止的在后臺浪費用戶的資源。
關注更多技術干貨內容:網易云信博客
歡迎關注網易云信GitHub
歡迎關注網易云信官網
總結
以上是生活随笔為你收集整理的IM推送保障及网络优化详解(一):如何实现不影响用户体验的后台保活的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 聊聊WebRTC网关服务器2:如何选择P
- 下一篇: 三大技术突破,网易云信实现在线音乐教育极