「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战」
PowerManagerService简析
PowerManagerService是android系统电源管理的核心服务,在framework层进行控制管理,向hal层和kernel发送决策和指令控制设备的待机状态,设备开关机、熄屏和亮屏等硬件设备的状态。Android的电源管理主要通过wakeLock唤醒锁机制来控制系统的状态(通过锁和定时器来切换系统的的状态)。
电源管理框架
层次结构: App、Framework、HAL层和kernel层。
-
应用层: 主要是指应用程序和其他使用电源管理的服务,PowerManagerService、BatteryService等。应用接口层:PowerManager开放了一系列的接口,应用可以通过调用PowerManager的接口,申请wakelock,使系统唤醒或进入休眠。
-
框架层: 应用层调用的接口,对系统进行的一系列操作是PowerManagerService完成的。这是整个电源管理系统的决策系统。
在框架层包含了对应用层接口的API调用以及电源的协调工作。
主要包含的文件:
- PowerManager.java 提供给上层应用接口。
它是PMS的代理类,实现了reboot、gotoSleep、wakeUp、userActivity等接口
userActivity: 向PowerManagerService报告影响系统休眠的用户活动,重新及时,更新息屏时间,屏幕亮度等。
- PowerManagerService.java 电源管理系统的核心服务。
- com_android_server_PowerManagerService.cpp
- Power.java 提供给底层的函数接口,与JNI层进行交互。
- android_os_Power.cpp
核心服务PMS
PowerManager通过binder与PowerManagerService进行通信,PMS是整个电源管理的决策系统。
updatePowerStateLocked更新电源的状态,是PMS的核心方法,档电源的状态发生改变时,最终都会调用到这个方法。下面我们来分析一下方法的具体实现。
private void updatePowerStateLocked() { if (!mSystemReady || mDirty == 0) { return; } try { //更新电源的基本状态 updateIsPoweredLocked(mDirty); updateStayOnLocked(mDirty); updateScreenBrightnessBoostLocked(mDirty); //更新唤醒锁和用户活动 final long now = SystemClock.uptimeMillis(); int dirtyPhase2 = 0; for (;;) { int dirtyPhase1 = mDirty; dirtyPhase2 |= dirtyPhase1; mDirty = 0; //更新唤醒锁 updateWakeLockSummaryLocked(dirtyPhase1); //更新用户活动 updateUserActivitySummaryLocked(now, dirtyPhase1); if (!updateWakefulnessLocked(dirtyPhase1)) { break; } } // 更新displayPowerState boolean displayBecameReady = updateDisplayPowerStateLocked(dirtyPhase2); // 更新dream state updateDreamLocked(dirtyPhase2, displayBecameReady); // 发送通知 finishWakefulnessChangeIfNeededLocked(); //更新底层wakeLock唤醒锁 updateSuspendBlockerLocked(); } }