PowerManagerService分析之PARTIAL_WAKE_LOCK

为什么申请了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都释放了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值