PowerManagerService学习总结

目录

 

申请唤醒锁流程:

释放唤醒锁流程:

待机流程:

亮屏流程:

亮屏流程中相关log:



申请唤醒锁流程:


PowerManager.WakeLock.acquire--
    PowerManagerService.acquireWakeLock---acquireWakeLockInternal--updatePowerStateLocked
        ---WakeLockSuspendBlocker.acquire---nativeAcquireSuspendBlocker
            ---PowerManagerService.cpp中的nativeAcquireSuspendBlocker---acquire_wake_lock
                ---hardware目录中的 power.c 中的 acquire_wake_lock 这部的机理不清楚。


释放唤醒锁流程:


PowerManager.WakeLock.release--
    PowerManagerService.releaseWakeLock---releaseWakeLockInternal---removeWakeLockLocked--updatePowerStateLocked
        ---WakeLockSuspendBlocker.release---nativeReleaseSuspendBlocker
            ---PowerManagerService.cpp中的 nativeReleaseSuspendBlocker---release_wake_lock
                ---hardware目录中的 power.c 中的 release_wake_lock 这部的机理不清楚。

 


待机流程:


PowerManager.goToSleep---PowerManagerService.goToSleepWithReason---goToSleepNoUpdateLocked(更新变量值,发送通知等)---updatePowerStateLocked

------
updatePowerStateLocked中部分函数分析如下;
    //更新电池信息
    updateIsPoweredLocked(mDirty);
    //更新屏幕保持唤醒标识值mStayOn
    updateStayOnLocked(mDirty);
    //亮度增强相关
    updateScreenBrightnessBoostLocked(mDirty);
 //更新统计wakelock的标记值mWakeLockSummary
        updateWakeLockSummaryLocked(dirtyPhase1);
        //更新统计userActivity的标记值mUserActivitySummary和休眠到达时间
        updateUserActivitySummaryLocked(now, dirtyPhase1);
        //用来更新屏幕唤醒状态,状态改变返回true
        if (!updateWakefulnessLocked(dirtyPhase1)) {
// Phase 2: Update display power state.
    //和Display交互,更新设备显示状态
    boolean displayBecameReady = updateDisplayPowerStateLocked(dirtyPhase2);
    // Phase 3: Update dream state (depends on display ready signal).
    //比如是否继续屏保、Doze或者开始休眠
    updateDreamLocked(dirtyPhase2, displayBecameReady);
    // Phase 4: Send notifications, if needed.
    //如果wakefulness改变,做最后的收尾工作
    finishWakefulnessChangeIfNeededLocked(); 里面调用onWakefulnessChangeFinished
    // Phase 5: Update suspend blocker.
    // Because we might release the last suspend blocker here, we need to make 
    //surewe finished everything else first!
    //更新Suspend锁。上层申请的wakeLock在底层会映射为Suspend锁。
    updateSuspendBlockerLocked();
-----------------------
涉及与显示控制类DisplayPowerController 的交互。


亮屏流程:


Power键亮屏流程。
PhoneWindowManager.interceptKeyBeforeQueueing---PowerManagerService.wakeUp---wakeUpInternal---setWakefulnessLocked(通过Notifier.onWakefulnessChangeStarted 与其他服务交互,比如发送亮屏灭屏广播。)---
    Notifier.onWakefulnessChangeStar---handleEarlyInteractiveChange(亮屏前期的工作)--PhoneWindowManager.startedWakingUp(updateWakeGestureListenerLp,updateOrientationListenerLp, updateLockScreenTimeout,KeyguardDelegate )---updatePendingBroadcastLocked
    Notifier.onWakeUp---BatteryStats.noteWakeUp
        AppOps.noteOperation (AppService)
    userActivityNoUpdateLocked:负责更新系统和用户最后交互时间
updatePowerStateLocked
    updateDisplayPowerStateLocked
        DisplayManagerInternal.requestPowerState---DisplayManagerService.requestPowerState---DisplayPowerController.requestPowerState---sendUpdatePowerStateLocked---DisplayPowerController.updatePowerState(
        WindowManagerPolicy.screenTurnedOn:去通知PhoneWindowManager 做相关处理。
        ready 后发送sendOnStateChangedWithWakelock,里面会回调DisplayManagerInternal.DisplayPowerCallbacks的onStateChanged()方法,在里面调用updatePowerStateLocked)

------------------------
拔插USB线的亮屏:
当插拔USB时,BatteryService会调用sendIntentLocked发送 ACTION_Battery_CAHNGED 广播。PMS中对该广播进行监听,如果收到广播后,配置了插播USB时亮屏,则会进行亮屏操作。
在BatteryReceiver 中间接调用updatePowerStateLocked。
=============
几个核心类:
PowerManagerService
DisplayPowerController:显示的一些控制,电源、界面等。


亮屏流程中相关log:


Waking up from sleep 


 

你可能感兴趣的:(Android)