2.3.5/4.0.3/4.1PowerManager简单总结和心得体会

零、目的:

       4.4上的PowerManagerService(下称PMS)被完全重构了,在接手4.4 PMS之前对之前PowerManagerService做一个总结。

一、概述:

总的来说,PMS在庞大的Framework中算是很简单但是很经典的一个Service:

没有复杂的逻辑,整体架构非常清晰,上接应用提供接口,下承驱动,维护状态。

    对上,暴露接口主要分为两类:

     a.wakelock 唤醒锁类,此类接口主要给应用用来改变/保持系统的电源状态,

           拿住partial wakelock可以保持系统不进入深睡眠。

           拿住full wakelock 再或上cause_wake_up就可以点亮屏幕(参考锁屏)

           拿住和释放proximity_wakelock就可以激活/去激活距离传感器(参考phone)

            pokelock可以重置屏幕的超时(参考phone)

           需要注意的是,应用一定一定一定要记住释放partial的wakelock,否则就会引发很严重的功耗问题,

           常见的是一些第三方应用中拿锁不放,手机放置一晚上就没电了就是这原因。

      b. 设置屏幕/键盘灯亮度

            此类接口非常简单,用的地方也不多,主要就是往led的sys文件系统里的brightness节点写入需要的亮度值即可。


二、核心实现:

        PMS的所有状态的切换都是围绕着setPowerState这个方法来的,其他接口通过外界的”刺激“来改变mPowerState 或者mWakeLockSate,

        然后通过SetPowerState来更新状态,从而达到目的。

         例子不详细举了,相信能看到这里的人都看过代码,比较好的例子就是userAcitivy/acquireWakeLock

        既然说核心实现,其实PMS的大部分工作都可以简化为下面的几句话:

       1.  echo   wake_lock_name    >/sys/power/wake_lock     //held住 叫wake_lock_name的partial wakelock

        2.  echo  wake_lock_name  >/sys/power/wake_unlock   //释放  叫wake_lock_name 的partia  wakelock

        3.  echo    on >/sys/power/state                                   //唤醒系统

       4.   echo   mem  >/sys/power/state                               //挂起系统

         5 .  echo   brightness > /sys/class/leds/back-light/brightness   //设置背光亮度为brightness

        6.  echo   brightness  >  /sys/class/leds/button-light/brightness  //设置键盘灯亮度为brightness

       其他的都是在给这些实现来维护状态的,比如维护当前哪些应用拿了锁,做了哪些操作的时候需要将屏幕点亮/熄灭,屏幕超时的维护等等。

      搞明白这里我觉得就差不多了,PMS+LightService+batteryService组成了Framework中的电源管理,是一个学习framework架构的非常好的例子。

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值