android 7.0低電耗Doze模式

從 Android 6.0(API 級別 23)開始,Android 引入了兩個省電功能,可通過管理應用在設備未連接至電源時的行為方式為用戶延長電池壽命。
低電耗(Doze)模式通過在設備長時間處于閑置狀態時推遲應用的后臺 CPU 和網絡 Activity 來減少電池消耗。
應用待機(App Standby)模式可推遲用戶近期未與之交互的應用的后臺網絡 Activity。

低電耗模式(Doze模式)

如果用戶設備未插接電源、處于靜止狀態一段時間且屏幕關閉,設備會進入低電耗模式。 在低電耗模式下,系統會嘗試通過限制應用對網絡和 CPU 密集型服務的訪問來節省電量。 這還可以阻止應用訪問網絡并推遲其作業、同步和標準鬧鈴。

系統會定期退出低電耗模式一會兒,好讓應用完成其已推遲的 Activity。在此維護時段內,系統會運行所有待定同步、作業和鬧鈴并允許應用訪問網絡。

而 Android 7.0 則通過在設備未插接電源且屏幕關閉狀態下、但不一定要處于靜止狀態(例如用戶外出時把手持式設備裝在口袋里)時應用部分 CPU 和網絡限制,進一步增強了低電耗模式。

image

圖 1. 低電耗模式如何應用第一級系統活動限制以延長電池壽命的圖示。

7.0進入Doze模式分兩個階段: 對App行為的限制分為light idle(淺度doze)和deep idle(深度doze).當設備處于非充電狀態且屏幕已關閉一定時間后,設備會進入低電耗模式并應用第一部分限制(light idle):關閉應用網絡訪問、推遲作業和同步。如果進入低電耗模式后設備處于靜止狀態達到一定時間,系統則會對 PowerManager.WakeLock、AlarmManager 鬧鈴、GPS 和 WLAN 掃描應用余下的低電耗模式限制(deep idle)。無論是應用部分還是全部低電耗模式限制,系統都會喚醒設備以提供簡短的維護時間窗口,在此窗口期間,應用程序可以訪問網絡并執行任何被推遲的作業/同步。

light idle:(第一級限制,圖2中 第一個Doze階段)
    進入條件:   非充電狀態且屏幕已關閉一定時間后
    限制:       關閉應用網絡訪問、推遲作業和同步
    
deep idle:(第二級限制,圖2中 第二個Doze階段)
    進入條件:   進入light idle模式后設備處于靜止狀態達到一定時間
    限制:       PowerManager.WakeLock、AlarmManager 鬧鈴、GPS 和 WLAN 掃描

在每個維護時段結束后,系統會再次進入低電耗模式,暫停網絡訪問并推遲作業、同步和鬧鈴。 隨著時間的推移,系統安排維護時段的次數越來越少,這有助于在設備未連接至充電器的情況下長期處于不活動狀態時降低電池消耗。

image

圖 2. 低電耗模式如何在設備處于靜止狀態達到一定時間后應用第二級系統活動限制的圖示。

圖中,橫軸表示隨著時間的推移,橙色表示設備處于喚醒運行狀態,綠色表示低電耗(Doze)休眠狀態;當設備處于on battery(利用電池供電,也就是未插接電源),screen off(關閉屏幕),stationary(靜止狀態,7.0以后非靜止狀態亦可)保持以上條件一段時間之后,設備就會進入Doze模式.

maintenance window (低電耗(Doze)模式提供了定期維護時段,可供應用使用網絡并處理待定Activity),Doze模式下會定期的進入maintenance window,但進入的間隔越來越長

一旦用戶通過移動設備、打開屏幕或連接到充電器喚醒設備,系統就會立即退出低電耗模式,并且所有應用都將返回到正常 Activity。

低電耗模式限制

在低電耗模式下,您的應用會受到以下限制:

  • 暫停訪問網絡。
  • 系統將忽略 wake locks。
  • 標準 AlarmManager 鬧鈴(包括 setExact() 和 setWindow())推遲到下一維護時段。
  • 如果您需要設置在低電耗模式下觸發的鬧鈴,請使用 setAndAllowWhileIdle() 或 setExactAndAllowWhileIdle()。
  • 一般情況下,使用 setAlarmClock() 設置的鬧鈴將繼續觸發 — 但系統會在這些鬧鈴觸發之前不久退出低電耗模式。
  • 系統不執行 Wi-Fi 掃描。
  • 系統不允許運行同步適配器。
  • 系統不允許運行 JobScheduler。

應用待機模式(App Standby)

應用待機模式: 允許系統判定 應用在用戶未主動使用它時,將應用置為空閑狀態;通俗的說是指用戶在一段時間內沒有使用某個app,系統就會讓這個app處于空閑狀態,空閑狀態會限制app訪問網絡,推遲app的作業和同步任務

當用戶有一段時間未觸摸應用,且除以下條件外,都將被標記為空閑狀態

  • 用戶顯式啟動應用(直接點擊app啟動)
  • 應用當前有一個進程位于前臺(表現為 Activity 或前臺服務形式,或被另一 Activity 或前臺服務占用)
  • 應用生成用戶可在鎖屏或通知托盤中看到的通知。

當用戶將設備插入電源時,系統將從待機狀態釋放應用,從而讓它們可以自由訪問網絡并執行任何待定作業和同步。 如果設備長時間處于空閑狀態,系統將按每天大約一次的頻率允許空閑應用訪問網絡。

低電耗模式和應用待機模式下進行測試

為了確保用戶獲得極佳體驗,您應在低電耗模式和應用待機模式下全面測試您的應用

低電耗模式

您可按以下步驟測試低電耗模式:

  • 1.使用 Android 6.0(API 級別 23)或更高版本的系統映像配置硬件設備或虛擬設備。
  • 2.將設備連接到開發計算機并安裝應用
  • 3.運行應用并使其保持活動狀態
  • 4.關閉設備屏幕。(應用保持活動狀態。)
  • 5.通過運行以下命令強制系統在低電耗模式之間循環切換:
$ adb shell dumpsys battery unplug
$ adb shell dumpsys deviceidle step

您可能需要多次運行第二個命令。不斷地重復,直到設備變為空閑狀態。

  • 6.在重新激活設備后觀察應用的行為。確保應用在設備退出低電耗模式時正常恢復。

應用待機模式

要在應用待機模式下測試您的應用,請執行以下操作:

  • 1.使用 Android 6.0(API 級別 23)或更高版本的系統映像配置硬件設備或虛擬設備。
  • 2.將設備連接到開發計算機并安裝應用
  • 3.運行應用并使其保持活動狀態
  • 4.通過運行以下命令強制應用進入應用待機模式:
$ adb shell dumpsys battery unplug
$ adb shell am set-inactive <packageName> true
  • 5.使用以下命令模擬喚醒應用:
$ adb shell am set-inactive <packageName> false
$ adb shell am get-inactive <packageName>
  • 6.觀察喚醒后的應用行為。確保應用從待機模式中正常恢復。特別地,您應檢查應用的通知和后臺作業是否按預期繼續運行

親測MIUI 9.5執行 adb shell am set-inactive com.tencent.mobileqq true 結果始終為: Idle=false 而測試其他包名則沒有異樣,也就是小米針對QQ這種用戶量大的即時通訊軟件做了針對性處理

Doze和App Standby白名單

通過妥善管理網絡連接、鬧鈴、作業和同步并使用 GCM 高優先級消息,幾乎所有應用都應該能夠支持低電耗模式。對于一小部分用例,這可能還不夠。 對于此類用例,系統為部分免除低電耗模式和應用待機模式優化的應用提供了一份可配置的白名單。

在低電耗模式和應用待機模式期間,加入白名單的應用可以使用網絡并保留部分 wake locks。 不過,正如其他應用一樣,其他限制仍然適用于加入白名單的應用。 例如,加入白名單的應用的作業和同步將推遲(在 API 級別 23 及更低級別中),并且其常規 AlarmManager 鬧鈴不會觸發。通過調用 isIgnoringBatteryOptimizations(),應用可以檢查自身當前是否位于豁免白名單中。

用戶可以在 Settings > Battery > Battery Optimization 中手動配置該白名單。或者,系統會為應用提供請求用戶將應用加入白名單的方式。

  • 應用可以觸發 ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS Intent,讓用戶直接進入 Battery Optimization,他們可以在其中添加應用。
  • 具有 REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 權限的應用可以觸發系統對話框,讓用戶無需轉到“設置”即可直接將應用添加到白名單。應用將通過觸發 ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS Intent 來觸發該對話框。
    boolean hasIgnored = powerManager.isIgnoringBatteryOptimizations(getPackageName());
    if(!hasIgnored) {
        Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
        intent.setData(Uri.parse("package:"+getPackageName()));
        startActivity(intent);
    }

如何將非系統app預置到Doze的白名單中

  • 用戶可以根據需要手動從白名單中移除應用。

在請求用戶將應用添加到白名單之前,請確保應用符合加入白名單的可接受用例。

注:除非應用的核心功能受到不利影響,否則 Google Play 政策禁止應用請求直接豁免 Android 6.0+ 中的電源管理功能(低電耗模式和應用待機模式)

DeviceIdleController

    Android系統默認是關閉Doze模式的,開啟Doze模式方式如下:
    frameworks/base/core/res/res/values/config.xml   
    <bool name="config_enableAutoPowerModes">true</bool>

Doze模式的實現主要在/frameworks/base/services/core/java/com/android/server/DeviceIdleController.java

以上主要內容參考自Google官方文檔 .

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容