應用退居后台,如何在低功耗的情況下保證任務正常運行?本文華為軟件功耗專家黃文將分享議題——應用后台功耗經驗。
本文將從安卓綠色聯盟功耗標准2.0、谷歌后台功耗方案、華為后台功耗方案以及開發者資源使用建議和檢測工具五大方面進行全面講解。
安卓綠色聯盟功耗標准2.0
《安卓綠色聯盟應用體驗標准2.0---功耗標准》詳細介紹了應用后台軟資源和硬資源的使用標准,查看詳情請訪問安卓綠色聯盟官網。
谷歌后台功耗方案
谷歌從Android M開始着力改善終端的續航表現。Android版本在演進中主要提供如下幾個方案。
1.后台位置限制:
對后台應用獲取用戶當前位置的頻率進行限制。
相關鏈接:https://developer.android.google.cn/about/versions/oreo/background-location-limits
2.后台服務限制:
限制應用在后台運行服務,並禁止應用通過隱藏/不可見方式調用 CPU 或網絡資源。
相關鏈接:https://developer.android.google.cn/about/versions/oreo/background#services
3.后台限制:
當系統檢測到應用出現不良行為時,系統會向用戶詢問是否要限制該應用在后台訪問設備資源。
相關鏈接:https://developer.android.google.cn/topic/performance/background-optimization#bg-restrict
4.谷歌后台功耗方案-Doze(低耗電模式和應用待機模式)
谷歌在Android M版本引入了Doze方案,此方案主要針對后台應用在沒有活動的情況下做某些限制。設備未充電且屏幕關閉處於空閑狀態一段時間后,系統會進入低耗電或者應用待機模式,對應用行為施加相應限制。
相關鏈接:https://developer.android.google.cn/about/versions/marshmallow/android-6.0-changes#behavior-power

如圖所示,以下是Doze模式各狀態說明:
ACTIVE: 設備活動態
INACTIVE:設備不活躍(滅屏、不運動) 等待進入idle.
IDLE_PENDING: 設備准備進入下一階段
SENSING: 傳感器檢測設備是否運動
LOCATING: 設備位置變化.
IDLE: 設備進入idle,並盡量長時間保持該狀態
IDLE_MAINTENANCE: 退出idle進入“維護期”
谷歌還引入了Light-Doze(Android N)和Deep-Doze(Android M)的概念,具體內容如下:

5.應用待機群組
應用待機群組對應用進行分組管理,不同的分組享有不同的權限設置,杜絕了對應用一刀切的現象。
相關鏈接:https://developer.android.google.cn/preview/features/power#buckets
應用待機分組:
1)活躍 (Active): 應用正在被使用
2)工作 (Working set): 應用使用頻率很高
3)常用 (Frequent): 應用經常但不是每天被使用
4)極少 (Rare): 應用偶爾被使用
5)從不(Never):安裝后一次都未被使用過的應用
分組策略:

調試:
通過adb命令將應用手動划分至某一待機群組。輸入以下命令,更改群組:
$ adb shell am set-standby-bucket packagename active/working_set/frequent/rare
輸入以下命令,查看應用所處群組:
$ adb shell am get-standby-bucket [packagename]
為促進用戶體驗,谷歌對應用在后台狀態下的建議如下:

華為后台功耗方案
1.華為的功耗方案,主要是在谷歌的基礎上對應用的異常行為進行監控,通過智電機器人,識別后台應用的行為是正常耗電還是異常耗電。
2.華為的優化分為主動優化和異常防護。
主動優化在谷歌運行方案的基礎上增加了冷凍方案,應用退到后台后,在沒有用戶可感知狀態和活動下,將應用所占用的資源包括CPU、軟硬件資源等全部暫停。一旦應用需要運行,資源會啟動恢復流程,這就是主動優化。
華為的盾防系統會監控所有后台資源消耗情況,在用戶未感知的情況下,一旦資源消耗超過華為功耗紅線標准,便會發出高耗電提醒,這就是華為的異常防護。
具體紅線標准請參考《安卓綠色聯盟應用體驗標准2.0---功耗標准》,標准包括持鎖阻止系統休眠、alarm頻繁喚醒系統、后台CPU高負載耗電、長時間網絡定位等。
3.華為低功耗Power kit包括PUSH+NC和Bastet鏈路托管技術。
應用推送遠程通知,可以使用華為PUSH NC。
相關鏈接:
https://developer.huawei.com/consumer/cn/service/hms/pushservice.html
應用保持長鏈接,可以接入華為鏈路托管技術Bastet.
相關鏈接:
https://developer.huawei.com/consumer/cn/devservice/doc/30401
開發者資源使用建議
1.定時任務
推薦綠色機制:
- 本地高頻任務,建議使用Handler機制;
- 本地低頻定時任務,建議使用AlarmManager的set()和setInexactRepeating()方法分別處理單次和循環多次的調用;
- 特定條件(網絡、充電),可延遲定時任務,推薦JobScheduler/WorkManager。
2.網絡
推薦綠色機制:
- 避免頻繁、零散的網絡請求,推薦統一批量網絡請求;
- 避免在低電量、弱網絡、移動網絡執行過多的網絡請求,在充電、wifi網絡下進行大數據量請求;
- 應用離開界面或進入后台及時關閉不再使用的TCP鏈接,避免出現大量未關閉狀態TCP鏈接。


3.Wakelock
推薦綠色機制:
- 確保喚醒鎖不再需要時立即釋放;
- 申請和釋放必須成對出現;
- 推薦使用超時鎖acquire(timeout),提前結束后主動釋放超時鎖。
資源使用檢測工具
1.Battery Historian
相關鏈接:https://developer.android.google.cn/topic/performance/power/battery-historian
2. AT&T Application Resource Optimizer
擅長於網絡跟蹤
相關鏈接:
https://developer.att.com/application-resource-optimizer
3. Android vitals
對過度喚醒、wifi掃描、網絡使用、長時間持喚醒鎖、進行監控,並輸出報告
相關鏈接:https://developer.android.google.cn/topic/performance/vitals/
總結
為保證應用在低功耗的情況下能夠正常的運行任務,建議使用如下方案:
1.研發階段:
1)推送遠程通知消息,需使用FCM或華為PUSH NC。
2)保持長鏈接心跳,需使用華為Modem鏈路托管技術(華為Bastet)
3)用戶觸發的后台業務,需使用前台服務+常駐通知。
- 后台下載、播放音樂、錄音、導航、計步、騎行記錄軌跡、同步照片等。
- 讓用戶能夠感知到(可見、可聽),包括聲音、通知欄、widget提示等。
4)非用戶觸發可推遲的任務,需使用JobScheduler/WorkManager。
- 需在充電、Wifi環境、Doze窗口期進行。
- 禁止在低電量(<30%)、省電模式、長待機(滅屏超過30min)、夜間(0:00~6:00)進行。
5)合理使用Alarm,Wakelock,Network,GPS等軟硬資源。
- 統一使用,避免頻繁使用。
- 按需使用,及時釋放。
2.測試驗收:
借助工具,使用battery-historian、 ARO、Android vitals分析運行時和長待機情況。
3.禁止行為:
惡意保活,包括無聲播放、一像素界面、低流量下載等。
關注安卓綠色聯盟公號,回復“2304”獲取PPT