难点:
1、 概率问题本地难以复现,只能通过提供的log来分析
2、 干扰信息多,无法确定问题原因是锁屏状态还是第三方应用
3、 黑屏问题的调试分析难度大
分析思路:
此问题影响量产,因此集中人力攻关,大部分人的意见偏向于是锁屏解锁状态错乱导致的问题,但是通过log和视频来看,问题发生在锁屏解锁后,windowsManager已经切换到第三方应用的Activity界面,但是Activity在走了onResume后很快的走到了onPause,并且onPause失败,因此我偏向于是第三方应用引起的问题
但是因为framework中windowsManager和ActivityManager的log都是关闭的,因此关键的activity切换和报错信息没有打印出来,打开log的话,会影响性能,因此不能再正式版本上打开log调试,只能自己本地编译版本,刷机后,自行复现,抓log查看
最后,本地复现抓取log,发现每次问题发生时,在解锁后会启动一个无界面的Activity(com.igexin.sdk.GActivity),这个Activity会导致windowManager切换超时,在代码中超时等待时间正好是5S,5S后会启动正常的界面
后来发现这个Activity是某些第三方应用,用于应用消息推送的进程保活,会在某些条件下自启动,造成上述问题
解决办法:
1、 在fwk中的Activity.java > startActivity,判断intent是这个Activity则取消启动
2、 在SystemUI的开机广播中,禁用掉这个activity,只要开机则不允许这个activity启动
PackageManager mPm = mContext.getPackageManager();
ComponentName mComponentName = new ComponentName(“com.android.browser”,”com.igexin.sdk.GActivity”);
mPm.setComponentEnabledSetting(mComponentName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);