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实现在线预览office文档的示例详解

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

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

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

Android实现悬浮按钮功能

《Android实现悬浮按钮功能》在很多场景中,我们希望在应用或系统任意界面上都能看到一个小的“悬浮按钮”(FloatingButton),用来快速启动工具、展示未读信息或快捷操作,所以本文给大家介绍... 目录一、项目概述二、相关技术知识三、实现思路四、整合代码4.1 Java 代码(MainActivi

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda