Android 电源管理

来源:互联网 发布:一机多号软件 编辑:程序博客网 时间:2024/04/30 12:38

 

简介
唤醒锁
尾流类型锁
探索唤醒锁为例
PowerManager的类
与PM驱动程序注册驱动程序
早期暂停

简介

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键盘中断唤醒。 一旦键盘驱动程序已恢复,事件序列可以看起来像这样:

  1. 当键盘驱动程序收到一个中断,锁键盘扫描wakelock,并开始扫描矩阵键盘。
  2. 键盘扫描代码检测报告,一个关键的变化和它的输入事件驱动。
  3. 输入事件司机看到了重要变化,入队事件,并锁定了输入事件队列wakelock。
  4. 键盘扫描码举行检测到没有键和解锁键盘扫描wakelock。
  5. 用户空间的输入事件/投票线程返回从选择,锁定过程输入事件wakelock,并要求在输入设备读取事件。
  6. 输入事件驱动出队的关键事件,并自队列现在是空的,解锁输入事件队列wakelock。
  7. 用户空间的输入事件线程返回来自阅读。 它决定,关键不应该唤醒全系统,释放过程输入事件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唤醒锁,可确保屏幕上,但键盘背光将被允许熄灭,屏幕背光将被允许进入暗淡。

探索唤醒锁为例

所有电源管理要求遵循相同的基本格式:

 

  1. 获取句柄 PowerManager的 服务。
  2. 创建一个唤醒锁,并指定屏幕,超时,电源管理等标志
  3. 收购后锁定。
  4. 执行操作(播放MP3,打开HTML等网页)。
  5. 释放后锁定。

 

下面的代码段说明了这一过程。

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节)。

  1. EARLY_SUSPEND_LEVEL_BLANK_SCREEN
    • 在暂停:屏幕应该关闭,但仍必须在framebuffer的访问。
    • 在恢复:屏幕可重新开启。
  2. EARLY_SUSPEND_LEVEL_STOP_DRAWING
    • 关于暂停:此级别通知用户空间,它应该停止访问framebuffer和它等待它完成。
    • 在简历:它通知用户空间,它应该恢复屏幕访问。 提供两种方法,控制台开关或一个sysfs接口。
  3. EARLY_SUSPEND_LEVEL_DISABLE_FB:关闭的framebuffer
    • 在暂停:关闭的framebuffer
    • 在恢复:打开framebuffer的回去。
  4. EARLY_SUSPEND_LEVEL_STOP_INPUT
    • 在暂停:关闭输入设备不属于能够唤醒唤醒或者被禁用。
    • 在恢复:打开相同的设备回去。