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