安卓內(nèi)存巨大為何還要殺后臺?

????????安卓是Google發(fā)起的,但現(xiàn)在安卓的一些行徑,連Google也看不下去了。很多OEM安卓機廠商,推行的安卓系統(tǒng)存在嚴重的殺后臺問題,App難以在后臺存活。
????????Google認為,現(xiàn)今很多OEM的安卓系統(tǒng)都違背了Google的政策,令App無法在后臺持續(xù)運行。雖然大多數(shù)安卓應用并不需要在后臺保留進程,但也有部分類別的確有此類需求,例如《健康記錄》App,需要持續(xù)記錄數(shù)據(jù)。然而,部分OEM安卓系統(tǒng)卻無法滿足此類需求,安卓開源項目AOSP的錯誤跟蹤器就曾經(jīng)揭露出某些OEM廠商濫用安卓機制,禁止第三方應用在后臺運行,甚至還殺死了Accessibility Service這個系統(tǒng)級別的無障礙服務進程。
????????Google實際上為安卓系統(tǒng)制定了殺后臺的規(guī)則,但OEM廠商們卻在這方面并不透明,開發(fā)者和用戶無法知道OEM安卓到底會殺掉哪些App后臺。有時候,OEM安卓廠商會將某些App加入白名單,例如部分社交和通信軟件,以確保消息的及時推送。但這些機制對于用戶和開發(fā)者來說,相當于黑箱,人們無法判斷到底哪個App能在后臺運行、哪個不能,最終的體驗并不如人意。
????????安卓基于Linux系統(tǒng),本身擁有完善的多后臺機制,在誕生之初其桌面級的“真后臺”是玩家津津樂道的賣點。近年來安卓機的內(nèi)存越來越大,甚至已經(jīng)量產(chǎn)的手機有18 G的容量,和桌面PC相比也不遑多讓。但為何安卓生態(tài)中,殺后臺的現(xiàn)象反而變嚴重了。
????????安卓系統(tǒng)激進殺后臺
????????原生安卓系統(tǒng)支持App后臺保留進程,但傳統(tǒng)上也有一套循序漸進的后臺退出機制。在傳統(tǒng)上,安卓系統(tǒng)會為App進程分配不同的狀態(tài),例如前臺應用(Foreground_App)、可見應用(Visiable_App)、二級應用(Secondary_App)、隱藏應用(Hidden_App)、內(nèi)容提供器(Content_Provider)、空應用(Empty_App)等狀態(tài)。當內(nèi)存不足的時候,系統(tǒng)會優(yōu)先終止Empty_App進程和服務,將內(nèi)存釋放出去;內(nèi)存再次吃緊,就開始對Content_Provider動手腳了,以此類推。
????????但并不是每個App都為進程注冊合理的狀態(tài),很多安卓App會通過一些手段,來修改自己進程的屬性,來長期駐留后臺。
????????例如,一些App用start Foreground來把自己注冊成為前臺應用,讓自己的后臺成為最高優(yōu)先級,永遠不會被系統(tǒng)干掉;又例如,有App會利用安卓的懸浮窗機制,設置一個1像素大小的透明懸浮窗,讓App始終處于激活狀態(tài),避免后臺被殺;又例如,流氓App們抱團取暖,后臺進程利用安卓系統(tǒng)的周期性任務進行鏈式喚醒,開啟一個App等于喚醒N個App的后臺……
????????App們的這些行徑,消耗了額外的資源,對續(xù)航和流暢的負面影響肉眼可見。
????????為此,官方的安卓系統(tǒng)也作出了一些應對。例如針對App亂注冊start Foreground狀態(tài),安卓7.0之后會在通知欄強制顯示“XX正在后臺運行”;又例如安卓收緊了懸浮窗權限,使用懸浮窗必須開啟相應開關;而安卓11則很大程度上限制了App之間的鏈式喚醒。
????????但道高一尺魔高一丈,安卓系統(tǒng)的很多限制后臺機制,需要App使用較高版本的Target API才能生效,而大量App仍使用老舊的開發(fā)規(guī)范,但用戶卻不可能拋棄其中的很多App。因此,App強行駐留后臺的行徑,對于用戶的負面影響是實打實的,既然Google官方安卓無法做到,那就只能由第三方安卓ROM來動手了———如果哪個牌子的安卓不做,就會在用戶中落下“又卡又熱又耗電”的壞口碑。
????????因此,OEM安卓們殺后臺,一個比一個狠。尤其是在國內(nèi),一些安卓ROM甚至默認定時殺后臺,即使RAM資源充足,絕大部分App也無法保留后臺進程。安卓ROM激進殺后臺的風氣就此產(chǎn)生。
????????App強行駐留后臺
????????安卓ROM激進殺后臺是“果”,而App以各種行徑強行駐留后臺則是“因”,而這一切的“根”又是什么恐怕和安卓的生態(tài)環(huán)境有關。
????????和蘋果不同,安卓最初并沒有提供App統(tǒng)一推送機制,這意味著每個App如果需要接收后臺消息,那就需要自行駐留進程,以隨時接收消息推送。不過這些年Google也對此作了改進,引入GCM/FCM機制,App可以調用Google服務框架GMS,通過Google的服務器實現(xiàn)統(tǒng)一的消息轉發(fā),App的消息推送可以由系統(tǒng)接管,整個過程App都無需保留后臺,體驗類似iOS。
????????然而,這一套機制并非是強制性的,如果App不接入GMS,甚至不上架Google Play,那么完全可以無視這一切。而這在國內(nèi)的應用環(huán)境下,GMS實際上并不可用,App自行駐留進程、接受消息推送就成為了必選項。
????????因此,國內(nèi)的安卓App使用了尤其多的手段,在安卓系統(tǒng)中駐留進程,這實際上很大程度是不得已而為之,當然也有商業(yè)上的考慮。而針對國內(nèi)App種種駐留后臺的手段,國內(nèi)的安卓ROM為了保證續(xù)航和流暢,又不得不采取了更多的一刀切殺后臺手段,這就造成了現(xiàn)今的情況。
????????Google整治安卓ROM殺后臺
????????安卓ROM整治了App后臺駐留,帶來了更好的續(xù)航和性能表現(xiàn)。然而對于用戶而言,這并不是體驗的全部。很多用戶就遇到了這樣的情況,使用某個App,例如音樂App聽歌,切到后臺一會兒,音樂就停了,因為系統(tǒng)把音樂App進程給殺了。但用戶可不知道這是系統(tǒng)做的,只會認為這是音樂App的毛病。一時間,這個音樂App就榮獲了差評。
????????Google在Play商店中觀察到了不少這樣的差評,而這顯然不是開發(fā)者的錯——在App駐留后臺越來越卷的風氣下,按照規(guī)范開發(fā)的App,后臺反而更容易被系統(tǒng)強行中斷,反映在用戶實際體驗上就是該App在后臺好端端就沒了,用戶覺得這App肯定有Bug。
????????開發(fā)者無端背鍋,而這問題顯然又不是開發(fā)者能解決的。Google不得已親自插手,來整治安卓ROM亂殺后臺的現(xiàn)象。目前Google正邀請第三方應用開發(fā)者提供反饋,想知道哪些手機品牌機型殺后臺嚴重,以便進行更加深入的調查。
????????由于眾所周知的原因,Google并不在國內(nèi)展開賬號相關的服務,國內(nèi)的安卓生態(tài)是和Google脫節(jié)的。因此,對于Google的相關整治,應該對國內(nèi)的安卓產(chǎn)品影響不大。
????????但是,也有不少國內(nèi)安卓廠商開展海外業(yè)務,在海外市場,Google的話語權舉足輕重。Google有可能對安卓廠商施加壓力,以讓安卓廠商改變系統(tǒng)的殺后臺策略。在這樣的背景下,國內(nèi)外的機型分別采用不同的殺后臺策略,就顯得很有必要了。在用于國外機型的國際版ROM中,安卓廠商應該重視Google的意見,對殺后臺策略進行一定程度的修改。
????????不過我們也要意識到,安卓ROM激進殺后臺造成的負面體驗,在國內(nèi)也是存在的。但目前國內(nèi)的安卓生態(tài)迫使安卓廠商出此下策,要如何改變現(xiàn)狀。
????????這兩年,工信部聯(lián)合了主流安卓廠商,共同推進統(tǒng)一推送聯(lián)盟。App接入了相關體系后,即可實現(xiàn)系統(tǒng)級推送,無需駐留后臺也可以接收消息。統(tǒng)一推送服務需要安卓ROM和App同時支持,好消息是,目前統(tǒng)一推送服務已經(jīng)覆蓋了華為、OPPO、vivo、小米等多家國內(nèi)品牌,相關標準與成果也將納入中國信通院與中國互聯(lián)網(wǎng)協(xié)會共建的中國移動基礎服務平臺(China Mobile Service,CMS)相關體系之中,并在2021年中國互聯(lián)網(wǎng)大會上正式發(fā)布。希望統(tǒng)一推送聯(lián)盟能一改國內(nèi)App駐留后臺的風氣,讓安卓ROM沒有激進殺后臺的理由吧。
????????總的來說,安卓ROM之所以如此激進殺后臺,是和安卓App的行徑息息相關的,而這一切的根源又是缺乏統(tǒng)一推送服務的安卓生態(tài)。隨著國外Google對安卓掌控力的加強,以及國內(nèi)統(tǒng)一推送服務的普及,情況有望得到改觀,希望安卓ROM和App們未來能有更好的用戶體驗吧。