安卓世界的微觀搏殺,存活絕技有哪幾招?

摘要:超過百萬個安卓APP拼搶30億部安卓終端,安卓世界的微觀博殺已經到了近乎殘酷的地步。不瞭解不知道,一瞭解就嚇一跳。

文/寧川
圖片描述
(上圖爲Talkingdata 2016年10月8日監測數據)

安卓世界的競爭一向是異常激烈的。根據Talkingdata最新的2016年9月監測數據,中國現有移動智能終端41億多部,其中70%是安卓設備。而早在2012年的時候,全球安卓APP應用商店裏的APP數量就已超過了100萬個,如今規模又進一步擴大到150萬個左右。這麼多的安卓APP在拼搶接近30億部安卓終端,APP之間的微觀博殺已經到了近乎殘酷的地步。

除了拼搶市場、擴大用戶數量外,如何提升用戶的日活躍度和粘性,也是安卓APP的存活之道。對於移動APP來說,即時消息IM功能正變得越來越重要:推送消息能刷出APP的存在感;IM能強化人與人之間的連接,在社交類產品中的用戶與用戶間溝通可以產生出更好的粘性。因此,在提升用戶日活和粘性方面,即時消息IM的穩定性與可靠性非常重要。

不瞭解不知道,原來安卓後臺無時無刻不上演各APP之間拼搶系統和網絡資源、用各種方法絞殺其它APP的即時消息,從而提升自己存活機會的微觀大搏殺!究竟這個大搏殺激烈到什麼程度,在這個大搏殺中的存活絕招有哪些?

微觀搏殺之“內存殺手”

對於iOS來說,有 APNS服務做消息推送,系統相當穩定。對安卓本身來說,在國外也有Google的GCM服務可用,但在國內卻無法使用Google的服務。對於IM來說,當APP應用退到安卓後臺系統後,還必須能夠收到新消息提醒的。沒有GCM,怎麼辦?

在最開始的時候,唯一能做的就是保持APP的後臺運行了。但其實手機等設備的內存是拒絕後臺運行APP的,後臺運行了太多的APP會導致應用卡頓、不斷耗電、系統性能下降等問題。因此,安卓系統對於後臺運行的APP也不會放任自流。但後臺運行,卻是保持IM推送的幾乎唯一也是最主要的途徑。

APP想要在後臺保持運行,需要面對不少“殺手”。第一大殺手就是安卓的Low Memory Killer(LMK,“低內存殺手”)機制。因爲手機的內存畢竟有限,當後臺運行的進程越來越多,內存剩餘量也就隨之減少。當有一個新的APP想要啓動,而如果此時內存不夠了,LMK機制就會啓動,從正在運行的APP進程中挑選一個清理掉,釋放出空間。

LMK有兩個尺度去評判要“殺掉”哪個在後臺運行的APP進程。一個是APP進程優先級,優先級越低,被清理的可能性越大;另一個是內存佔用,佔的內存越多,被清理的權重自然也越大。

微觀搏殺之“用戶的劍”

除了系統LMK能夠殺掉後臺運行的APP進程外,用戶也一樣可以殺死進程。

用戶殺掉進程的方式有兩種,一種是在最近任務列表中將APP劃掉,這種方式和系統殺掉進程效果相同。另外一種就是通過Force Stop“強制停止”,這種方式比系統清理更加徹底。不但正在運行的APP進程會被清理,APP在重啓列表中的待重啓服務、註冊的各種鬧鐘、事件監聽組件等都會被移除,除非用戶再主動點擊或者系統重啓等外力,APP沒法再自己重新“爬”起來了。

此外,國內MIUI一類的ROM上,用戶從最近任務列表中將APP移除,效果竟然也是Force Stop“強制停止”。正常來說,如果是用戶主動操作,APP本身也不應該再重啓了。但有些時候這並非用戶本意,而且對於IM功能來說,一定要保障消息推送,否則會被不明就裏的羣衆誤認爲軟件本身有問題。

微觀生存之“全家桶”

在目前國內的Android生態環境中,無論採用什麼方式,想要一直在後臺保持APP的運行越來越難了。

爲了“生存”,當一個APP進程起來後,就去掃描已安裝的應用列表,看看有沒有自己的“同源兄弟姐妹”,比如集成了同一個SDK(開發工具包)的APP等,如果有的話就把這些APP“抱團”起來,互相保活、互相喚醒。這就是現在比較出名的“全家桶”方案。

雖說這種方法確實能夠帶來較高的後臺存活率,特別是那些大廠和應用廣泛的SDK。如果有後臺推送的必要性,而且不會對用戶體驗造成太大傷害時,此方式還可以使用。但如果只是爲了推廣告,則會對用戶造成傷害,反過來也可能會導致用戶直接卸載APP。

因爲“全家桶”實在是太令人討厭,現在各種手機管理軟件都會對這種喚醒方式做限制,特別是在root過的機器上,可以做到完全切斷這些喚醒路徑。同時,很多手機的ROM(只讀存儲器,帶有系統重啓軟件包)也會自帶管理軟件,限制後臺運行和後臺喚醒,以便給設備換取更長的續航。

微觀生存之“共享心跳”

傳統上,每個IM客戶端都會各自維護一條與服務器的長連接,各自的消息和信令都在這條長連接上傳遞,每個APP也獨自發送“心跳”信息、斷線重連等事情。

所謂“心跳”機制,最早用於服務器的安全備份,爲了防止服務器死機而在服務器之間週期性傳送簡短的“心跳”信息,一旦收不到對方的“心跳”信息,服務器可以接管對方的業務,避免業務的停滯。到了手機上,無論是安卓的原生應用,還是QQ、微博和微信,都採用了心跳機制,也就是APP終端定時嚮應用服務器發送簡短的信息。

各自獨立“心跳”的話,不同APP之間完全隔離、不會互相影響。但缺點也非常明顯,首先是做了很多重複的工作,造成了流量和電量的無謂消耗,第二是要保證所有的進程都能在後臺運行確實很艱難。

所謂“共享連接”,就是從衆多APP裏面選出一個當前正在運行的,或者是被殺概率最低的APP作爲總代理,由這個代理和服務器建立連接,手機上的所有其他APP都通過這個代理中轉與服務器通信。所有APP的消息都經過代理中轉,代理到服務器的連接是加密的,但到了代理這裏理論上可以看到其它所有APP的來往消息。因此,這種共享長連接的方式並不適用於IM。

存活絕技之“獨行俠”與“影子武士”

周江華是網易資深安卓開發工程師,先後主導參與了易信、網易雲信、網易七魚的客戶端開發工作,擁有非常豐富的功能開發以及代碼優化經驗。2016年9月23日,MDCC 2016中國移動開發者大會上,周江華介紹了網易雲信IM在應對弱網環境、移動端硬件限制以及Android複雜的生態現狀時的探索與心得。

周江華介紹說,雖說APP終究免不了一死,但通過對照LMK的評判準則,還是可以降低APP被清理的概率。第一個就是降低APP進程的內存佔用。如果採用單進程的模式,由於進程中包含了UI、Webview、圖片緩存等內容,內存佔用必然會居高不下。因此,IM軟件一般都會採用雙進程甚至多進程的策略,將push進程獨立出來——在push進程裏只處理網絡連接和push業務,不參與任何其他業務邏輯,更不包含任何UI。這有些“獨行俠”的意思。
圖片描述

(網易雲信Android SDK架構)

上圖爲網易雲信Android SDK架構,按照分層的結構模式設計。最底下爲push層,就是作爲一個獨立進程運行,只負責處理網絡長連接的相關工作,比如安全加密、心跳、鑑權、封包、解包等工作,所有業務邏輯都交給UI進程的服務模塊去做。再看一下雲信demo的進程內存佔用情況,push進程的內存佔用只有10M左右。因此,當處於後臺時,push進程被清理概率比UI主進程低很多。

降低被清理概率的第二個手段是提升進程優先級。實際上,安卓的前臺服務設計上有一個漏洞,通過兩個服務的配合就能創建一個隱形的前臺服務。也就是啓動兩個服務進程,每一個都賦予了同樣的進程ID,但在常駐通知欄中只有一個相應的進程ID,這樣一旦系統關掉一個進程ID的時候,儘管“殺掉”了一個前臺服務和相應的常駐通知欄進程,但還有一個隱形的服務仍在存在而且不會受到任何影響。這種“影子武士”的好處是,用戶不會有任何感知,但仍然能獲得“幕後”的消息保護。

存活絕技之“龍威鏢局”

前面提到了共享長連接的方式並不適合IM,但適當的優化仍然可以保障IM,這就是脫敏共享連接的方式:安全長連接加推送連接模式。

所謂“安全長連接加推送連接模式”就是每個APP在使用和真正傳遞數據時,仍然獨立使用自己的安全長連接,而當APP退到後臺一段時間後則斷開長連接,然後開啓一個推送代理,選擇其中一個與雲信的推送服務器建立連接。之後當APP有新消息時,就通過這個推送連接傳遞。這種情況下,APP可以控制發出的推送消息的安全級別。這種代理機制相當於給APP的消息傳遞找到了一個“鏢局”,既保證了消息的安全性,又保證了傳送的效率。

採用代理連接的方式,當推送消息到達後臺,如果是代理APP自己的消息就直接傳遞給APP即可,如果是其他APP消息,就發出一條通知欄提醒,等用戶點擊通知欄提醒後,纔會把目標APP喚醒。之所以通過通知欄提醒而不是直接喚醒APP,一方面是因爲直接喚醒可能會失敗,另一方面是如果喚醒而不使用就會導致無謂的電量消耗。

此外,現在國內的ROM中,華爲和小米的操作系統自帶推送系統且開放給了第三方APP。在華爲和小米的系統中,使用系統自帶的推送通道會更穩定、也更節省資源。因此在MIUI上,從長連接到推送通道的切換流程仍然和前述一樣,只是把消息轉發到MIUI的推送服務器,然後再傳遞給雲信的APP,華爲的推送系統流程也是一樣。

不過華爲和MIUI在推送的實現上略有區別,MIUI的通知欄提醒是在系統的推送代理裏完成,而華爲卻是將提醒通知交給APP去完成。另外,它們系統通知欄提醒的管理接口也有區別,在APP沒有被禁用的情況下,兩者都可以收到推送,而如果APP已經被禁用了,MIUI的通知欄提醒方式還可以將推送送達,而其它的推送方式則不能送達了。

突破弱網環境的三大限制

相對於PC的網絡環境,周江華總結手機網絡有3個特點:第一個是慢,尤其是2G、3G網絡,慢的令人髮指;其次是斷,手機跟着人不停的移動,網絡也不停的在切換,從wifi到移動網絡、從一個基站到另一個基站、從有信號到沒信號,都可能導致網絡中斷;第三是貴,只要看中國移動每天淨賺一個億就知道了。

在網易雲信整個通信系統中,有三種類型的連接,即TCP、UDP和HTTP。三種類型的協議對應了不同的業務應用:TCP主要是用戶長連接,也就是普通IM消息和信令的傳輸;UDP用於傳輸實時音視頻數據流;而HTTP則主要用在音頻、圖片等文件的上傳下載上。

對於長連接,可以採用開源協議,有成熟的解決方案、擴展性好、可讀性好,甚至還可以和其它系統互聯互通,但問題是協議文本普遍比較臃腫、冗餘字段很多,在昂貴的移動網絡裏自然就成本比較貴。網易雲信採用的是私有的二進制協議,以“0/1”方式表達的二進制協議完全失去了可讀性,但卻帶來極高的表達效率,相對於文本協議可以節省非常多的數據流量。此外,在判斷LBS地址、發出登錄請求、建立安全連接的協議握手等,可以通過並行和增量操作的方式,把登錄時間降爲原來的1/2到1/3、登錄的流量消耗也可以節省30%左右。

對於用於傳輸實時音視頻數據流的UDP協議,爲了提高弱網下的實時音視頻的通話效果,需要使用相關方案來做QoS質量保障;同時網絡層需要實時探測網絡狀態,作爲底層調整QoS策略的依據;還要回調上層,動態調整音視頻的碼率,做到音視頻碼率自適應。通過上面的QoS保障,實際測試在20%的隨機丟包弱網環境下,音視頻通話還能夠正常進行。網易雲信針對音頻和視頻,還採取了一系列的優化方法,以保證弱網條件下音頻和視頻的質量。

對於圖片和語音文件,網易雲信並沒有通過長連接收發,而是通過HTTP上傳下載。爲了提高HTTP分片上傳過程中網絡的利用效率,網易雲信也採取了有效的優化方法,把圖片文件上傳時間減少20%至30%,以及保證常規語音消息的正常發送和接收。

綜上所述:一直以來,提升消息推送達到率和到達速度、優化網絡利用效率、節省系統資源等,都是安卓系統開發的核心和基礎,而網易雲信IM SDK在不影響用戶體驗前提下,可實現後臺保活、改善長連接加推送組合以及優化弱網環境大數據傳輸。

雲信是如何成爲“技術俠”的?

網易在即時通訊領域已經有十多年的積累,從網易郵箱到網易泡泡再到易信,網易有多款用戶過億的移動端產品,這讓網易雲信擁有了豐富的移動端解決方案優化經驗。

在2014年底,網易重新組建了網易雲信團隊,請來了一流的產品團隊加入,並增加了商務與技術支持,以便全方位的爲客戶提供更加便捷和貼身的服務。網易雲信目前已成功發送超過1000億條消息,每日上億條消息100%到達。自2015年10月推出,網易雲信已經累積了7萬+APP,連接了2.4億用戶。

周江華介紹,網易雲信提供專業的“T服務”,一站式快速響應和解決開發者和用戶的問題。該服務體系包含網易雲信技術顧問服務體系、客戶顧問服務體系、用戶信任服務體系三大塊。網易雲信技術顧問團隊是業內唯一一家提供1對1、7×24小時即時響應技術支持服務的團隊,團隊成員均來自一線互聯網公司。

在用戶信任方面,網易雲信提供了故障賠償、郵件短信雙重預警、1月信用額度等保障服務。網易雲信特別成立了網易雲信用戶信任中心,把產品升級、專利技術、第三方機構雲認證等方面的信息同步公示給用戶,其中包括CSA STAR Certification、ISO27001信息安全管理體系國際認證在內的多項雲安全類認證服務及獎項,並確保用戶可享受到雲信的56項專利技術。

寶寶樹是目前國內最大的母嬰垂直網站,旗下的“寶寶樹孕育”、“小時光”、“美囤媽媽”三款APP均使用了網易雲信的聊天室+直播技術。在與競爭對手的PK中,網易雲信憑藉更小的包、不佔空間、技術支持響應快、聊天室性能好、穩定無異常等優勢,成功被寶寶樹選中。

學吧課堂是一個主打 K12 領域的遊戲化自適應學習的在線平臺,其IM使用場景主要在排行榜,可選擇排行高的學生,添加好友後進行私聊。同時,學吧課堂的教學白板、實時音頻、實時視頻也是用了網易雲信的技術。

總結下來,在安卓的微觀世界裏,網易已經拼殺了很多年。如今這些累積的IM“存活絕技”都通過網易雲信向外輸出,這無疑是開發者的福音。正如網易創始人的丁磊在9月20日“網易雲”整體發佈會上所說,“網易雲產品的推出,就是要解放全中國千千萬萬的程序員,讓他們過上錢多、事少、離家近的幸福生活”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章