and5.1PowerManagerService深入分析(三)updatePowerStateLocked函数
来源:互联网 发布:跳舞直播软件 编辑:程序博客网 时间:2024/05/18 13:41
PMS更新各个状态,最终都会调用updatePowerStateLocked函数,下面我们来分析下
- private void updatePowerStateLocked() {
- if (!mSystemReady || mDirty == 0) {
- return;
- }
- if (!Thread.holdsLock(mLock)) {
- Slog.wtf(TAG, "Power manager lock was not held when calling updatePowerStateLocked");
- }
-
- Trace.traceBegin(Trace.TRACE_TAG_POWER, "updatePowerState");
- try {
-
- updateIsPoweredLocked(mDirty);
- updateStayOnLocked(mDirty);
- updateScreenBrightnessBoostLocked(mDirty);
updateIsPoweredLocked函数,先是要dirty有DIRTY_BATTERY_STATE标志位。我们在下面分析下,什么时候会有这个标志位
- private void updateIsPoweredLocked(int dirty) {
- if ((dirty & DIRTY_BATTERY_STATE) != 0) {
- final boolean wasPowered = mIsPowered;
- final int oldPlugType = mPlugType;
- final boolean oldLevelLow = mBatteryLevelLow;
- mIsPowered = mBatteryManagerInternal.isPowered(BatteryManager.BATTERY_PLUGGED_ANY);
- mPlugType = mBatteryManagerInternal.getPlugType();
- mBatteryLevel = mBatteryManagerInternal.getBatteryLevel();
- mBatteryLevelLow = mBatteryManagerInternal.getBatteryLevelLow();
-
- if (DEBUG_SPEW) {
- Slog.d(TAG, "updateIsPoweredLocked: wasPowered=" + wasPowered
- + ", mIsPowered=" + mIsPowered
- + ", oldPlugType=" + oldPlugType
- + ", mPlugType=" + mPlugType
- + ", mBatteryLevel=" + mBatteryLevel);
- }
-
- if (wasPowered != mIsPowered || oldPlugType != mPlugType) {
- mDirty |= DIRTY_IS_POWERED;
-
-
- final boolean dockedOnWirelessCharger = mWirelessChargerDetector.update(
- mIsPowered, mPlugType, mBatteryLevel);
-
-
-
-
-
-
- final long now = SystemClock.uptimeMillis();
- if (shouldWakeUpWhenPluggedOrUnpluggedLocked(wasPowered, oldPlugType,
- dockedOnWirelessCharger)) {
- wakeUpNoUpdateLocked(now, Process.SYSTEM_UID);
- }
- userActivityNoUpdateLocked(
- now, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID);
-
-
-
- if (dockedOnWirelessCharger) {
- mNotifier.onWirelessChargingStarted();
- }
- }
-
- if (wasPowered != mIsPowered || oldLevelLow != mBatteryLevelLow) {
- if (oldLevelLow != mBatteryLevelLow && !mBatteryLevelLow) {
- if (DEBUG_SPEW) {
- Slog.d(TAG, "updateIsPoweredLocked: resetting low power snooze");
- }
- mAutoLowPowerModeSnoozing = false;
- }
- updateLowPowerModeLocked();
- }
- }
- }
首先systemReady函数最终会把mDirty置位为DIRTY_BATTERY_STATE,还有收BatterySevice发出来的广播,最总也会置这个标志位。
- private final class BatteryReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- synchronized (mLock) {
- handleBatteryStateChangedLocked();
- }
- }
- }
- private void handleBatteryStateChangedLocked() {
- mDirty |= DIRTY_BATTERY_STATE;
- updatePowerStateLocked();
- }
再来看看电池状态发生什么变化要唤醒设备:
- private boolean shouldWakeUpWhenPluggedOrUnpluggedLocked(
- boolean wasPowered, int oldPlugType, boolean dockedOnWirelessCharger) {
-
- if (!mWakeUpWhenPluggedOrUnpluggedConfig) {
- return false;
- }
-
-
-
- if (wasPowered && !mIsPowered
- && oldPlugType == BatteryManager.BATTERY_PLUGGED_WIRELESS) {
- return false;
- }
-
-
-
- if (!wasPowered && mIsPowered
- && mPlugType == BatteryManager.BATTERY_PLUGGED_WIRELESS
- && !dockedOnWirelessCharger) {
- return false;
- }
-
-
- if (mIsPowered && mWakefulness == WAKEFULNESS_DREAMING) {
- return false;
- }
-
-
- if (mTheaterModeEnabled && !mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig) {
- return false;
- }
-
-
- return true;
- }
继续分析updatePowerStateLocked函数,分析updateStayOnLocked函数。一般这个函数mStatyon为fasle,除非在资源中设置哪种充电状态下可以长亮。
- private void updateStayOnLocked(int dirty) {
- if ((dirty & (DIRTY_BATTERY_STATE | DIRTY_SETTINGS)) != 0) {
- final boolean wasStayOn = mStayOn;
- if (mStayOnWhilePluggedInSetting != 0
- && !isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked()) {
- mStayOn = mBatteryManagerInternal.isPowered(mStayOnWhilePluggedInSetting);
- } else {
- mStayOn = false;
- }
-
- if (mStayOn != wasStayOn) {
- mDirty |= DIRTY_STAY_ON;
- }
- }
- }
继续分析updatePowerStateLocked函数的updateScreenBrightnessBoostLocked函数,这个函数是更新屏幕是否保持最亮状态
- private void updateScreenBrightnessBoostLocked(int dirty) {
- if ((dirty & DIRTY_SCREEN_BRIGHTNESS_BOOST) != 0) {
- if (mScreenBrightnessBoostInProgress) {
- final long now = SystemClock.uptimeMillis();
- mHandler.removeMessages(MSG_SCREEN_BRIGHTNESS_BOOST_TIMEOUT);
- if (mLastScreenBrightnessBoostTime > mLastSleepTime) {
- final long boostTimeout = mLastScreenBrightnessBoostTime +
- SCREEN_BRIGHTNESS_BOOST_TIMEOUT;
- if (boostTimeout > now) {
- Message msg = mHandler.obtainMessage(MSG_SCREEN_BRIGHTNESS_BOOST_TIMEOUT);
- msg.setAsynchronous(true);
- mHandler.sendMessageAtTime(msg, boostTimeout);
- return;
- }
- }
- mScreenBrightnessBoostInProgress = false;
- userActivityNoUpdateLocked(now,
- PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID);
- }
- }
- }
下面看看MSG_SCREEN_BRIGHTNESS_BOOST_TIMEOUT消息的处理函数。
- case MSG_SCREEN_BRIGHTNESS_BOOST_TIMEOUT:
- handleScreenBrightnessBoostTimeout();
- break;
- private void handleScreenBrightnessBoostTimeout() {
- synchronized (mLock) {
- if (DEBUG_SPEW) {
- Slog.d(TAG, "handleScreenBrightnessBoostTimeout");
- }
-
- mDirty |= DIRTY_SCREEN_BRIGHTNESS_BOOST;
- updatePowerStateLocked();
- }
- }
接下来看updatePowerStateLocked函数的另一个阶段:-
-
-
- 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;
- }
- }
先看下updateWakeLockSummaryLocked函数,更新wakelock的函数
- private void updateWakeLockSummaryLocked(int dirty) {
- if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_WAKEFULNESS)) != 0) {
- mWakeLockSummary = 0;
-
- final int numWakeLocks = mWakeLocks.size();
- for (int i = 0; i < numWakeLocks; i++) {
- final WakeLock wakeLock = mWakeLocks.get(i);
- switch (wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK) {
- case PowerManager.PARTIAL_WAKE_LOCK:
- mWakeLockSummary |= WAKE_LOCK_CPU;
- break;
- case PowerManager.FULL_WAKE_LOCK:
- mWakeLockSummary |= WAKE_LOCK_SCREEN_BRIGHT | WAKE_LOCK_BUTTON_BRIGHT;
- break;
- case PowerManager.SCREEN_BRIGHT_WAKE_LOCK:
- mWakeLockSummary |= WAKE_LOCK_SCREEN_BRIGHT;
- break;
- case PowerManager.SCREEN_DIM_WAKE_LOCK:
- mWakeLockSummary |= WAKE_LOCK_SCREEN_DIM;
- break;
- case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK:
- mWakeLockSummary |= WAKE_LOCK_PROXIMITY_SCREEN_OFF;
- break;
- case PowerManager.DOZE_WAKE_LOCK:
- mWakeLockSummary |= WAKE_LOCK_DOZE;
- break;
- }
- }
-
-
- if (mWakefulness != WAKEFULNESS_DOZING) {
- mWakeLockSummary &= ~WAKE_LOCK_DOZE;
- }
- if (mWakefulness == WAKEFULNESS_ASLEEP
- || (mWakeLockSummary & WAKE_LOCK_DOZE) != 0) {
- mWakeLockSummary &= ~(WAKE_LOCK_SCREEN_BRIGHT | WAKE_LOCK_SCREEN_DIM
- | WAKE_LOCK_BUTTON_BRIGHT);
- if (mWakefulness == WAKEFULNESS_ASLEEP) {
- mWakeLockSummary &= ~WAKE_LOCK_PROXIMITY_SCREEN_OFF;
- }
- }
-
-
- if ((mWakeLockSummary & (WAKE_LOCK_SCREEN_BRIGHT | WAKE_LOCK_SCREEN_DIM)) != 0) {
- if (mWakefulness == WAKEFULNESS_AWAKE) {
- mWakeLockSummary |= WAKE_LOCK_CPU | WAKE_LOCK_STAY_AWAKE;
- } else if (mWakefulness == WAKEFULNESS_DREAMING) {
- mWakeLockSummary |= WAKE_LOCK_CPU;
- }
- }
-
- if (DEBUG_SPEW) {
- Slog.d(TAG, "updateWakeLockSummaryLocked: mWakefulness="
- + PowerManagerInternal.wakefulnessToString(mWakefulness)
- + ", mWakeLockSummary=0x" + Integer.toHexString(mWakeLockSummary));
- }
- }
- }
下面分析下updateUserActivitySummaryLocked函数
- private void updateUserActivitySummaryLocked(long now, int dirty) {
-
- if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY
- | DIRTY_WAKEFULNESS | DIRTY_SETTINGS)) != 0) {
- mHandler.removeMessages(MSG_USER_ACTIVITY_TIMEOUT);
-
- long nextTimeout = 0;
- if (mWakefulness == WAKEFULNESS_AWAKE
- || mWakefulness == WAKEFULNESS_DREAMING
- || mWakefulness == WAKEFULNESS_DOZING) {
- final int sleepTimeout = getSleepTimeoutLocked();
- final int screenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout);
- final int screenDimDuration = getScreenDimDurationLocked(screenOffTimeout);
-
- mUserActivitySummary = 0;
- if (mLastUserActivityTime >= mLastWakeTime) {
- nextTimeout = mLastUserActivityTime
- + screenOffTimeout - screenDimDuration;
- if (now < nextTimeout) {
- mUserActivitySummary = USER_ACTIVITY_SCREEN_BRIGHT;
- } else {
- nextTimeout = mLastUserActivityTime + screenOffTimeout;
- if (now < nextTimeout) {
- mUserActivitySummary = USER_ACTIVITY_SCREEN_DIM;
- }
- }
- }
- if (mUserActivitySummary == 0
- && mLastUserActivityTimeNoChangeLights >= mLastWakeTime) {
- nextTimeout = mLastUserActivityTimeNoChangeLights + screenOffTimeout;
- if (now < nextTimeout) {
- if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_BRIGHT) {
- mUserActivitySummary = USER_ACTIVITY_SCREEN_BRIGHT;
- } else if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DIM) {
- mUserActivitySummary = USER_ACTIVITY_SCREEN_DIM;
- }
- }
- }
- if (mUserActivitySummary == 0) {
- if (sleepTimeout >= 0) {
- final long anyUserActivity = Math.max(mLastUserActivityTime,
- mLastUserActivityTimeNoChangeLights);
- if (anyUserActivity >= mLastWakeTime) {
- nextTimeout = anyUserActivity + sleepTimeout;
- if (now < nextTimeout) {
- mUserActivitySummary = USER_ACTIVITY_SCREEN_DREAM;
- }
- }
- } else {
- mUserActivitySummary = USER_ACTIVITY_SCREEN_DREAM;
- nextTimeout = -1;
- }
- }
- if (mUserActivitySummary != 0 && nextTimeout >= 0) {
- Message msg = mHandler.obtainMessage(MSG_USER_ACTIVITY_TIMEOUT);
- msg.setAsynchronous(true);
- mHandler.sendMessageAtTime(msg, nextTimeout);
- }
- } else {
- mUserActivitySummary = 0;
- }
MSG_USER_ACTIVITY_TIMEOUT的消息处理
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_USER_ACTIVITY_TIMEOUT:
- handleUserActivityTimeout();
- break;
- private void handleUserActivityTimeout() {
- synchronized (mLock) {
- if (DEBUG_SPEW) {
- Slog.d(TAG, "handleUserActivityTimeout");
- }
-
- mDirty |= DIRTY_USER_ACTIVITY;
- updatePowerStateLocked();
- }
- }
继续分析函数updateWakefulnessLocked
- private boolean updateWakefulnessLocked(int dirty) {
- boolean changed = false;
- if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY | DIRTY_BOOT_COMPLETED
- | DIRTY_WAKEFULNESS | DIRTY_STAY_ON | DIRTY_PROXIMITY_POSITIVE
- | DIRTY_DOCK_STATE)) != 0) {
- if (mWakefulness == WAKEFULNESS_AWAKE && isItBedTimeYetLocked()) {
- if (DEBUG_SPEW) {
- Slog.d(TAG, "updateWakefulnessLocked: Bed time...");
- }
- final long time = SystemClock.uptimeMillis();
- if (shouldNapAtBedTimeLocked()) {
- changed = napNoUpdateLocked(time, Process.SYSTEM_UID);
- } else {
- changed = goToSleepNoUpdateLocked(time,
- PowerManager.GO_TO_SLEEP_REASON_TIMEOUT, 0, Process.SYSTEM_UID);
- }
- }
- }
- return changed;
- }
再来看看isItBedTimeYetLocked函数
- private boolean isItBedTimeYetLocked() {
- return mBootCompleted && !isBeingKeptAwakeLocked();
- }
isBeingKeptAwakeLocked函数,如果isBeingKeptAwakeLocked返回true代表处于亮屏状态,isItBedTimeYetLocked返回false,上面的for死循环退出
- private boolean isBeingKeptAwakeLocked() {
- return mStayOn
- || mProximityPositive
- || (mWakeLockSummary & WAKE_LOCK_STAY_AWAKE) != 0
- || (mUserActivitySummary & (USER_ACTIVITY_SCREEN_BRIGHT
- | USER_ACTIVITY_SCREEN_DIM)) != 0
- || mScreenBrightnessBoostInProgress;
- }
如果isBeingKeptAwakeLocked返回false,并且mBootCompleted 为true开机完成了。那么updateWakefulnessLocked函数进入判断条件
那再来看看shouldNapAtBedTimeLocked函数,就是看有没有做梦这个设置,如果没有直接到goToSleepNoUpdateLocked函数,到了goToSleepNoUpdateLocked函数后将mWakefulness 设为WAKEFULNESS_DOZING显示返回true还要继续循环,下次到updateWakefulnessLocked这个函数,不是awake类型的,也返回false,直接退出死循环了。到napNoUpdateLocked函数也是一样的先是将mWakefulness置为WAKEFULNESS_DREAMING,返回true,继续循环,下次不是awake类型就返回false,退出循环了。
- private boolean shouldNapAtBedTimeLocked() {
- return mDreamsActivateOnSleepSetting
- || (mDreamsActivateOnDockSetting
- && mDockState != Intent.EXTRA_DOCK_STATE_UNDOCKED);
- }
下面分析就是updateDisplayPowerStateLocked函数要和Display交互。放在下一篇博客分析。