为什么申请了PARTIAL_WAKE_LOCK系统不会进str?
1 . acquireWakeLockInternal 把 wakelock加到mWakeLocks中;
2. updatePowerStateLocked -> updateWakeLockSummaryLocked -> getWakeLockSummaryFlags
把PowerManager.PARTIAL_WAKE_LOCK转化为mWakelockSummary = WAKE_LOCK_CPU;
3. updatePowerStateLocked -> updateSuspendBlockerLocked
// The suspend blocker used to keep the CPU alive when an application has acquired
// a wake lock.
private final SuspendBlocker mWakeLockSuspendBlocker;
private void updateSuspendBlockerLocked() {
//WAKE_LOCK_CPU的作用在这里
boolean needWakeLockSuspendBlocker = ((mWakeLockSummary & WAKE_LOCK_CPU) != 0);
...
...
// First acquire suspend blockers if needed.
if (needWakeLockSuspendBlocker && !mHoldingWakeLockSuspendBlocker) {
//SuspendBlocker申请,这样就把WAKE_LOCK_CPU和不进str联系起来了,
//由于SuspendBlocker,所以进不了str
mWakeLockSuspendBlocker.acquire();
mHoldingWakeLockSuspendBlocker = true;
}
...
...
// Then release suspend blockers if needed.
if (!needWakeLockSuspendBlocker && mHoldingWakeLockSuspendBlocker) {
mWakeLockSuspendBlocker.release();
mHoldingWakeLockSuspendBlocker = false;
}
}
public PowerManagerService(context){
....
synchronized (mLock) {
//在构造函数中创建
mWakeLockSuspendBlocker = createSuspendBlockerLocked("PowerManagerService.WakeLocks");
mDisplaySuspendBlocker = createSuspendBlockerLocked("PowerManagerService.Display");
mDisplaySuspendBlocker.acquire();
mHoldingDisplaySuspendBlocker = true;
mHalAutoSuspendModeEnabled = false;
mHalInteractiveModeEnabled = true;
mWakefulness = WAKEFULNESS_AWAKE;
sQuiescent = SystemProperties.get(SYSTEM_PROPERTY_QUIESCENT, "0").equals("1");
nativeInit();
nativeSetAutoSuspend(false);
nativeSetInteractive(true);
nativeSetFeature(POWER_FEATURE_DOUBLE_TAP_TO_WAKE, 0);
}
....
}
dumpsys power可以看到 wakelock和suspendblocker的数量
Wake Locks: size=6
PARTIAL_WAKE_LOCK 'wakeup_WakelockTag' ACQ=-2h23m42s456ms LONG (uid=1000 pid=5725)
PARTIAL_WAKE_LOCK 'LanHostRuntime' ON_AFTER_RELEASE ACQ=-4m13s653ms LONG (uid=1000 pid=15503)
SCREEN_BRIGHT_WAKE_LOCK 'com.gala.uniplayer.WakeModeSetter' ON_AFTER_RELEASE ACQ=-2s261ms (uid=10006 pid=8557)
PARTIAL_WAKE_LOCK 'AudioMix' ACQ=-1s946ms (uid=1041)
PARTIAL_WAKE_LOCK 'AudioMix' ACQ=-623ms (uid=1041 ws=WorkSource{10006})
SCREEN_BRIGHT_WAKE_LOCK 'WindowManager' ON_AFTER_RELEASE ACQ=-845ms (uid=1000 pid=3320 ws=WorkSource{10006})
Suspend Blockers: size=4
PowerManagerService.WakeLocks: ref count=1
PowerManagerService.Display: ref count=1
PowerManagerService.Broadcasts: ref count=0
PowerManagerService.WirelessChargerDetector: ref count=0
奇怪的是,app申请一个keep_screen_on, system_server进程windowmanager就会申请一个,退出的时候两个都没了,成对出现,怕是app被杀吗?测试了下,app被杀所有相关wakelock都释放了。