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