AOSP的Doze模式-DeepIdle 初識

前言

從Android 6.0開始,谷歌引入了Doze模式(打盹模式)的省電技術延長電池使用時間。如果用戶長時間未使用設備,低電耗模式會延遲應用后臺 CPU 和網絡活動,從而延長電池續航時間。根據第三方測試顯示,兩臺同樣的Nexus 5,開啟的Doze的一臺待機能達到533小時,而未開啟Doze的一臺待機只能達到200小時。Doze省電效果十分明顯。

Doze省電技術原理

Doze模式細分light idle和deep idle,本文主要介紹deep idle

操作

低電耗模式-deep idle

輕度低電耗模式-light idle

觸發器

屏幕關閉、電池供電(未插電)、靜止

屏幕關閉、電池供電(未插電)

計時

隨維護時段依次增加

隨維護時段反復持續 N 分鐘

限制

無法訪問網絡、喚醒鎖定和 GPS/WLAN 掃描;鬧鐘和作業/同步被延遲

無法訪問網絡;作業/同步被延遲(維護窗口除外)

行為

僅接收優先級較高的推送通知消息

接收所有實時消息(即時消息、致電等);優先級較高的推送通知消息可以暫時訪問網絡

退出

動作、屏幕開啟或鬧鐘響鈴

屏幕開啟

Doze技術原理主要分為狀態機+省電管控(后臺 CPU 和網絡活動)措施,延長待機續航的效果。

其中狀態機的目的主要識別用戶長時間未使用設備場景并標記Idle狀態,省電管控措施主要是Idle狀態內限制應用后臺 CPU 和網絡活動

0

1.DeepIde狀態機

為了更好地識別用戶未使用場景,Doze模式設計了狀態機機制,主要包含長期滅屏、無運動、無顯著運動、無GPS變化的狀態檢測與流轉。其中運動檢測和GPS側重的是靜止狀態的識別。

1.1 DeepIde狀態機時序圖

待機滅屏時會先開啟一個30分鐘的鬧鐘檢測滅屏狀態持續30分鐘,滿足滅屏待機30分鐘后,再開啟30分鐘的低功耗運動檢測查看是否為靜止狀態,滿足30分鐘保持靜止狀態后,再開啟4分鐘的高精度ACC動作檢測是否是絕對靜止狀態,滿足4分鐘持續的絕對靜止狀態后,再開啟30秒的GPS定位檢測是否沒有定位變化,滿足30秒沒有定位條件,就可以進入deep idle狀態,對可以放心對操作系統層上的應用進行功耗限制了。

// 30分鐘的待機滅屏時長檢測定義private long mDefaultInactiveTimeout =        (30 * 60 * 1000L) / (!COMPRESS_TIME ? 1 : 10);// 30分鐘的低功耗普通運動檢測private long mDefaultIdleAfterInactiveTimeout =        (30 * 60 * 1000L) / (!COMPRESS_TIME ? 1 : 10);// 4分鐘的高耗電高精度的ACC運動檢測private long mDefaultSensingTimeout =        !COMPRESS_TIME ? 4 * 60 * 1000L : 60 * 1000L;        // 30秒的GPS位置檢測private long mDefaultLocatingTimeout =        !COMPRESS_TIME ? 30 * 1000L : 15 * 1000L;

0

從上述時序圖可以看出,進入deep idle需要1小時4.5mins,idle周期時間為1小時、2小時、4小時、最大6小時,維護窗口時間為5mins。

移動檢測:主要分為SIGNIFICANT_SENSOR檢測和加速度傳感器檢測,區別是一個低功耗精度沒那么高和一個高功耗精度高

1.2 DeepIde 狀態機流轉圖

0

注:QUICK_DOZE_DELAY是一種特殊狀態,當設備處于低電量時會進入,因此正常情況LOCATING會切換到IDLE的,只是代碼會執行到QUICK_DOZE_DELAY的。

1.3 Deep Idle 狀態機狀態轉換表

狀態 (State)

進入條件 (Entry Conditions)

觸發方法/邏輯

STATE_ACTIVE

屏幕開啟 OR 正在充電 OR 即將觸發鬧鐘 OR 有緊急呼叫活躍。

初始狀態,通過 becomeActiveLocked() 激活。

STATE_INACTIVE

屏幕關閉 AND 未充電 AND 無緊急呼叫。

becomeInactiveIfAppropriateLocked()(且未啟用 Quick Doze)。

STATE_QUICK_DOZE_DELAY

同 STATE_INACTIVE,且關閉了位置、運動檢測和顯著運動監控。

becomeInactiveIfAppropriateLocked()(且啟用 Quick Doze)。

STATE_IDLE_PENDING

開啟顯著運動監控(等待檢測運動)。

從 STATE_INACTIVE 通過 stepIdleStateLocked() 進入。

STATE_SENSING

監控任意運動(包括顯著運動和普通運動)。

從 STATE_IDLE_PENDING 通過 stepIdleStateLocked() 進入。

STATE_LOCATING

正在請求位置信息,且運動監控仍開啟。

從 STATE_SENSING 通過 stepIdleStateLocked() 進入。

STATE_IDLE

關閉位置和運動檢測,保持顯著運動監控狀態不變。

從 STATE_SENSING(無位置服務)或 STATE_LOCATING/STATE_QUICK_DOZE_DELAY 通過 stepIdleStateLocked() 進入。

STATE_IDLE_MAINTENANCE

空閑維護窗口(短暫喚醒以執行任務)。

從 STATE_IDLE 通過 stepIdleStateLocked() 進入。

2.DeepIde 省電管控措施

進入deep idle需要1小時4.5mins,deep idle周期時間為1小時、2小時、4小時、最大6小時,維護窗口時間為5mins。窗口期的意思就是每1,2,4,6小時的間隔留5分鐘放風期,讓被限制的應用有機會臨時解除限制,進行后臺活動,例如消息推送接收或數據同步。這里也體現出批量放風的功耗管控思維。

0

在休眠Idle期間,設備會受到以下限制:

1.應用無法訪問網絡。

2.應用喚醒鎖定被忽略。

3.鬧鐘被延遲。鬧鐘響鈴以及使用

setAndAllowWhileIdle() 設置的鬧鐘(當設備處于低電耗模式時,限于每個應用每 15 分鐘 1 次)除外。此豁免規則適用于必須顯示活動提醒通知的應用(如日歷)。

4.無法執行 WLAN 掃描。

5.SyncAdapter 同步和

JobScheduler 作業被延遲,直到下一個維護時段才能恢復。

6.接收短信和彩信的應用被暫時列入白名單,以便它們可以完成處理任務。

3.退出DeepIde的機制

當平臺檢測到以下任意情況時,會使設備退出低電耗模式,從這里我們可以看出Doze模式進入是嚴進寬出的模式

1.用戶與設備互動

2.設備移動操作

3.設備屏幕打開

4.AlarmClock 即將響鈴

備注:消息通知不會使設備退出低電耗模式。

4.Doze白名單分類

什么時候配置白名單呢?一般是應用因被doze管控,導致一些消息接收不及時,需要根據是否第三方應用或系統內置應用進行不同路徑的配置文件進行配置。

變量名

加載方式

作用范圍

調用場景

組成/備注

用戶應用白名單

mPowerSaveWhitelistUserApps

onStart中通過config文件加載

省電模式下所有用戶應用

直接調用

基礎用戶白名單列表

mPowerSaveWhitelistUserAppIds

由mPowerSaveWhitelistUserApps生成

同mPowerSaveWhitelistUserApps

僅用于dump打印

用戶白名單的ID形式(如UID)

mPowerSaveWhitelistUserAppIdArray

同mPowerSaveWhitelistUserAppIds

同mPowerSaveWhitelistUserApps

提供Binder遠程調用

用戶白名單ID數組,供AMS/PMS訪問

系統應用白名單

mPowerSaveWhitelistSystemAppIds

onStart中通過config文件加載

所有省電模式下的系統應用

直接調用

基礎系統白名單(含IDLE場景)

mPowerSaveWhitelistSystemAppIdsExceptIdle

onStart中通過配置文件加載

省電模式但排除IDLE狀態的系統應用

Binder遠程增刪

系統白名單的子集(IDLE狀態不生效)

混合白名單

mPowerSaveWhitelistAllAppIds

由以下兩者組成:

所有省電模式下的全部應用(系統+用戶)

僅用于dump打印

mPowerSaveWhitelistApps + mPowerSaveWhitelistUserApps

mPowerSaveWhitelistAllAppIdArray

同mPowerSaveWhitelistAllAppIds

同mPowerSaveWhitelistAllAppIds

向AMS/PMS設置全局白名單

全局白名單的數組形式,供系統服務調用

排除IDLE的白名單

mPowerSaveWhitelistExceptIdleAppIds

由以下兩者組成:

省電模式但排除IDLE狀態的全部應用

無直接調用(僅邏輯組合)

mPowerSaveWhitelistAppsExceptIdle + mPowerSaveWhitelistUserApps

mPowerSaveWhitelistExceptIdleAppIdArray

同mPowerSaveWhitelistExceptIdleAppIds

同mPowerSaveWhitelistExceptIdleAppIds

Binder遠程調用

排除IDLE的白名單數組,功能與mPowerSaveWhitelistExceptIdleAppIds一致

Android手機的Settings也提供了Doze白名單的手動設置入口:

0

如果不配置白名單,新安裝的應用默認是歸為doze的自動管控規則,即優化選項

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/77186.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77186.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/77186.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用Python Pandas高效操作數據庫:從查詢到寫入的完整指南

一、環境準備與數據庫連接 1.1 安裝依賴庫 pip install pandas sqlalchemy psycopg2 # PostgreSQL # 或 pip install pandas sqlalchemy pymysql # MySQL # 或 pip install pandas sqlalchemy # SQLite 1.2 創建數據庫引擎 通過SQLAlchemy創建統一接口&#xff1a…

每日一題(小白)暴力娛樂篇31

首先分析一下題意,需要求出2024的因子,因為我們要求與2024互質的數字,為什么呢?因為我們要求互質說直白點就是我和你兩個人沒有中間人,我們是自然而然認識的,那我們怎么認識呢,就是直接見面對吧…

電控---printf重定向輸出

在嵌入式系統開發中,printf 重定向輸出是將標準輸出(stdout)從默認設備(如主機終端)重新映射到嵌入式設備的特定硬件接口(如串口、LCD、USB等)的過程。 一、核心原理:標準IO庫的底層…

快速認識:數據庫、數倉(數據倉庫)、數據湖與數據運河

數據技術核心概念對比表 概念核心定義核心功能數據特征典型技術/工具核心應用場景數據庫結構化數據的「電子檔案柜」,按固定 schema 存儲和管理數據,支持高效讀寫和事務處理。實時事務處理(增刪改查),確保數據一致性&…

【17】數據結構之圖的遍歷篇章

目錄標題 圖的遍歷深度優先遍歷 Depth First Search廣度優先遍歷 Breadth First Search 圖的遍歷 從圖中某一個頂點出發,沿著一些邊訪遍圖中所有的頂點,且使用每個頂點僅被訪問一次,這個過程稱為圖的遍歷.Graph Traversal. 其中&#xff0c…

簡單接口工具(ApiCraft-Web)

ApiCraft-Web 項目介紹 ApiCraft-Web 是一個輕量級的 API 測試工具,提供了簡潔直觀的界面,幫助開發者快速測試和調試 HTTP 接口。 功能特點 支持多種 HTTP 請求方法(GET、POST、PUT、DELETE)可配置請求參數(Query …

Git進階操作

Git高階操作完全指南:解鎖專業開發工作流 前言 在當今的軟件開發領域,掌握高級Git技能已成為區分普通開發者與專業開發者的關鍵因素。根據最新的GitHub數據,熟練應用交互式暫存和Rebase等高級功能的開發者,其代碼審查通過率平均提…

Python結合AI生成圖像藝術作品代碼及介紹

為實現生成圖像藝術作品,我選用 Stable Diffusion 庫結合 Python 編寫代碼。下面先展示代碼,再詳細介紹其原理、模塊及使用方法等內容。 生成圖片代碼 import torch from diffusers import StableDiffusionPipeline# 加載預訓練模型 pipe StableDiffu…

Linux操作系統--靜態庫和動態庫的生成and四種解決加載找不到動態庫的四種方法

目錄 必要的知識儲備: 生成靜態庫: 生成動態庫: 解決加載找不到動態庫的四種方法: 第一種:拷貝到系統默認的庫路徑 /usr/lib64/ 第二種:在系統默認的庫路徑/usr/lib64/下建立軟鏈接 第三種&#xff1…

LLM中的N-Gram、TF-IDF和Word embedding

文章目錄 1. N-Gram和TF-IDF:通俗易懂的解析1.1 N-Gram:讓AI學會"猜詞"的技術1.1.1 基本概念1.1.2 工作原理1.1.3 常見類型1.1.4 應用場景1.1.5 優缺點 1.2 TF-IDF:衡量詞語重要性的尺子1.2.1 基本概念1.2.2 計算公式1.2.3 為什么需…

Leetcode 3359. 查找最大元素不超過 K 的有序子矩陣【Plus題】

1.題目基本信息 1.1.題目描述 給定一個大小為 m x n 的二維矩陣 grid。同時給定一個 非負整數 k。 返回滿足下列條件的 grid 的子矩陣數量: 子矩陣中最大的元素 小于等于 k。 子矩陣的每一行都以 非遞增 順序排序。 矩陣的子矩陣 (x1, y1, x2, y2) 是通過選擇…

如何在 Ubuntu 22.04 上安裝、配置、使用 Nginx

如何在 Ubuntu 22.04 上安裝、配置、使用 Nginx?-阿里云開發者社區 更新應用 sudo apt updatesudo apt upgrade檢查必要依賴并安裝 sudo apt install -y curl gnupg2 ca-certificates lsb-release安裝nginx sudo apt install -y nginx# 啟動nginx sudo systemct…

Linux:顯示 -bash-4.2$ 問題(CentOS 7)

文章目錄 一、原因二、錯誤示例三、解決辦法 一、原因 在 CentOS 7 系統中,如果你看到命令行提示符顯示為 -bash-4.2$,一般是 Bash shell 正在運行,并且它沒有找到用戶的個人配置文件,或者這些文件有問題而未能成功加載。這個提示…

QT6 源(34):隨機數生成器類 QRandomGenerator 的源碼閱讀

&#xff08;1&#xff09;代碼來自 qrandom.h &#xff0c;結合官方的注釋&#xff1a; #ifndef QRANDOM_H #define QRANDOM_H#include <QtCore/qalgorithms.h> #include <algorithm> // for std::generate #include <random> // for std::mt1993…

第二篇:linux之Xshell使用及相關linux操作

第二篇&#xff1a;linux之Xshell使用及相關linux操作 文章目錄 第二篇&#xff1a;linux之Xshell使用及相關linux操作一、Xshell使用1、Xshell安裝2、Xshell使用 二、Bash Shell介紹與使用1、什么是Bash Shell(殼)&#xff1f;2、Bash Shell能干什么&#xff1f;3、平時如何使…

MCP(模型上下文協議)學習筆記

學習MCP&#xff08;模型上下文協議&#xff09;的系統化路徑&#xff0c;結合技術原理、工具實踐和社區資源&#xff0c;幫助你高效掌握這一AI交互標準&#xff1a; 在當今人工智能飛速發展的時代&#xff0c;AI技術正以前所未有的速度改變著我們的生活和工作方式。然而&#…

MIR-2025 | 多模態知識助力機器人導航:從復雜環境到高效路徑規劃

作者&#xff1a;Hui Yuan, Yan Huang, Zetao Du, Naigong Yu, Ziqi Liu, Dongbo Zhang, Kun Zhang 單位&#xff1a;北京工業大學信息科學與技術學院&#xff0c;北京工業大學計算智能與智能系統北京市重點實驗室&#xff0c;中科院自動化研究所模式識別國家重點實驗室與多智…

javaSE.泛型界限

現在有一個新的需求&#xff0c;沒有String類型成績了&#xff0c;但是成績依然可能是整數&#xff0c;也可能是小數&#xff0c;這是我們不希望用戶將泛型指定為除數字類型外的其他類型&#xff0c;我們就需要使用到泛型的上界定義&#xff1a; 上界&#x1f447;只能使用其本…

壓縮包網頁預覽(zip-html-preview)

zip-html-preview 項目介紹 這是一個基于 Spring Boot 開發的在線 ZIP 文件預覽工具,主要用于預覽 ZIP 壓縮包中的 HTML 文件及其相關資源。 主要功能 支持拖拽上傳或點擊選擇多個 ZIP 文件自動解壓并提取 ZIP 文件中的 HTML 文件在線預覽 HTML 文件及其相關的 CSS、JavaSc…

QML之Overlay

Overlay&#xff08;覆蓋層&#xff09;是QML中用于在當前界面之上顯示臨時內容的重要組件。 一、Overlay基礎概念 1.1 什么是Overlay&#xff1f; Overlay是一種浮動在現有界面之上的視覺元素&#xff0c;具有以下特點&#xff1a; 臨時顯示&#xff0c;不影響底層布局 通…