ANDROID Porting系列十一、Power Management

2024-04-16 07:32

本文主要是介绍ANDROID Porting系列十一、Power Management,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

介绍

 

wake_locks

Wake Locks类型

探索Wake Lock例子

PowerManager的类

PM驱动注册驱动程序

早期挂起

 

介绍

Android支持其自己的电源(标准的Linux电源管理)设计的前提是的CPU不应该消耗功率,如果没有应用程序或服务需要电源。欲了解更多有关标准的Linux电源管理的信息,请参见Linux的电源管理支持http:/ / kernel.org。

 

Android要求应用程序和服务请求 CPU资源以“wake locks”通过Android framework和native Linux库。如果没有active wake locks, Android会关闭的CPU。

 

下面的图片展示了 Android的电源管理架构。

 

power manager

实线表示Android的块元素和虚线代表partner-specific组成部分。

Wake Locks

应用程序和服务使用Wake Locks请求CPU资源。

锁定的wakelock,取决于它的类型,防止进入暂停或其它低功耗状态的系统。本文档介绍了如何运用wakelocks。

有两个一wakelock设置:

•WAKE_LOCK_SUSPEND:防止一个完整的系统挂起。

•WAKE_LOCK_IDLE:低功耗状态,这往往造成大规模的中断延迟或停用的中断设置,将无法再进入了空闲状态,直到wakelocks被释放。

除非指定类型,这种类型的文件,是指WAKE_LOCK_SUSPEND wakelocks。

如果停止作业已经开始锁定wakelock时,系统会中止,停止作业,只要它还没有达到suspend_latestage。这意味着,从一个中断处理程序锁定或freezeable线程wakelock始终工作,但如果你锁定从suspend_late处理程序wakelock,你还必须从该处理程序返回一个错误中止暂停。你可以使用wakelocks允许用户空间来决定哪些键应该唤醒全系统在屏幕上打开。使用set_irq_wake或特定于平台的API,以确保了CPU的键盘中断唤醒。一旦键盘驱动程序已恢复,事件的顺序可以是这样的::

1。该键盘驱动程序收到一个中断,锁键盘扫描wakelock,并开始扫描矩阵键盘。

2。键盘扫描代码检测报告,一个key的变化和它的input-event动程序。

3。该输入事件driver则认为,key的变化,enqueues一个事件,并锁定输入事件队列wakelock。

4。键盘扫描码,没有key持有或解锁键盘扫描wakelock检测。

5。用户空间输入事件的选择/调查线程返回,锁定过程输入事件wakelock,并调用该输入设备读取事件。

6。该输入事件驱动清出键事件队列,而且由于现在是空的队列,解锁输入事件队列wakelock。

7。用户空间的输入事件从读线程返回。它决定,key不应该唤醒全系统,释放过程输入事件wakelock,并要求选择或轮循。

下面简单的序列图说明了这些步骤:

                              Key pressed      Key released
                                         |             |
      keypad-scan                    ++++++++++++++++++++++
      input-event-queue               +++          +++
      process-input-events                      +++          +++
      

驱动程序的API

驱动程序可以通过添加wakelock变量的状态,并调用wake_lock_init如下面的片段所示,使用wakelock的API:

  struct state {
  struct wakelock wakelock;
  }
  init() {
  wake_lock_init(&state->wakelock, WAKE_LOCK_SUSPEND, "wakelockname");
  }
  Before freeing the memory, wake_lock_destroy must be called:
  uninit() {
  wake_lock_destroy(&state->wakelock);
  }
  

当驱动程序确定它需要运行(通常在一个中断处理程序),它调用wake_lock:

  wake_lock(&state->wakelock);
  

当它不再需要运行,它调用wake_unlock:

  wake_unlock(&state->wakelock);
  

它也可以调用wake_lock_timeout拖延后释放wakelock:

  wake_lock_timeout(&state->wakelock, HZ);

不管wakelock是否已经起作用, 它是有用的,如果driver wake up系统不使用wakelocks但仍需要运行的其他部分。要避免这种可能,因为如果超时是长,它会浪费电力,或如果超时很短, 可能无法完成所需的工作。

用户空间的API

    写lockname或lockname超时到/sys/power/wake_lock锁,如果需要,创建一个wakelock。这里是指定超时在纳秒。写lockname到/sys/power/wake_unlock解锁用户wakelock。

不要使用随机生成的wakelock名字,因为wakelock名字没有API来释放一个用户空间wakelock。

    Wake Locks类型

Wake Lock

Description

ACQUIRE_CAUSES_WAKEUP 

Normally wake locks don't actually wake the device, they just cause it to remain on once it's already on. Think of the video player app as the normal behavior. Notifications that pop up and want the device to be on are the exception; use this flag to be like them.

FULL_WAKE_LOCK

Wake lock that ensures that the screen and keyboard are on at full brightness.

ON_AFTER_RELEASE

When this wake lock is released, poke the user activity timer so the screen stays on for a little longer.

PARTIAL_WAKE_LOCK

Wake lock that ensures that the CPU is running. The screen might not be on.

SCREEN_BRIGHT_WAKE_LOCK

Wake lock that ensures that the screen is on at full brightness; the keyboard backlight will be allowed to go off.

SCREEN_DIM_WAKE_LOCK

Wake lock that ensures that the screen is on, but the keyboard backlight will be allowed to go off, and the screen backlight will be allowed to go dim.

探索Wake Lock例子

所有电源管理要求遵循相同的基本格式:

1。获取句柄PowerManager的服务。

2。创建一个唤醒锁,并指定屏幕电源管理标志,超时等

3。获得 wake lock.。

4。执行操作(播放MP3,打开网页,等等)。

5。释放wake lock。

 

下面的代码段说明了这一过程。

PowerManager pm = (PowerManager)mContext.getSystemService(
                                          Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(
                                      PowerManager.SCREEN_DIM_WAKE_LOCK
                                      | PowerManager.ON_AFTER_RELEASE,
                                      TAG);
wl.acquire();
 // ...
wl.release();

PowerManager的类

 

Android Framework通过PowerManager的类提供电源管理给services and applications。

 

用户空间native 库(任何在//device/lib/hardware/意味着,作为支持的Android运行时库)应决不会变成Android电源管理直接调用(见上面的图片硬件功能)。绕过在Android运行时的电源管理政策,将破坏该系统。

 

所有调用电源管理应通过Android的Android runtime PowerManager APIs。

例子说明请访问:

http://code.google.com/android/reference/android/os/PowerManager.html。

 

PM Driver注册驱动程序

你可以注册很多Kernel-level drivers的 Android的电源管理器驱动程序,以便在关闭电源之前或之后立即通知了所有Kernel-level drivers。例如,您可能会从用户空间设置一个显示驱动程序完全断电时,请求进入到断电(参见示例实现了Android的MSM MDDI的显示驱动程序)。

 

要注册Android PM driver,用Android PM driver回调处理程序实施注册, 如在以下代码段所示:

android_register_early_suspend(android_early_suspend_t *handler)
android_register_early_resume(android_early_resume_t *handler)

立即返回至关重要的,而不是等待什么发生在调用返回。

 

早期挂起

 

早期,暂停API允许司机在得到通知时,用户空间写入到/sys/power/request_state表明,用户可见的睡眠状态应该改变。暂停处理程序称为低到高顺序(4 - 1),恢复处理程序称为高为低(1 - 4)。

 

1。 EARLY_SUSPEND_LEVEL_BLANK_SCREEN:

suspend:在屏幕上应该被关闭,但仍必须framebuffer的访问。

resume:在屏幕上可以重新打开。

 

2。 EARLY_SUSPEND_LEVEL_STOP_DRAWING:

suspend:此级别通知用户空间,它应停止访问帧缓冲,并等待它完成。

resume:它通知用户空间,它应该恢复屏幕访问。两种方法都提供控制台开关或一个sysfs的接口。

 

3。 EARLY_SUSPEND_LEVEL_DISABLE_FB:关闭打开帧缓冲

suspend:关闭帧缓冲

resume:重新打开帧缓冲。

 

4。 EARLY_SUSPEND_LEVEL_STOP_INPUT:

suspend:关闭输入设备不属于能够唤醒或者被禁用。

resume:把相同的设备重新打开。

这篇关于ANDROID Porting系列十一、Power Management的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/908153

相关文章

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动