目录
申请唤醒锁流程:
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 待机功能流程分析