首頁>數碼>

不知不覺間 Android 陷入了一個關於「後臺」的怪圈:一邊各大廠商陸續推出了 12G RAM 的手機,另一邊你剛剛放到後臺的下載任務沒有如預期那樣後臺掛機下載,開啟微信發現還得陪啟動畫面的孤獨小人共賞藍色星球、按照教程辛辛苦苦做了半個小時的 Tasker 規則、卻沒有按照計劃自動執行……

於是一個耳熟能詳的句子開始在我們腦海中成型——我的後臺又被「殺」了。

應用開發者的「控訴」

如果你第二天早上醒來發現睡眠追蹤應用裡的記錄資料「一馬平川」,並不是因為你「睡得死」,而是睡眠追蹤應用根本就沒有正常工作。

遇到上述問題的人不止你一個,很多人選擇向這些應用的開發者反饋問題,殊不知問題其實不在應用本身。

Android 平臺著名睡眠追蹤應用 Sleep as Android 的開發團隊 Urbandroid Team 不堪其擾,索性上線了一個名為「別『殺』我應用」的網站,矛頭直指手機廠商糟糕的後臺管理機制。

Don't kill my app! 網站對 OEM 系統的評分

以三星為例,Urbandroid Team 稱,三星的部分機型在升級到基於 Android 9 的 One UI 後「殺後臺」現象變得尤為嚴重,自適應電池(Adaptive Battery)機制相比原生 Android 變得尤為激進,3 天內沒有啟動過的應用甚至無法從後臺再次啟動。最為糟糕的情況是,如果你安裝了一個可以自動跳過週末的第三方鬧鐘,那這個鬧鐘應用很有可能不會像系統鬧鐘那樣在下週一早上準時響起……

正如「別『殺』我應用」網站上控訴的那樣,擁有類似機制的還包括華為、一加、小米、華碩等等手機廠商的定製版 Android 系統,它們管理後臺的方式大同小異,但都秉承著 iOS 上那一套「劃掉就殺掉」的原則——當我們把某款應用的任務卡片從多工介面劃去,它們也就徹底從手機後臺中抹除掉了。

這裡你可能會問很多問題:

Android 執行記憶體越來越充裕,為什麼會有如此嚴重的「殺後臺」現象?原生 Android 也採用了一套類似的卡片多工互動方式,有什麼區別?Android 究竟需不需要藉助「一鍵清理」這樣的方式來釋放執行記憶體?

我們得從一些基礎的原理說起。

Android 的記憶體回收機制

在 官方文件 中,Google 將「不受應用自身直接控制的應用程序生命週期」描述為 Android 最為基礎也最為獨特的核心特性,這裡我們不妨將「應用程序生命週期」暫時理解為文章開頭和第一部分所說的「後臺」或「後臺程序(process)」。

所以 Android 應用的後臺程序去留本應是由 Android 系統來決定的。

當可用執行記憶體空間不足時,Android 系統會自行決定對特定應用後臺程序佔用的空間進行回收釋放,這個過程中 Android 揮舞著的那把大刀,叫做 LMK(Low Memory Killer)。那 LMK 又是如何判斷哪些應用可以被「殺」掉、哪些應用又該暫時放過的呢?

每個應用都有各種各樣的組成部分,其中特定元件的執行狀態共同組成了一套供 LMK 進行記憶體回收的「優先順序」參考,包括:前臺程序、可見程序、服務程序和快取程序。

一款應用通常會包含的程序型別

前臺程序、可見程序和服務程序往往與我們正在手機上執行的操作直接或間接相關,比如正在前臺供我們互動和操作的活動視窗(Activity)、正在通過廣播接收器(BroadcastReceiver)等待觸發的 Tasker 規則、正在後臺通過 Wi-Fi 網路自動上傳備份照片的 Google Photos 以及前面提到的有待觸發的鬧鐘等等。這些程序優先順序從高到低依次遞減,LMK 一般不會觸及。

快取程序則是那些暫時放在執行記憶體中的部分,也是和本文探討話題主要相關的重點。

在一個正常執行的(Android)作業系統中,快取程序應是記憶體管理機制唯一需要互動的部分:一個執行良好的 Android 系統通常會在執行記憶體中暫存多個快取程序以隨時呼叫,提高應用間的切換效率,同時對那些較為老舊的不活躍程序進行有計劃的回收。

只有在極端情況下,比如 Android 系統在回收掉所有快取程序後發現空閒記憶體依然不夠用(比如在低記憶體的「老爺機」上執行《崩壞 3》),這時 LMK 才會根據優先順序繼續對服務程序、可見程序和前臺程序採取回收策略。而當這些我們在正常使用中能夠直觀感受到的程序都不得不被被回收時,文章開頭提到的微信過載、音樂中斷、下載消失等等現象也就出現了。

誰動了你的後臺

在可用記憶體充裕的情況下遭遇「殺後臺」現象,一方面可能是 LMK 這把「大刀」出了問題(常見於 Android 9 時期的 Pixel 3 使用者),另一方面則有可能是其它規則額外干預了 Android 系統正常的記憶體回收機制。

這裡提到的「其它規則」主要有兩種形式,一種類似部分華為裝置上預裝的「省電精靈」,它會將所有沒有加入後臺白名單中的應用後臺統統清除,另一種則依託於 Google 推出的後臺檢查、後臺限制和自適應電池等功能進行「魔改」,讓這些功能的實際效果遠超預期,甚至達到意料之外的負面效果。

根據 Don't kill my app! 的統計,第二種後臺干預機制在三星、一加和早期的諾基亞機型中常見,這裡廠商們通常會用到一種類似「白名單」的方法來進行過濾。

以三星手機基於 Android 9 的 One UI 為例,除了微信、QQ 等國內常見應用,One UI 預設會為所有第三方應用關閉「允許後臺活動」這一選項,同時開啟「優化電池使用量」這一功能。

部分搭載氫 OS 的一加機型則將上面提到的應用程序進行拆分,除了基於原生 Android 的後臺限制、電池優化,還有一套名為「自啟動管理」的設定來對應用的自啟動進行管理以及一套名為「深度優化」的電池優化機制,後者會造成很多智慧手錶、手環裝置在一段時間後丟失與手機的藍芽連線,最終導致睡眠追蹤、運動記錄等等功能的失效。

氫 OS 的自啟動管理

問題在於上述功能埋藏較深,一般使用者在安裝應用後往往不會第一時間前往設定,一加的氫 OS 更是以系統更新之後自動重置部分使用者設定聞名,那些需要在後臺正常工作的應用,因此也被都被直接扔進了原生 Android 中用來限制「毒瘤」應用的「黑箱」裡。

換句話說,國內大部分定製 ROM 在後臺管理這件事情上都選擇採用一種「寧肯錯殺一千不肯放過一個」的做法。

關聯閱讀:控制頻繁啟動的「毒瘤」,Android 9.0 用這些方法讓你的手機更省電

多工管理還是後臺管理?

從某種程度上來說,中國產手機廠商在 Android 後臺管理上的做法雖然偏激,但它們都是國內特殊生態下的產物 。

一方面,儘管 Google 為 Android 設想了一套非常理想化的應用執行與後臺管理機制,但大多數於原生 Android 中行之有效的後臺管理機制在國內似乎都會變成「雞肋」。

如果 Google 有 100 種提升 Android 應用執行效率,保證後臺綠色、純淨的方法,國內毒瘤應用開發商就有 101 種繞過這些限制的方法。

藉助共用的第三方推送服務實現鏈式喚醒、藉助透明的懸浮窗保證後臺存活、通過不斷獲取定位的方式來避免程序被系統回收……不管是出於實現訊息推送這樣單純的目的還是為了不斷喚醒使用者裝置以實現 KPI 目標這種下作的行為,在國內 Android 生態中均有出現。

綠色守護專門針對鏈式喚醒推出的喚醒追蹤功能

雖然國內外的具體環境有所不同,但這類設計不規範的 Android 應用帶來的問題卻是一樣的,這類應用放在後臺不僅不會為我們帶來便利,反而還會因為頻繁喚醒裝置帶來不小的耗電問題。待機續航問題作為懸在中國產 Android 機頭頂的幾把利劍之一,手機廠商不得不各自從系統層面推出自家的應對機制——這就有了上面提到的各種偏激式的後臺管理方法。

另一方面,這裡還涉及到一個非常重要的概念區分:多工管理和後臺管理究竟是不是一回事?

國內 Android 生態由於早期受 iOS 影響較深,無論是開發商還是使用者都更傾向於把「將應用卡片從多工列表裡劃掉」的行為理解為清除對應用的後臺程序。在上面提到的特殊生態環境的影響之下,這裡被清除的後臺程序往往又包括那些用於保證應用後臺執行的可見程序、服務程序乃至前臺程序在內。

在酷安應用市場,甚至還有得以在原生 Android 上實現類似「劃掉卡片即停止執行」效果的應用,iOS 的後臺管理理念在國內有多麼深入人心可見一斑。

但這種後臺管理理念卻與 Google 對 Android 的多工管理設計方式相悖。Google 一直以來都將 Android 手機上撥出任務卡片的那個介面叫做 Recents,最近幾個版本的 Android 系統更是將其本地化為「概覽」。結合 Google 在 Android 9 和 Android 10 手勢互動上的變革,注重多工管理而非後臺管理的意圖也越發明顯。

當最近執行的應用以一張張卡片的形式呈現在我們面前時,Google 想要呈現的是一個能夠讓我們在不同任務間快速切換的多工互動,而在理想狀態下,後臺管理則是交由系統處理、完全不應被使用者感知的。

至於如何理性看待 Android 平臺的後臺管理,這裡我們不妨借用綠色守護開發者 @OasisFeng 在「Android 多工介面的劃除互動」這個話題上的 答疑 來回答這個問題:

Android 從 8.0 開始大幅度調整了應用的後臺控制策略……原則上,只要適配了 Android 8+ 的應用,就不能再持續在後臺佔據記憶體……至於耗電,這是一個需要平衡的取捨,你如果的確需要某個應用的後臺機制,那就得讓它略微耗一點電(不能既要馬兒跑得快,又讓馬兒不吃草吧)。如果你壓根不需要它的後臺機制,或者它的後臺耗電太過分了,那麼你可以在應用設定中限制應用的後臺能力(非原生系統可能不一定有這個選項)。總之,你並不需要「殺應用」,也沒必要為這些破事兒操碎心。

這種關注多工管理、將後臺管理主動權交還給系統的理念,隨著本月初 Android 10 的正式放出還將得到進一步強化——Google 將不再允許預裝 Android 10 的手機通過清除多工卡片的方式來終止後臺程序,這個要求同樣也被加入了 Google 的 CTS 認證流程。

換句話說,今後絕大部分需要在海外市場搭載 Google 服務上市的手機都必須滿足這個要求。

小結

就在上週三(9 月 25 日),醞釀已久的安卓統一推送聯盟正式宣佈收到華為、OPPO、一加和 realme 四家公司的進度確認,雖然 Google 的缺席也讓國內 Android 生態也變得異常複雜,但國內 Android 裝置也能用上的統一推送服務也算是終於邁出了具有實際意義的第一步。

只是距離轉變人們對 Android「殺後臺」這件事的看法依然還有很長的路要走。事實上,國內早在四五年前就出現過一次對「Android 需不需要『殺後臺』」問題的科普,但收效甚微,盲從 iOS 設計風格和互動邏輯國內 Android 廠商要負很大一部分責任。

希望靠譜、省電的統一推送系統能成為改觀的第一步,也希望 @OasisFeng 口中那個甚至可以跨越裝置重啟恢復「後臺狀態」的理想化生態早日到來——至於當下,我們依然只能見招拆招,遇到應用無法正常執行後臺任務時開啟手機設定仔細翻找、設定,把它們扔進白名單或是給它們的後臺卡片套個「鎖」……

最新評論
  • 1 #

    安卓糟糕的多工機制,導致被流氓軟體利用,反過來一些手機廠商通過修改rom許可權,寧肯錯殺一千不可放過一個,後臺任務統統殺掉,造成系統不卡頓,手機不費電的幻覺。而iOS就沒這麼多破事兒,app都老老實實遵守蘋果的開發規範(違規呼叫API會被下架),所以蘋果手機的APP就沒那麼多流氓。這也是很多人選iPhone不選安卓的原因。

  • 2 #

    不留後臺連資訊都收不到………iOS你只要啟動一次。資訊來了,自動推送。要不是因為這個我早就換android了。

  • 3 #

    最新的安卓根據6g來開發的,12g也預設6g來處理

  • 4 #

    意思說8G執行記憶體夠用了???老實說12G執行記憶體沒啥概念,最近看上一款12G執行記憶體手機,求解一下,謝謝。

  • 5 #

    ios“殺掉後臺”還能接受訊息是因為走的都是蘋果的服務後臺推送,安卓在國外也有類似的GMS,因為眾所周知的原因國內用不了,但是現在ovhh都已經逐漸加入到國內的統一推送平臺了

  • 6 #

    開發人員選項裡面把後臺程序調成標準限制就好多了,我測試了下開兩個遊戲退出10分鐘都沒殺

  • 7 #

    就算128g也會殺的,安卓後臺程序多的關不過來,佔記憶體不多但是佔系統資源,開發者選項裡只限制三方應用

  • 8 #

    殺後臺不可怕,可怕的是你後臺一直耗電

  • 9 #

    以前用安卓鬧鐘經常不響,後來我換了ios,然後鬧鐘就沒用了

  • 10 #

    國內不是那麼好推的,從應用商店來說,用誰的啊,各持一家,國外有Google play統一,國內魚龍混雜,感覺都是徒勞,反正加記憶體又能賺使用者的錢,何樂而不為。這一塊就是蛋糕,還指望別人捨棄

  • 11 #

    這就是為什麼安卓效率沒有ios高的原因之一了。

  • 12 #

    不管安卓還是蘋果都會被殺掉啊。。。有什麼區別嗎?難道現在的iOS13,你玩著就不被殺掉後臺???

  • 13 #

    開機記憶體佔一半,這就是深度訂製ui,美其名曰符合國人使用習慣

  • 14 #

    個人覺得安卓也該學蘋果,以後釋出手機就彆強調運存了。就寫明容量就好,運存越來越沒意義了。

  • 15 #

    統一推送聯盟居然沒有小米的進度,好吧

  • 16 #

    不殺後臺等著收集資訊和耗電嗎?用一次殺一次,不手軟

  • 雙11 神舟放大招,11代i7筆電直降1100?
  • 機情燴:魅族16T將於10.23日發 驍龍855+4500mAh 售價感人