1.调用栈打印
StackTraceElement st[] = Thread.currentThread().getStackTrace();
for (int i = 0; i < st.length; i++) {
System.out.println("showInput-Stack["+i+"]"+ st[i].toString());}
2.setpowermode 中powermode对应关系
surfaceflinger层面
Off = 0
Doze = 1
On = 2
DozeSuspend = 3
3.开发者选项触摸小圆点在InputReader阶段进行绘制,具体绘制是在frameworks/base/libs/input/TouchSpotController.cpp中updateSprite函数中。
void TouchSpotController::Spot::updateSprite(const SpriteIcon* icon, float x, float y,
int32_t displayId) {
sprite->setLayer(Sprite::BASE_LAYER_SPOT + id);
sprite->setAlpha(alpha);
sprite->setTransformationMatrix(SpriteTransformationMatrix(scale, 0.0f, 0.0f, scale));
sprite->setPosition(x, y);
sprite->setDisplayId(displayId);
...
}
4.Power键亮灭屏log关键字;
【1】:kernel 上报power key[kernel log]
[53:pmic_thread]kpd: Power Key generate, pressed=0
【2】:上层收到按键事件[eng版本上才有此log,main_log]
WindowManager: interceptKeyTq keycode=26 ...
【3】PMS的wakeUp被调用[sys_log]
PowerManagerService: Waking up from Dozing
【4】:准备绘制界面[sys_log]
DisplayPowerController: Blocking screen on until initial contents have been drawn.
【5】:第一个wiating for drawn表示keyguard画完,开始画window[sys_log]
WindowManager: Waiting for drawn Window{6732b98 u0 com.android.settings/com.android.settings.SubSettings}:
【6】:底层resume时间L版本 setAutoSuspend/M版本 setPowerMode【main_log】
注意:这个log出现的时间点不是固定的,要看底层resume的时间
SurfaceControl: Excessive delay in setPowerMode(): 403ms【M 版本】
PowerManagerService-JNI: Excessive delay in autosuspend_disable() while turning screen on: 424ms【L版本】
【7】:绘制界面完成及花费的时间[sys_log]
DisplayPowerController: Unblocked screen on after 409 ms
【8】:上层设置背光[sys_log]
DisplayPowerState: Requesting new screen state: state=ON, backlight=211
【9】:底层设置背光[sys_log,亮屏时间=power key到此处的时间,不一定每个版本都有此log,kernel log]
提示:如果出现此log表示屏幕已经点亮
PhotonicModulat][name:leds&][LED]Set Backlight directly 211 at time 4294992661, mapping level is 211
【10】:亮屏操作完成[sys_log]
DisplayPowerController: Finished business
5.影响亮屏快慢的因素大致有三种:
1)设置背光流程出问题了,导致屏幕黑屏
2)window绘制时间过长,导致屏幕block时间过长
3)底层surfacecontroller准备时间过长
而根据遇到的亮屏慢的问题,基本上都是由于window绘制时间过长,导致屏幕亮屏慢
最近处理的几个亮屏慢的问题,其中关键log信息基本都是:
13-11 11:17:49.002 1313 1092 I DisplayPowerController: Blocking screen on until initial contents have been drawn.
12-18 11:18:55.020 1313 1092 I DisplayPowerController: Unblocked screen on after 6018 ms
6.
关于触发拯救模式,导致机器进入recovery。
拯救模式又称救援模式,是Android 8.0新增的一个功能。
问题场景如下:进入隐私空间,长按控制中心的移动数据按钮,此时com.android.phone进程报停,还有一定的几率进入recovery。
由于com.android.phone或者com.android.systemui是个常驻进程,不断的重启,又不断的died,所以触发救援模式。
救援模式:在com.android.phone进程的不断started与died的过程中,level等级被不断的提升,一旦到达FACTORY_RESET等级,系统就会自主进入recovery(注:最后一句log是自行添加的,用来判断是哪个进程导致触发救援模式)。
W RescueParty: Attempting rescue level RESET_SETTINGS_UNTRUSTED_DEFAULTS
W RescueParty: Attempting rescue level RESET_SETTINGS_UNTRUSTED_CHANGES
W RescueParty: Attempting rescue level RESET_SETTINGS_TRUSTED_DEFAULTS
W RescueParty: Attempting rescue level WARM_REBOOT
W RescueParty: Attempting rescue level FACTORY_RESET
所以处理进入recovery的问题,首先就要判断是不是救援模式被触发了。
7.冻屏问题总结
首先按menu看是否有反应,有反应说明不是死机冻屏
冻屏,出现过如下三种现象:
定屏1:按虚拟键有背景色,无法响应任何触摸事件,音量键无作用,power键有作用,ADB能连;
定屏2:按虚拟键无背景色,power键有作用,ADB能连;
定屏3:power键都无作用,ADB能连;
根据描述可见,如上三个现象,严重程度递增
8.Input debug开关
先执行enable_input_prop.bat脚本,然后
adb shell "getprop persist.log.tag.InputTransportPublisher"看下属性是否设置成功。成功了再抓下log
enable_input_prop.bat
@echo off
:: 设置Android系统属性以启用InputTransportPublisher的调试日志
adb shell "setprop persist.log.tag.InputTransportPublisher DEBUG"
adb shell "setprop persist.log.tag.InputDispatcherTouchMode DEBUG"
adb shell "setprop persist.log.tag.InputDispatcherTouchOcclusion DEBUG"
adb shell "setprop persist.log.tag.InputDispatcherInboundEvent DEBUG"
adb shell "setprop persist.log.tag.InputDispatcherOutboundEvent DEBUG"
adb shell "setprop persist.log.tag.InputDispatcherDispatchCycle DEBUG"
adb shell "setprop persist.log.tag.InputDispatcherChannelCreation DEBUG"
adb shell "setprop persist.log.tag.InputDispatcherFocus DEBUG"
adb shell "setprop persist.log.tag.InputDispatcherAppSwitch DEBUG"
echo [SUCCESS] set property : persist.log.tag.InputTransportPublisher=DEBUG
pause