PowerManagerService简析

564 阅读2分钟

「这是我参与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();
            }
        }