零、目的:
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架构的非常好的例子。