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 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但仍需要运行的其他部分。 避免这种可能的时候,因为它会浪费功率,如果超时是长或可能无法完成所需的工作,如果超时是短暂的。
写 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的
服务。
下面的代码段说明了这一过程。
PowerManager的下午=(PowerManager的)mContext.getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock册= pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE,豪); wl.acquire(); / / ... wl.release( );
Android框架,公开的电源管理服务和应用程序通过 PowerManager的
类。
用户空间本地库(任何功能在硬件 / /设备/库/硬件/
旨在作为Android的支持运行时库)管理不应该直接调用到电力机器人(见上图)。 绕过了Android运行时的电源管理政策将破坏系统。
到电源管理所有来电应通过Android运行时PowerManager的宣传短片。
请访问 http://code.google.com/android/reference/android/os/PowerManager.html 一个例子说明API和。
你可以注册与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
:
EARLY_SUSPEND_LEVEL_STOP_DRAWING
:
EARLY_SUSPEND_LEVEL_DISABLE_FB
:关闭的framebuffer
EARLY_SUSPEND_LEVEL_STOP_INPUT
: