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