En el primer análisis del modo Doze de Android 8.1 (1) sabemos que después de ingresar al modo Doze profundo, llamamos al setDeviceIdleMode () de PowerManagerService.java para liberar WakeLock. Ahora comenzamos a analizar el proceso de lanzamiento de WakeLock
PowerManagerService.java -> setDeviceIdleMode ()
@Override
public boolean setDeviceIdleMode(boolean enabled) {
return setDeviceIdleModeInternal(enabled);
}
PowerManagerService.java -> setDeviceIdleModeInternal ()
boolean setDeviceIdleModeInternal(boolean enabled) {
synchronized (mLock) {
if (mDeviceIdleMode == enabled) {
return false;
}
mDeviceIdleMode = enabled;
updateWakeLockDisabledStatesLocked();
}
if (enabled) {
EventLogTags.writeDeviceIdleOnPhase("power");
} else {
EventLogTags.writeDeviceIdleOffPhase("power");
}
return true;
}
PowerManagerService.java -> updateWakeLockDisabledStatesLocked ()
private void updateWakeLockDisabledStatesLocked() {
boolean changed = false;
final int numWakeLocks = mWakeLocks.size();
for (int i = 0; i < numWakeLocks; i++) {
final WakeLock wakeLock = mWakeLocks.get(i);
if ((wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK)
== PowerManager.PARTIAL_WAKE_LOCK) {
if (setWakeLockDisabledStateLocked(wakeLock)) {
changed = true;
if (wakeLock.mDisabled) {
// This wake lock is no longer being respected.
notifyWakeLockReleasedLocked(wakeLock);
} else {
notifyWakeLockAcquiredLocked(wakeLock);
}
}
}
}
if (changed) {
mDirty |= DIRTY_WAKE_LOCKS;
updatePowerStateLocked();
}
}
¿Está familiarizado con él aquí? Es lo mismo de lo que hablamos en la optimización de la hibernación en espera de la aplicación de administración de ahorro de energía (6) de Android Sprd