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 Kotlin 高阶函数详解及其在协程中的应用小结

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

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

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

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