【Android休眠】之Android休眠機制

来源:https://www.cnblogs.com/linhaostudy/archive/2019/12/28/12113548.html
-Advertisement-
Play Games

一、休眠概述 休眠,簡而言之就是設備在不需要工作的時候把一些部件、外設關掉(掉電或讓它進入低功耗模式)。 為什麼要休眠呢?一言以蔽之:省電。 休眠分主動休眠和被動休眠。主動休眠:比如我電腦不用了,就通過設置讓系統進入休眠模式;被動休眠:系統檢測到自己閑的慌,為了節約故,自己就休眠去了。 廢話不敘。 ...


一、休眠概述

休眠,簡而言之就是設備在不需要工作的時候把一些部件、外設關掉(掉電或讓它進入低功耗模式)。

為什麼要休眠呢?一言以蔽之:省電。

休眠分主動休眠和被動休眠。主動休眠:比如我電腦不用了,就通過設置讓系統進入休眠模式;被動休眠:系統檢測到自己閑的慌,為了節約故,自己就休眠去了。

廢話不敘。

二、Android休眠

休眠是內核的核心工作,而Android是基於Linux內核的,所以Android休眠和內核有著千絲萬縷的聯繫;由於Android的特殊應用場景:移動設備,所以Android休眠和內核又有著特別的需求。

1、聯繫:

Android設備停止使用,系統沒有什麼事情可做,進入休眠狀態的功能最終是由內核去實現的;每一類硬體都有自己的驅動,具體的驅動決定怎麼進入休眠以及處於何種層次的休眠。比如:對於platform_device,就按照platform_driver定義的規則,在suspend調用的時候,去做上面提到的事情:

struct platform_driver {
    int (*probe)(struct platform_device *);
    int (*remove)(struct platform_device *);
    void (*shutdown)(struct platform_device *);
    int (*suspend)(struct platform_device *, pm_message_t state);
    int (*resume)(struct platform_device *);
    struct device_driver driver;
    const struct platform_device_id *id_table;
};

2、Android的特別需求:

比如對於自己的電腦,不用讓它休眠好了;但是對於我們形影不離的手機,在休眠的時候還要睜一隻眼:來電了要通知你,QQ啊微信啊什麼的由信息了也要通知你,所以Android在Linux內核休眠機制之上,提出了“Opportunistic Suspend”。

三、休眠實踐

絮絮叨叨這麼多,下麵讓我們切切實實體驗下休眠。

1、休眠模式
休眠是分好幾種模式的,不同模式實現方式、耗電量不同,以下來自Documentation/power/states.txt

The kernel supports four power management states generically, though
one is generic and the other three are dependent on platform support
code to implement the low-level details for each state.
This file describes each state, what they are
commonly called, what ACPI state they map to, and what string to write
to /sys/power/state to enter that state
 
state:      Freeze / Low-Power Idle
ACPI state: S0
String:     "freeze"
 
This state is a generic, pure software, light-weight, low-power state.
It allows more energy to be saved relative to idle by freezing user
space and putting all I/O devices into low-power states (possibly
lower-power than available at run time), such that the processors can
spend more time in their idle states.
This state can be used for platforms without Standby/Suspend-to-RAM
support, or it can be used in addition to Suspend-to-RAM (memory sleep)
to provide reduced resume latency.
 
 
State:      Standby / Power-On Suspend
ACPI State: S1
String:     "standby"
 
This state offers minimal, though real, power savings, while providing
a very low-latency transition back to a working system. No operating
state is lost (the CPU retains power), so the system easily starts up
again where it left off. 
 
We try to put devices in a low-power state equivalent to D1, which
also offers low power savings, but low resume latency. Not all devices
support D1, and those that don't are left on. 
 
 
State:      Suspend-to-RAM
ACPI State: S3
String:     "mem"
 
This state offers significant power savings as everything in the
system is put into a low-power state, except for memory, which is
placed in self-refresh mode to retain its contents. 
 
System and device state is saved and kept in memory. All devices are
suspended and put into D3. In many cases, all peripheral buses lose
power when entering STR, so devices must be able to handle the
transition back to the On state. 
 
For at least ACPI, STR requires some minimal boot-strapping code to
resume the system from STR. This may be true on other platforms. 
 
 
State:      Suspend-to-disk
ACPI State: S4
String:     "disk"
 
This state offers the greatest power savings, and can be used even in
the absence of low-level platform support for power management. This
state operates similarly to Suspend-to-RAM, but includes a final step
of writing memory contents to disk. On resume, this is read and memory
is restored to its pre-suspend state. 

雖說kernel支持上述四種休眠模式,但具體哪幾種可用取決於你的硬體。那麼怎麼知道自己的Android設備支持的休眠模式呢?

答案:通過/sys/文件系統。查詢支持的休眠模式可以cat文件/sys/power/state:

cat /sys/power/state 
freeze mem

如果我們往/sys/power/state文件echo上面的某一種模式的字元串,系統就會進入相應的休眠模式:

echo "mem" > /sys/power/state

如果你搜索過Android休眠相關的內容,在老版本的Android(4.4版本之前)會見有提到PowerManager的setPowerState()方法,該方法即是通過以上方式使系統進入休眠。但自從引入Autosleep後,就不在這麼做了,setPowerState()方法也銷聲匿跡。

2、/sys/power/目錄下文件

image

文件簡介:

  • /sys/power/state:用來控制系統的Power狀態。讀取該文件可以獲取系統支持的休眠模式,寫入該文件休眠模式的一種,系統進入到指定的休眠模式。如上所示例。
  • /sys/power/autosleep:從Android wakelocks補丁集中演化而來,用於取代Android wakelocks中的自動休眠功能。向該文件寫入/sys/power/state返回值的某一種,系統會在適當的時候進入指定的休眠的模式;讀取該文件返回之前寫入的數值。
  • /sys/power/wake_lock、/sys/power/wake_unlock:即我們常說的休眠鎖,如果應用持有休眠鎖,系統將無法進入休眠模式。在Android wakelocks時代,寫wake_lock獲取鎖,寫wake_unlock釋放鎖;在AutoSleep時代,具體參見【Android休眠】之AutoSleep
  • wakeup_count:用於解決“system suspend和system wakeup events之間的同步問題”。
  • /sys/power/pm_async:狀態切換開關,允許/禁止User空間對設備進行非同步的suspend和resume操作。
  • /sys/power/pm_freeze_timeout:系統在執行休眠動作的時候要凍結(freeze)用戶控制項的進程和內核空間的允許凍結的內核線程,執行這些操作要耗時間吧?該文件指定所需時間的最大值。

四、其他需要明瞭的問題

1、Android設備屏幕暗下來的時候,並不是立即就進入了休眠模式;當所有喚醒源都處於de-avtive狀態後,系統才會進入休眠。

2、Android設備連著adb線到其他設備的情況下,設備是不會進入休眠模式的。

3、有休眠操作就有喚醒,就需要喚醒源。喚醒源有很多種,在內核註冊,比如常用的Power按鍵。

4、曾經困惑的一個問題:系統怎麼知道自己應該進入休眠模式了?它的判斷依據是什麼?

在wakelock時代,系統休眠過程中去檢測休眠鎖;如果系統中沒有其他部件持有休眠鎖,就嘗試進入休眠模式,沒有異常事件發生的話就進入休眠模式。
Android從4.4開始使用autosleep機制,只要不存在任何active的喚醒源(wakeup_source)了,就進入休眠模式。

5、系統Power Manager整體流程:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 命令模型的主要元素: 1、命令 2、命令綁定:命令連接到相關的應用程式邏輯 3、命令源:命令源觸發命令, 4、命令目標:應用程式邏輯。 ICommand介面 命令模型的核心是System.Windows.Input.ICommand介面。 該介面包含兩個方法和一個事件: void Execute(o ...
  • 上一篇里介紹了Job和Trigger的常用方法,這一節將介紹Calendar,它的作用是排除特定的日期時間。 Calendar的常用類 DailyCalendar 排除每天某個時間段任務的執行 例子: var sche = StdSchedulerFactory.GetDefaultSchedule ...
  • 一、什麼是.NET Core .NET Core是一個開源通用的開發框架,支持跨平臺,即支持在Window,macOS,Linux等系統上的開發和部署,並且可以在硬體設備,雲服務,和嵌入式/物聯網方案中進行使用。 .NET Core的源碼放在GitHub上,由微軟官方和社區共同支持。 由於.NET ...
  • 在實際運行中,好好運行的程式出現了以下問題: 2019-12-27 10:40:00,164 [DefaultQuartzScheduler_Worker-2] ERROR IBeam.BCPool.Objects.CloudPowerIncome [(null)] - AutoSynchroniz ...
  • 在.Net Core 2.x 版本,Microsoft 官方沒有提供 .Net Core 正式版的多語言安裝包。因此,我們在用.Net Core 2.x 版本作為框架目標編寫代碼時,智能提成是英文的。那對於剛轉.Net Core的我,再加上英語不好,真是頭疼。 隨著.Net Core 3.x 版本的 ...
  • 本筆記摘抄自:https://www.cnblogs.com/liqingwen/p/5814204.html,記錄一下學習過程以備後續查用。 一、統計單詞在字元串中出現的次數 請註意,若要執行計數,請先調用Split方法來創建詞數組。Split方法存在性能開銷,如果對字元串執行的唯一操作是計數詞, ...
  • 大家好我又回來了,前幾天講過一個關於Jwt的身份驗證最簡單的案例,但是功能還是不夠強大,不適用於真正的項目,是的,在真正面對複雜而又苛刻的客戶中,我們會不知所措,就現在需要將認證授權這一塊也變的複雜而又實用起來,那在專業術語中就叫做自定義策略的API認證,本次案例運行在.NET Core 3.0中,... ...
  • 程式寫日誌文件時該不該加鎖 日誌(log) 為了讓自己的思路更加清晰,下麵我都會稱日誌為 log。因為日誌這個詞有兩種含義,詳情見百度百科釋義或者維基百科釋義。 日記的另一種說法。“志”字本身為“記錄”的意思,日誌就為每日的記錄(通常是跟作者有關的)。 伺服器日誌(server log),記錄伺服器 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...