一、问题现象
按下Power key点亮屏幕时,很大概率出现先亮button light,然后再亮屏的现象,明显感觉到卡顿。
线索1、快速按下Power key熄灭和唤醒基本不会出现以上问题现象
线索2、长按Power key会同时亮LCD和button light
线索3、插入2G sdcard基本没有出现过以上问题,换成32G的class 10的sdcard之后就很大概率出现以上问题
Platform:MT6732
Android版本:4.4.4KK
BuildType:user
系统软件版本:SWA27+UM
系统RAM:1GB
参考机行为:
1、参考机1的机制是短按也同时亮button light和LCD,无法参考
2、参考机2与当前项目的机制相同,虽然也伴有卡顿,但是没有达到当前项目的程度,没有出现以上现象
二、Power key休眠和唤醒系统时的处理流程
这里仅说明按下Power key之后,Linux kernel态的休眠和唤醒流程。
1、休眠过程的主要步骤:
1) 冻结用户态进程和内核态任务
2) 调用注册的设备的suspend的回调函数, 顺序是按照注册顺序
3) 休眠核心设备和使CPU进入休眠态
冻结进程是内核把进程列表中所有的进程的状态都设置为停止,并且保存下所有进程的上下文. 当这些进程被解冻的时候,他们是不知道自己被冻结过的,只是简单的继续执行。
2、唤醒过程的主要步骤:
1) 休眠中的系统被Power key的按键中断唤醒,同时将按键事件放入输入设备的文件缓冲区中
2) 唤醒的顺序是和休眠的循序相反的,所以系统设备和总线会首先唤醒,使能系统中断,使能休眠时候停止掉的非启动CPU
3)继续唤醒每个设备,使能虚拟终端
4)继续来解冻进程和任务,唤醒终端
三、问题初步分析
初步分析结果:
通过分析log以及对应代码逻辑,发现Power key在分发时的状态出现了问题,最终导致处理流程异常。
下一步行动:
因为log中没有足够的信息来确认代码的执行流程,所以需要添加log再进一步确认问题并输出解决方案。
问题原理:
正常情况下:
1、Power key只有长按超过500ms才会通知上层点亮button light,其他按下power key的情况都不会点亮button light。
2、Power key短按经过预处理之后不会传递给上层,同样也不会点亮button light。
当前出问题的异常情况:
1、power key 在正常短按的时候通知上层点亮了button light,同时产生了异常的长按事件
四、问题进一步分析
进一步定义问题现象:
在插入sdcard的情况下,很大概率出现按下power key会点亮button light,然后再亮LCD,给用户的直接感觉就是卡顿一下。
进一步的分析结果:
插入sdcard出现问题的情况下:
从power key按下到用户空间接收到,花费了超过500ms的时间,导致inputdispatcher认为产生了长按事件,从而走了点亮button light的流程。
不插入sdcard的正常情况下:
从power key按下到用户空间接收到,花费200ms左右的时间,inputdispatcher认为是正常短按,不会走点亮button light的流程。
已知的问题原因: