简介
Android支持的Linux电源管理)有自己的电源管理(在顶部设计标准的前提下认为不应该的CPU消耗功率,如果没有应用程序或服务需要的力量。 欲了解更多有关信息管理标准的Linux电源,请参见Linux的电源管理支持 在 http://kernel.org。
Android的要求,应用程序和服务要求,以“唤醒锁”通过Android应用框架和本地Linux库的CPU资源。 如果没有积极唤醒锁,Android将关闭的CPU。
下面的图片展示了Android电源管理架构。
固体元素表示Android的块元素和虚线代表合作伙伴的特定块。
唤醒锁
唤醒锁用于应用程序和服务要求CPU资源。
锁定的wakelock,根据其类型而定,防止进入暂停或其它低功耗状态系统。 本文档介绍了如何利用wakelocks。
有两个一wakelock设置:
WAKE_LOCK_SUSPEND
:防止一个完整的系统挂起。WAKE_LOCK_IDLE
:低功耗状态,这往往导致大量中断延迟或中断禁用设置,将不会进入空闲状态,直到从wakelocks被释放。
除非指定类型,这份文件是指类型wakelocks的 WAKE_LOCK_SUSPEND
。
如果挂起操作已经开始锁定wakelock时,系统会中止暂停运作,只要它尚未达到 suspend_late
阶段。 这意味着,从锁定处理wakelock中断或freezeable线程总是有效,但如果你锁定一个wakelock从suspend_late
处理程序,你也必须返回一个错误中止暂停从该处理程序。 您可以使用wakelocks允许用户空间来决定哪些键应该唤醒全系统和屏幕打开。 使用 set_irq_wake
或平台特定的API,确保了CPU键盘中断唤醒。 一旦键盘驱动程序已恢复,事件序列可以看起来像这样:
- 当键盘驱动程序收到一个中断,锁键盘扫描wakelock,并开始扫描矩阵键盘。
- 键盘扫描代码检测报告,一个关键的变化和它的输入事件驱动。
- 输入事件司机看到了重要变化,入队事件,并锁定了输入事件队列wakelock。
- 键盘扫描码举行检测到没有键和解锁键盘扫描wakelock。
- 用户空间的输入事件/投票线程返回从选择,锁定过程输入事件wakelock,并要求在输入设备读取事件。
- 输入事件驱动出队的关键事件,并自队列现在是空的,解锁输入事件队列wakelock。
- 用户空间的输入事件线程返回来自阅读。 它决定,关键不应该唤醒全系统,释放过程输入事件wakelock,并要求选择或调查。
简单的序列图说明了这些步骤:
键按键释放| |键盘扫描++++++++++++++++++++++输入事件队列+ + + + + +过程的输入事件+ + + + + +
驱动程序API
驱动程序可以使用wakelock API来添加wakelock其状态变量和调用 wake_lock_init
,如下面的代码片段所示:
结构状态{结构wakelock wakelock;}的init(){wake_lock_init(&国家> wakelock,WAKE_LOCK_SUSPEND,“wakelockname”);}在释放内存,wake_lock_destroy必须调用:uninit(){wake_lock_destroy(&国家> wakelock);}
当驱动程序确定,它需要运行(通常在一个中断处理程序),它调用 wake_lock
:
wake_lock(&国家> wakelock);
当它不再需要运行,它调用 wake_unlock
:
wake_unlock(&国家> wakelock);
它也可以拨打 wake_lock_timeout
释放延期的wakelock后:
wake_lock_timeout(&国家> wakelock,赫兹);
这个工程是否wakelock已经举行。 它是有用的,如果司机醒来的系统不使用wakelocks但仍需要运行的其他部分。 避免这种可能的时候,因为它会浪费功率,如果超时是长或可能无法完成所需的工作,如果超时是短暂的。
用户空间的API
写 lockname
或 lockname超时
到 /系统/电源/ wake_lock
锁,如果需要,创建一个wakelock。 这里超时中指定纳秒。 写 lockname
到 /系统/电源/ wake_unlock
解锁用户wakelock。
不要使用随机生成的wakelock名称,没有API释放一个用户空间wakelock。
尾流类型锁
唤醒锁定 | 说明 |
---|---|
ACQUIRE_CAUSES_WAKEUP | 通常醒来锁实际上没有唤醒器件,他们只是导致它留在一旦它已经开始。 想想作为视频播放器应用程序的正常行为。 弹出通知,并希望设备上是例外;使用此标志能像她们一样。 |
FULL_WAKE_LOCK | 唤醒锁,以确保它的屏幕和键盘以全亮度。 |
ON_AFTER_RELEASE | 当这个锁被释放后,捅活动定时器,用户在屏幕上停留了一会儿。 |
PARTIAL_WAKE_LOCK | 唤醒锁定确保CPU运行。 屏幕可能不在。 |
SCREEN_BRIGHT_WAKE_LOCK | 唤醒锁,可确保屏幕上全亮度,键盘背光将被允许去了。 |
SCREEN_DIM_WAKE_LOCK | 唤醒锁,可确保屏幕上,但键盘背光将被允许熄灭,屏幕背光将被允许进入暗淡。 |
探索唤醒锁为例
所有电源管理要求遵循相同的基本格式:
- 获取句柄
PowerManager的
服务。 - 创建一个唤醒锁,并指定屏幕,超时,电源管理等标志
- 收购后锁定。
- 执行操作(播放MP3,打开HTML等网页)。
- 释放后锁定。
下面的代码段说明了这一过程。
PowerManager的下午=(PowerManager的)mContext.getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock册= pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE,豪); wl.acquire(); / / ... wl.release( );
PowerManager的类
Android框架,公开的电源管理服务和应用程序通过 PowerManager的
类。
用户空间本地库(任何功能在硬件 / /设备/库/硬件/
旨在作为Android的支持运行时库)管理不应该直接调用到电力机器人(见上图)。 绕过了Android运行时的电源管理政策将破坏系统。
到电源管理所有来电应通过Android运行时PowerManager的宣传短片。
请访问 http://code.google.com/android/reference/android/os/PowerManager.html 一个例子说明API和。
与PM驱动程序注册驱动程序
你可以注册与Android电源管理驱动内核级驱动程序,以便他们立即通知之前或之后关闭电源上电。 例如,可以设置显示驱动程序完全关闭电源时,请求进入到权力从用户空间(男男性接触者看到了Android的示例实现的MDDI显示驱动器)了。
要注册与Android下午司机驾驶,实施回拨处理程序和登记的Android下午在下面的代码片段所示,其中:
android_register_early_suspend(android_early_suspend_t *处理器)android_register_early_resume(android_early_resume_t *处理)
这是在驱动器立即返回,而不是等待什么发生在回调关键。
早期暂停
早,暂停API允许司机在得到通知时,用户空间写入 /系统/电源/ request_state
,表明用户可见睡眠状态应该改变。 暂停处理程序称为低到高的顺序(4 - 1所示)和resume处理程序称为高次低(1 - 4节)。
EARLY_SUSPEND_LEVEL_BLANK_SCREEN
:- 在暂停:屏幕应该关闭,但仍必须在framebuffer的访问。
- 在恢复:屏幕可重新开启。
EARLY_SUSPEND_LEVEL_STOP_DRAWING
:- 关于暂停:此级别通知用户空间,它应该停止访问framebuffer和它等待它完成。
- 在简历:它通知用户空间,它应该恢复屏幕访问。 提供两种方法,控制台开关或一个sysfs接口。
EARLY_SUSPEND_LEVEL_DISABLE_FB
:关闭的framebuffer- 在暂停:关闭的framebuffer
- 在恢复:打开framebuffer的回去。
EARLY_SUSPEND_LEVEL_STOP_INPUT
:- 在暂停:关闭输入设备不属于能够唤醒唤醒或者被禁用。
- 在恢复:打开相同的设备回去。