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 NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Android 实现一个隐私弹窗功能

《Android实现一个隐私弹窗功能》:本文主要介绍Android实现一个隐私弹窗功能,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 效果图如下:1. 设置同意、退出、点击用户协议、点击隐私协议的函数参数2. 《用户协议》、《隐私政策》设置成可点击的,且颜色要区分出来res/l

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

《Android使用ImageView.ScaleType实现图片的缩放与裁剪功能》ImageView是最常用的控件之一,它用于展示各种类型的图片,为了能够根据需求调整图片的显示效果,Android提... 目录什么是 ImageView.ScaleType?FIT_XYFIT_STARTFIT_CENTE

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络