1.当出现亮不起的时候,我们的传感器已经没有在工作(LED已经没在亮了)。
2.从底层的log信息如下可以看到这是因为有系统调用过来关闭我们的设备,而非是我们的设备出现异常所致!
解决此问题:
已经在原来你们在用的驱动加入了wake lock 机制,也可以升级机器做测试,已经测试1个多小时没发现问题。加入的原因如下:
3.从系统服务log对比差异处(下图有背色部分)
没有问题时的log:
出现问题时的log:
从上层代码 跟踪可以看到
这个区别是PowerManagerServer.java的
if (!updateWakefulnessLocked(dirtyPhase1))//条件不成立,造成此处的循环无法退出所致!
进入
privateboolean updateWakefulnessLocked(intdirty) {
booleanchanged = false;
if((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY | DIRTY_BOOT_COMPLETED
| DIRTY_WAKEFULNESS |DIRTY_STAY_ON | DIRTY_PROXIMITY_POSITIVE
| DIRTY_DOCK_STATE | DIRTY_BOOT_IPO| DIRTY_SD_STATE)) != 0) {
if(mWakefulness == WAKEFULNESS_AWAKE && isItBedTimeYetLocked()) {
if(DEBUG_SPEW) {
Slog.d(TAG, "updateWakefulnessLocked: Bedtime...");//对应log,当能亮起时是没有此打印,说明没进入,而亮不起来时是有此打印的说明进入!
}
finallong time = SystemClock.uptimeMillis();
if (shouldNapAtBedTimeLocked()){
changed = napNoUpdateLocked(time);
}else{
changed = goToSleepNoUpdateLocked(time,
PowerManager.GO_TO_SLEEP_REASON_TIMEOUT);//打印 PowerManagerService: Going to sleep due to screen timeout...
}
}
}
returnchanged;
}
从此接口可以看到 isItBedTimeYetLocked()接口为TRUE 时会亮不起来!展开此接口:
可以看到
isBeingKeptAwakeLocked()为false时会造成上面为TRUE,展开
阅读此接口的说明,可以看到此接口会在系统没有wake lock时会返回FALSE。
至于系统为什么没有wake lock,无法知悉!所以在驱动上加入此机制。