安卓的後台機制既是安卓的一個優勢,也是碎片化很嚴重的一個特性,作為三款依賴安卓後台服務的App的開發者,寫下這篇文章來比較一下EMUI和MIUI這兩個最常見的安卓系統的後台處理邏輯,先把要比較的系統列一下:
- EMUI 10.0.0, Android 10
- MIUI 12.0.6, Android 10
比較後台機制的前提是兩個系統均使用缺省設置,不考慮諸如省電模式、極簡模式等特殊情況,這樣符合大部分用户的使用情況。
概述
常見的安卓App駐留後台方式有三種:
- 註冊系統服務,比如無障礙服務
- 使用安卓定時服務
- 常駐通知欄的前台服務,即Foreground Service
這三種後台模式,我都開發過相應的App,下面會分別舉例來比較。除此以後,還有一些匪夷所思,也非官方認可的謀取駐留後台的方式,比如播放一個無聲的音樂、開啓一個單像素的懸浮窗等等,畢竟不屬於正道,本文就不比較了。
在比較之前,有必要説明一下,對於現在各廠商安卓系統,比如我們要比較的EMUI和MIUI,僅僅按照這種正規方式註冊服務是不夠的,還是很容易被系統凍結或殺掉,原因是因為按正規方式註冊服務,所有的應用都可以做到,後台多了,加上一些應用沒有節制,手機就必然卡頓費電,所以廠商們的做法也很好理解,默認全殺,做一個只能手工配置的白名單,用户加入白名單才允許後台服務,這樣對於大部分普通用户,不用做任何設置就免受惡意軟件之苦。
需要注意,不同系統白名單配置稍有不同:
- MIUI 設置 》應用設置 》應用管理 》選擇應用 》 設置省電策略、自啓動
- EMUI 設置 》 應用 》 應用啓動管理 》 選擇應用 》 設置允許後台活動、自啓動
下面開始測試三種後台方式。
無障礙服務
我開發的微動手勢,就是一個典型的無障礙服務類應用,安卓系統支持應用註冊為無障礙服務,無障礙服務不僅提供了一種駐留後台的方法,其本身還提供了很多普通應用無法做到的功能,比如模擬系統交互、模擬手勢等。所以很多安卓App都藉助無障礙服務來完成某些功能,比如就連抖音App都提供了一個無障礙服務。
這裏就以微動手勢為例,安裝完成並打開無障礙服務,然後我分別測試以下四種情況:
- 默認:就是默認安裝後不做任何設置
- 加鎖:在多任務界面中給應用的卡片加鎖
- 白名單:在系統中將應用加入後台白名單
- 鎖+白名單:上面兩個都設置
每種情況下我進行四種操作測試,這四種情況都是用户常做的一些操作,然後判斷微動手勢的後台是否工作正常,四種操作分別如下:
- 鎖屏:鎖屏等一分鐘後再解鎖
- 劃卡片:直接在多任務頁面中劃去應用
- 一鍵清理:在多任務頁面中點一鍵清理
- 耗盡內存:通過啓動多個大型軟件或遊戲擠佔剩餘內存
測試結果,我繪製表格如下:
| EMUI | MIUI | EMUI(加鎖) | MIUI(加鎖) | EMUI(白名單) | MIUI(白名單) | EMUI(鎖+白名單) | MIUI(鎖+白名單) | |
|---|---|---|---|---|---|---|---|---|
| 鎖屏 | 正常 | 凍結 | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 |
| 一鍵清理 | 被殺 | 被殺 | 正常 | 正常 | 正常 | 被殺 | 正常 | 正常 |
| 劃卡片 | 被殺 | 被殺 | 被殺 | 被殺 | 正常 | 被殺 | 正常 | 被殺 |
| 耗盡內存 | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 |
我們仔細看下這裏的結果,明顯MIUI比EMUI的後台控制更嚴格,大概總結一下:
- MIUI認為用户操作優先於用户白名單,所以即使加入白名單,通過劃卡片依然將應用殺掉。
- EMUI認為用户白名單優先,只要加入白名單,用户即使劃卡片,後台都能正常保留,只將前台界面關閉。
兩種方式孰優孰劣,我不做評價,但顯然MIUI的方式,如果想保留後台,用户在設置白名單之後,還需要加鎖並小心避免劃卡片。提醒一點,如果你在系統裏同時為應用設置了允許自啓動,那麼一些後台應用在被殺之後會立刻重啓,也就是殺的效果變成了重啓。
定時服務
這裏説的定時服務是個統稱,指藉助安卓的某個"定時"API來實現一個定時運行的後台,安卓自己在這裏也很亂,前前後後提供了AlarmManager、JobSchedule、WorkManager等很多不兼容的API來支持後台的定時任務,我這裏統稱為定時服務,我開發的碎片記憶就是典型的定時服務,這是一個背單詞的應用,需要定時來檢查卡片是否需要複習,然後自動從後台彈出。
依然按上述測試方法,結果如下:
| EMUI | MIUI | EMUI(加鎖) | MIUI(加鎖) | EMUI(白名單) | MIUI(白名單) | EMUI(鎖+白名單) | MIUI(鎖+白名單) | |
|---|---|---|---|---|---|---|---|---|
| 鎖屏 | 正常 | 凍結 | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 |
| 一鍵清理 | 被殺 | 被殺 | 正常 | 正常 | 被殺 | 被殺 | 正常 | 正常 |
| 劃卡片 | 被殺 | 被殺 | 被殺 | 被殺 | 被殺 | 被殺 | 被殺 | 被殺 |
| 耗盡內存 | 被殺 | 被殺 | 被殺 | 正常 | 正常 | 被殺 | 正常 | 正常 |
從這個結果來看,定時服務相對無障礙服務,優先級要低一些,在某些無障礙服務仍然可以正常工作的場景下(比如劃卡片和內存耗盡),定時服務就被殺了,不過這次MIUI和EMUI表現的相對一致一些。
這裏有一點值得一提,安卓提供的定時機制裏,有一部分是允許應用被殺後依然能被定時喚醒的,但這樣的話,惡意軟件顯然可以利用這一點做到永生不死,所以像EMUI和MIUI這樣的系統對這種定時都做了額外的限制,這裏不再展開詳述了。
前台服務
Android的前台服務是一個術語:Foreground Service,表示用户可以感知到的後台服務,所以會在通知欄給出一個常駐通知,這是很多應用使用的後台機制,我開發的電池守護就使用了這個機制,通過這個機制,讓應用可以在後台獲取電量變化信息,從而對用户進行充電或拔除充電器的告警。
依然使用相同的測試方法,測試結果如下:
| EMUI | MIUI | EMUI(加鎖) | MIUI(加鎖) | EMUI(白名單) | MIUI(白名單) | EMUI(鎖+白名單) | MIUI(鎖+白名單) | |
|---|---|---|---|---|---|---|---|---|
| 鎖屏 | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 |
| 一鍵清理 | 被殺 | 被殺 | 正常 | 正常 | 正常 | 被殺 | 正常 | 正常 |
| 劃卡片 | 被殺 | 被殺 | 被殺 | 被殺 | 正常 | 被殺 | 正常 | 被殺 |
| 耗盡內存 | 被殺 | 正常 | 被殺 | 正常 | 正常 | 正常 | 正常 | 正常 |
從耗盡內存的測試結果來看,前台服務的優先級級似乎介於無障礙服務和定時服務之間,並且EMUI和MIUI依然有不小的差異。
總結
從上面的測試來看,無障礙服務、定時服務、前台服務幾種服務類型之間有微妙的差異。而且MIUI和EMUI的的處理也有不少的差異,從我測試的兩個版本看,MIUI更嚴苛一些,某些情況下EMUI不殺,MIUI會殺。對於開發者來説這是比較痛苦的事情,而對於用户來説,就更難理解這些細微的差異了。好在添加白名單和加鎖之後,基本上還是能保住後台,所以這類需要後台的應用,通常只能引導用户去做這些設置。
這個測試只對比了MIUI和EMUI,我相信谷歌原生、三星以及其他廠商還是會有更多的差異,安卓的碎片化可見一斑。