您的位置:首页 > 移动开发 > Android开发

关于调试android不能睡眠问题的小技巧

2012-01-07 11:11 274 查看
【问题】

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等等

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android java