做安卓13的项目时,客户反馈了这样的一个bug:“竖屏进入设置>旋转平板横屏>旋转平板进入竖屏>按返回键>提示报错”,系统里的设置是做了分屏处理的
复现该问题时抓取log,发现报了input无焦点ANR的问题:
07-21 07:00:59.097 1186 5139 I AnrManager: dumpAnrDebugInfo end: AnrDumpRecord{ Input dispatching timed out (Application does not have a focused window) ProcessRecord{8de1d06 1656:com.android.settings/1000} IsCompleted:true IsCancelled:false }, onlyDumpSelf = false , isSilentANR = false
07-21 07:00:59.098 1186 5139 I AnrManager: addErrorToDropBox app = ProcessRecord{8de1d06 1656:com.android.settings/1000} processName = com.android.settings activityShortComponentName = com.android.settings/.Settings$NetworkDashboardActivity parentShortComponentName = com.android.settings/.Settings parentProcess = ProcessRecord{8de1d06 1656:com.android.settings/1000} annotation = Input dispatching timed out (Application does not have a focused window) mTracesFile = /data/anr/anr_2023-07-21-07-00-53-398
可以看到是NetworkDashboardActivity创建时出现的这个问题,多次尝试发现如果复现后进入这个页面,不做任何处理直接点击导航键返回的话会报错,但如果点击了屏幕任意位置再返回的话,就不会出现这个问题,那么解决方法就是在这个页面创建时,做模拟点击屏幕的处理即可。
经分析,控制这个页面的代码是在alps_mssi\vendor\mediatek\proprietary\packages\apps\MtkSettings\src\com\android\settings\network下的NetworkDashboardFragment.java,在这个类里面的各个方法中加入log信息后再复现问题,查看log后可知在页面创建时,该类里的onAttach(),onCreatePreferences()方法被调用了
写一个模拟点击屏幕的方法,在这之前找好要点击屏幕的x、y的坐标,然后导入相关的包
+ public void Touch(){
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ Looper.prepare();
+ try {
+ Thread.sleep(1500);
+ //模拟点击click坐标
+ float x = 792;
+ float y = 1264;
+ Instrumentation mInst = new Instrumentation();
+ mInst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),
+ SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN,
+ x, y, 0));
+ mInst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),
+ SystemClock.uptimeMillis(), MotionEvent.ACTION_UP,
+ x, y, 0));
+ Log.d("gyh","click");
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ }).start();
+ }
最后在onAttach()和onCreatePreferences()中各自调用Touch()方法,可分别单独调用后验证(这里时间紧迫未做区分),最后刷机验证。