Android7.0 手机reboot进入系统后wake lock锁问题

本文详细分析了在Android 7.0系统中,手机经过reboot后出现wake lock锁未被释放的问题。问题源于‘ActivityManager-Sleep’ wakelock在手机启动进入系统后未被正确释放,导致设备无法正常进入休眠状态。通过对源码的跟踪,发现高通在该版本中的修改存在不合理之处,已向高通报告此问题。
摘要由CSDN通过智能技术生成

平台:msm8953 Android N

一、现象

手机连接电脑reboot,进入系统,终端使用命令adb shell dumpsys power查看信息有个wake lock锁,具体如下:
Wake Locks: size=2
PARTIAL_WAKE_LOCK ‘ActivityManager-Sleep’ ACQ=-6m22s755ms LONG (uid=1000 pid=1511)
DOZE_WAKE_LOCK ‘DreamManagerService’ ACQ=-6m11s170ms (uid=1000 pid=1511)

Suspend Blockers: size=4
PowerManagerService.WakeLocks: ref count=1
PowerManagerService.Display: ref count=0
PowerManagerService.Broadcasts: ref count=0
PowerManagerService.WirelessChargerDetector: ref count=0

Display Power: state=OFF

二、分析

首先根据log可以看出是“ActivityManager-Sleep”相关的wakelock没有被释放,查找到“ActivityManager-Sleep”所在定义:
/frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java

PowerManager.WakeLock mGoingToSleep;

    /**
     * At the time when the constructor runs, the power manager has not yet been
     * initialized.  So we initialize our wakelocks afterwards.
     */
    void initPowerManagement() {
        PowerManager pm = (PowerManager)mService.mContext.getSystemService(Context.POWER_SERVICE);
        mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep");//在此处定义
        mLaunchingActivity = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*launch*");
        mLaunchingActivity.setReferenceCounted(false);
    }

可以看到是mGoingToSleep这个wakelock,接下来查找mGoingToSleep的acquire:

void goingToSleepLocked() {
        scheduleSleepTimeout();
        if (!mGoingToSleep.isHeld()) {
            **mGoingToSleep.acquire();**
    
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值