ANR问题基于aosp14修改monitor事件导致的复现及测试分析-学员作业

背景:

昨天有相关学员朋友一直在vip群里提出他的一个ANR问题,一直说自己分析这个ANR完全没有相关的头绪
在这里插入图片描述
针对这个ANR问题,我与该学员沟通了解情况后,发现他这种anr问题明显不是常规的那种app某个地方执行耗时导致的卡顿,所以常规那种抓取anr trace来分析定位的套路明显就不行了。
那么他这个anr到底是怎么复现的呢,具体是个啥情况呢?今天马哥来给大家在aosp14上复现该ANR问题然后先提供给大家作为一个课程作业进行完成哈,答案后期会blog或者vip群分享方式给大家。

问题复现:

需要复现该问题,其实需要对系统正常的相关源码进行一些修改才可以,学员朋友也是一样,他修改了相关源码引入了ANR问题,但是又不知道怎么引入的。

修改代码如下:
frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java

diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
index 093c09fff995..98a84557dbe7 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
@@ -327,10 +327,10 @@ public class ScreenshotView extends FrameLayout implements
         }
         return touchRegion;
     }
-
+    static int count = 0;
     private void startInputListening() {
-        stopInputListening();
-        mInputMonitor = new InputMonitorCompat("Screenshot", mDefaultDisplay);
+       // stopInputListening();
+        mInputMonitor = new InputMonitorCompat("Screenshot " +(count++), mDefaultDisplay);
         mInputEventReceiver = mInputMonitor.getInputReceiver(
                 Looper.getMainLooper(), Choreographer.getInstance(), ev -> {
                     if (ev instanceof MotionEvent) {
@@ -345,14 +345,14 @@ public class ScreenshotView extends FrameLayout implements
     }
 
     void stopInputListening() {
-        if (mInputMonitor != null) {
-            mInputMonitor.dispose();
-            mInputMonitor = null;
-        }
-        if (mInputEventReceiver != null) {
-            mInputEventReceiver.dispose();
-            mInputEventReceiver = null;
-        }
+//        if (mInputMonitor != null) {
+//            mInputMonitor.dispose();
+//            mInputMonitor = null;
+//        }
+//        if (mInputEventReceiver != null) {
+//            mInputEventReceiver.dispose();
+//            mInputEventReceiver = null;
+//        }
     }
 

简单概述一下修改:
1、针对new InputMonitorCompat和InputEventReceiver前不想进行stopInputListening()调用
2、同时让stopInputListening()方法其他地方也不要调用
即ScreenshotView一旦创建了相关的InputMonitor就不希望它自我销毁掉,会一直存在。
其实看上面修改表面上也没啥问题,就相当于多了一个全局事件监听者InputMonitor会一直监听系统事件而已。

复现ANR步骤
第一步触发截图:
上面修改完成后进行编译运行,但是需要让系统运行到让这个ScreenshotView展示,就需要触发系统截图

这里大家实体机的话可以用组合键截图等,模拟器的话建议就用模拟key事件来截图,截图按键命令:

adb shell input keyevent 120

执行后就会发现有截图动作和窗口产生
在这里插入图片描述

看到这个后说明ScreenshotView相关的InputMonitor已经注册,如果不放心可以用dumpsys命令确认一下:

adb shell dumpsys input | grep Screenshot
    Reason: [Gesture Monitor] Screenshot 0 (server) is not responding. Waited 5000ms for MotionEvent(deviceId=4, eventTime=55126095000, source=TOUCHSCREEN | STYLUS | BLUETOOTH_STYLUS, displayId=0, action=MOVE, actionButton=0x00000000, flags=0x00000000, metaState=0x00000000, buttonState=0x00000000, classification=NONE, edgeFlags=0x00000000, xPrecision=22.8, yPrecision=11.1, xCursorPosition=nan, yCursorPosition=nan, pointers=[0: (844.0, 2242.9)]), policyFlags=0x62000000
    Window: [Gesture Monitor] Screenshot 0 - [Gesture Monitor] Screenshot 0
      1: name='[Gesture Monitor] Screenshot 0', id=110, displayId=0, inputConfig=NOT_FOCUSABLE | TRUSTED_OVERLAY | SPY, alpha=1.00, frame=[0,0][0,0], globalScale=1.000000, applicationInfo.name=[Gesture Monitor] Screenshot 0, applicationInfo.token=<null>, touchableRegion=[-14399,-29599][14400,29600], ownerPid=1965, ownerUid=10111, dispatchingTimeout=5000ms, hasToken=0x73a263ddddd0, touchOcclusionMode=BLOCK_UNTRUSTED
    559: channelName='[Gesture Monitor] Screenshot 0 (server)', windowName='[Gesture Monitor] Screenshot 0 (server)', status=NORMAL, monitor=false, responsive=false

第二步操作:

不断在手机模拟器进行相关的触摸点击操作直到anr产生(预计1分钟以内既可以)
在这里插入图片描述

作业要求:

1、要求可以按上面步骤产生出anr

2、分析出anr的原因

更多framework实战干货,请关注下面“千里马学框架”

基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的Koopman算子的递归神经网络模型线性化”展开,旨在研究纳米定位系统的预测控制问题,并提供完整的Matlab代码实现。文章结合数据驱动方法与Koopman算子理论,利用递归神经网络(RNN)对非线性系统进行建模与线性化处理,从而提升纳米级定位系统的精度与动态响应性能。该方法通过提取系统隐含动态特征,构建近似线性模型,便于后续模型预测控制(MPC)的设计与优化,适用于高精度自动化控制场景。文中还展示了相关实验验证与仿真结果,证明了该方法的有效性和先进性。; 适合人群:具备一定控制理论基础和Matlab编程能力,从事精密控制、智能制造、自动化或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于纳米级精密定位系统(如原子力显微镜、半导体制造设备)中的高性能控制设计;②为非线性系统建模与线性化提供一种结合深度学习与现代控制理论的新思路;③帮助读者掌握Koopman算子、RNN建模与模型预测控制的综合应用。; 阅读建议:建议读者结合提供的Matlab代码逐段理解算法实现流程,重点关注数据预处理、RNN结构设计、Koopman观测矩阵构建及MPC控制器集成等关键环节,并可通过更换实际系统数据进行迁移验证,深化对方法泛化能力的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值