【问题】
android设备有时插上充电器或别的操作后,会使设备无法进入suspend状态,可以使用下面的方法先观察一下;
【初步分析】
不能睡眠的原因可能是有代码执行了wake_lock而没有进行wake_unlock;
对于不是使用超时方式实现的wake_lock,必须要在suspend之前进行wake_unlock, 否则系统无法suspend;
由于这种原因导致的不能睡眠,可以在下面的代码加log,打印出来加lock时起的名字,能打印出java层lock时的name,这样就容易定位了;
【技巧】
在 kernel/power/wacklock.c的has_wake_lock_locked中加上name的打印,在return -1之前加上下面语句,
printk(KERN_CRIT "%s@%d lockname=%s, lockflag=0x%x", __func__, __LINE__, lock->name, lock->flags);
如图:
注意如果是在调用函数的has_wake_lock_locked的wake_unlock里加入打印name的名字,得到的有可能不是真正加锁时的名字,可能是main等名字,原因还不太清楚;
补充:
1. log中的名字是在java中用这个函数加锁的,
Power.acquireWakeLock(Power.PARTIAL_WAKE_LOCK,"YourLockLocationName");
2. 这样打印出的lock比较多,会比较慢,可以屏蔽掉自己熟悉的,比如 ipu 、PowerManagerService等等