郭光園
近日,一個“照明彈”功能在安卓圈子里掀起了狂風巨浪。MIUI加入了照明彈功能,該功能可以把《安卓》APP在后臺的一舉一動暴露在用戶面前,很多人驚訝地發(fā)現(xiàn),為數(shù)不少的APP竟然會喚醒其他APP。例如只要你開啟《微博》APP,就會喚起《墨跡天氣》《百詞斬》《抖音》《云閃付》等APP,這就是大名鼎鼎的“鏈式啟動”。
大家都知道《安卓》APP很“流氓”,但如此的囂張行為還是第一次明明白白地看清。為什么《安卓》APP會普遍存在奇葩的鏈式啟動?這是國內APP獨有的嗎?下面就來談談這個話題。
鏈式啟動是剛需嗎
鏈式啟動的現(xiàn)象在上面已經(jīng)提到過了,毫無疑問這會給用戶體驗帶來很大的負面影響。在鏈式啟動機制下,開啟一個APP等于開啟多個APP,而這多個APP又會分別再開啟多個APP,簡直是無限套娃,硬件再好的手機,電量和性能也分分鐘被榨得一滴都不剩。
為了對付鏈式啟動,無論是Google的官方安卓,還是各大手機廠商自己的ROM,都做了不少舉措,例如國產(chǎn)ROM很早就開始限制APP相互喚醒,安卓新版限制了不規(guī)范API的調用令鏈式啟動使其難以實施,這次MIUI的“照明彈”也是為限制鏈式啟動所做的努力。
國產(chǎn)ROM很早就開始做鏈式啟動的限制了
可見,鏈式啟動其實非常不受用戶歡迎,而且手機廠商也一直對其深惡痛絕———畢竟這會為手機帶來卡頓、耗電的壞口碑。于是問題來了,為什么APP開發(fā)商會在產(chǎn)品中加入一個如此有個性的特性?這就得從安卓的推送機制說起了。
《安卓》APP想要向用戶推送消息,有2種途徑。
第一種是類似iOS的解決方案,Google為安卓準備了基于Google服務的GCM/FCM推送服務,APP不需要駐留后臺,只需要接入到GCM/FCM中,APP就可以借助Google服務器直接向安卓機推送消息。
第二種是APP自己駐留后臺,連接自己的服務器實現(xiàn)消息推送。
按理來說,第一種方案更省電,而且實現(xiàn)難度更低,畢竟不用花額外精力去實現(xiàn)后臺駐留———安卓會自動清理掉久不活躍的APP后臺,要讓APP進程駐留還是需要花點功夫的。
但偏偏Google服務在國內卻難以正常使用,國行安卓很多都沒有Google服務器框架,第一種方法直接就被抬出了場外。如果留意,可以發(fā)現(xiàn)某些國產(chǎn)APP的國際版和國內版本,使用的是不同的推送機制,例如微信在Google Play商店上的版本會使用GCM/FCM推送消息,而國內版則使用自己的后臺進程推送,就是受此影響。
在國內無法使用CGM/FCM推送的前提下,APP們不得不在后臺駐留進程,保持和服務器的連接、及時接收推送。然而正如前文所說,這一做法也是需要花費更多精力的,而且還存在限制,而鏈式啟動正是為了解決后臺駐留、消息推送的諸多麻煩出現(xiàn)的解決方案。從這個層面來說,鏈式啟動稱得上是國內APP們的剛需。
鏈式啟動如何解決APP推送問題
那么鏈式啟動是如何解決APP后臺駐留和消息推送的問題的呢?我們先來說說APP在后臺駐留進程會遇到的問題。
無論是原生安卓還是第三方定制ROM,都對APP后臺駐留問題采取了越來越嚴格的限制,一個APP想要單獨靠自己駐留后臺,變得越來越困難。過去APP所使用的透明懸浮窗、亂注冊狀態(tài)等手段,都不太好使,硬要駐留后臺的話,分分鐘就被系統(tǒng)揪出來在通知欄掛城墻。
在此情景下,APP們只能抱團取暖了———既然單個APP很難停留在后臺,那么APP之間相互喚起,那就容易多了!開啟一個APP后,就拉起另一個抱團的APP,那大家的進程都激活了,推送服務也就順理成章。
但APP們是怎樣抱團的呢?經(jīng)過觀察不少APP甚至會鏈式喚醒競品APP,這總不能是拉競品APP一把吧,這從商業(yè)的邏輯來看似乎行不太通。其實,絕大部分的鏈式喚醒,都是由于APP們接入了同樣的推送SDK。
APP弄一套自己的推送機制太耗費精力,因此市面上出現(xiàn)了為各個APP解決推送問題的方案。例如開發(fā)者熟知的友盟、極光和個推等,APP一旦接入了這些推送SDK,就會自帶鏈式啟動的特性。兩個風馬牛不相及的APP之所以相互喚醒,就是這個原因。
從體驗方面來說,這些推送SDK的存在,有時候反而會提升用戶體驗。如果沒有這些SDK,每個APP都必須想辦法讓自己的進程一直駐留后臺,幾十上百個APP同時運行手機哪受得了,發(fā)熱卡頓等現(xiàn)象不可避免,分分鐘身體變得好熱、好奇怪;而有了推送SDK實現(xiàn)鏈式啟動,很多APP可以不常駐后臺,打開某個APP時,其他APP才紛紛被喚醒并推送消息,雖然體驗還是不如CGM/FCM推送,也依然會壓榨性能和電量,但總比大家都一直擠在后臺好一些。
除此以外,某些APP產(chǎn)品會有DAU日活量的考核,鏈式啟動也可以幫助提高數(shù)據(jù),因此這機制還是很受某些商業(yè)APP歡迎的。
鏈式啟動是最終解決方案嗎
雖然鏈式啟動很有效,但這也并非是長久之策。
鏈式啟動依然會引發(fā)額外的性能消耗和發(fā)熱,為了實現(xiàn)推送服務這有點得不償失;
系統(tǒng)正對鏈式啟動采取了越來越多的限制措施,例如安卓限制了第三方SDK的使用,不少ROM也可以切斷鏈式啟動的途徑。
要怎么辦?要徹底解決推送的問題,《安卓》APP還是得走由系統(tǒng)進行統(tǒng)一推送這條路。所幸的是,雖然GCM/FCM在國內無法使用,但目前國內已經(jīng)出現(xiàn)了其他替代方案。
MiPush,這是MIUI中系統(tǒng)級別的推送系統(tǒng),只要APP接入了MiPush,那么它就可以利用MIUI的云服務器來推送消息,而無需駐留后臺。但只有在MIUI當中,它才能作為系統(tǒng)級別的推送機制存在,在其他ROM中則和其他第三方推送SDK類似。
統(tǒng)一推送聯(lián)盟。這是由工信部發(fā)起的項目,也是最有希望徹底解決國內APP駐留后臺現(xiàn)象的方案。統(tǒng)一推送聯(lián)盟得到了多家手機廠商的支持,華為、OPPO、vivo、小米、三星、魅族、nubia、百度、阿里巴巴、騰訊、京東和Google等手機廠商、互聯(lián)網(wǎng)企業(yè)都有參與其中。沒錯,連Google也以觀察員的身份加入了聯(lián)盟,這安卓統(tǒng)一推送聯(lián)盟官方背景十足。
得益于官方背書以及廠商們的積極參與,目前很多手機廠商如華為、OPPO、一加、小米、三星和中興等都完成了統(tǒng)一推送聯(lián)盟的適配。在未來,很有可能出現(xiàn)這樣一種情況———國行安卓機的ROM中都會內置統(tǒng)一推送的API,安卓APP們都使用該接口來實現(xiàn)消息推送。這樣一來,絕大多數(shù)的APP都沒有了必須駐留后臺的理由,鏈式啟動走下歷史舞臺指日可待。
簡單來說,鏈式啟動是當前安卓生態(tài)下,不得已而為之的推送機制導致的。雖然看起來喪心病狂,但主要還是因為形勢所迫,國內無法使用GCM/FCM,只有確立系統(tǒng)級別的統(tǒng)一推送標準后,才有可能杜絕鏈式啟動。而在此之前APP們估計一時半會是不會改了,希望統(tǒng)一推送聯(lián)盟能夠早日普及,為鏈式啟動畫上句號。