monkey测试Sending Key (ACTION_UP): 82 // KEYCODE_MENU异常分析和处理

最近车厂做monkey测试,出现一个很奇怪的问题,具体报错如下:

//monkey KEYCODE_MENU ACTION_UP
22:18:38.115207  6570  6570 I Monkey  : :Sending Key (ACTION_UP): 82    // KEYCODE_MENU

//崩溃
--------- switch to crash
22:18:38.133137 16255 16255 E AndroidRuntime: FATAL EXCEPTION: main
22:18:38.133137 16255 16255 E AndroidRuntime: Process: net.easyconn, PID: 16255
22:18:38.133137 16255 16255 E AndroidRuntime: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.ViewRootImpl.setView(ViewRootImpl.java:807)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
22:18:38.133137 16255 16255 E AndroidRuntime:     at d.b.k.k.G(:15)
22:18:38.133137 16255 16255 E AndroidRuntime:     at d.b.k.k.v(:7)
22:18:38.133137 16255 16255 E AndroidRuntime:     at d.b.k.k$e.dispatchKeyEvent(Unknown Source:2)
22:18:38.133137 16255 16255 E AndroidRuntime:     at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:342)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:5047)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4915)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4436)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4489)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4455)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4595)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4463)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4652)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4436)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4489)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4455)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4463)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4436)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4489)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4455)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4628)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:4789)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2571)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:2081)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2072)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2548)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.os.MessageQueue.nativePollOnce(Native Method)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.os.MessageQueue.next(MessageQueue.java:326)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.os.Looper.loop(Looper.java:160)
22:18:38.133137 16255 16255 E AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:6718)
22:18:38.133137 16255 16255 E AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
22:18:38.133137 16255 16255 E AndroidRuntime:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
22:18:38.133137 16255 16255 E AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

//中止进程,信号9
22:18:38.229723 16255 16255 I Process : Sending signal. PID: 16255 SIG: 9

系统提示我:Unable to add window -- token null is not valid; is your activity running?

追踪源码发现,报错的位置在ViewRootImpl的setView方法中的

case WindowManagerGlobal.ADD_BAD_APP_TOKEN:

case WindowManagerGlobal.ADD_BAD_SUBWINDOW_TOKEN:

中,可是我的Activity明明好好的在前台放着,应该什么都没干,怎么会setView呢?

由于项目中代码很多,又没有其他错误,于是我决定写一个Helloworld真正什么都不干试一下

1.gradle依赖如下

implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.appcompat:appcompat:1.0.0'
implementation 'com.google.android.material:material:1.0.0'

2.MainActivity的代码

public class MainActivity extends AppCompatActivity {

    @Overide
    public void onCreate(Bundle saveInstanceState) {
        super.onCreate(saveInstanceState);
        setContentView(R.layout.main_activity);
    }
}

然后手动模拟发送EVENT_MENU事件

adb shell input keyevent 82

我靠,果然崩了!

这就奇怪了,HelloWorld里面什么代码都没写,难道系统出bug了?

查阅博客应用错误收集 (thinbug.com)得知,在AppCompatActivity中没能处理EVENT_MENU事件导致的异常,要么升级'androidx.appcompat:appcompat:1.0.0'的版本为最新,要么手动让AppCompatActivity监听EVENT_MENU事件,代码如下:

public class MainActivity extends AppCompatActivity {

    @Overide
    public void onCreate(Bundle saveInstanceState) {
        super.onCreate(saveInstanceState);
        setContentView(R.layout.main_activity);

        Window window = appCompatActivity.getWindow();
        Window.Callback callback = window.getCallback();
        MyWindowCallbackWrapper myWindowCallbackWrapper = new MyWindowCallbackWrapper(callback, new WeakReference<AppCompatActivity>(this));
        window.setCallback(myWindowCallbackWrapper);
    }

    private static class MyWindowCallbackWrapper extends WindowCallbackWrapper {

        private AppCompatActivity activity;

        public WindowCallbackWrapper(Window.Callback callback, WeakReference<AppCompatActivity> weakactivity) {
            super(callback);
            this.activity = weakactivity.get();
        }

        @Override
        public boolean dispatchKeyEvent(KeyEvent event) {
            int keyCode = event.getKeyCode();
            int action = event.getAction();
            if (keyCode == KeyEvent.KEYCODE_MENU && action == KeyEvent.ACTION_DOWN) {
                if (activity.onKeyDown(event.getKeyCode(), event))
                    return true;
            } else if (keyCode == KeyEvent.KEYCODE_MENU && action == KeyEvent.ACTION_UP) {
                if (activity.onKeyUp(event.getKeyCode(), event))
                    return true;
            }
            return super.dispatchKeyEvent(event);
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:解决vue项目报错 POST http://127.0.0.1:3000/login net::ERR_CONNECTION_RESET 通过报错可得知,发送post请求时,服务器端的接口/login拒绝连接 。 引用\[2\]:Request Method: GET Request URL: http://127.0.0.1:8000/ Using the URLconf defined in djangoProject.urls, Django tried these URL patterns, in this order: 。 引用\[3\]:粉丝群里面的一个小伙伴想用flask搭建一个接收数据的接口,但是发生了报错(当时他心里瞬间凉了一大截,跑来找我求助,然后顺利帮助他解决了,顺便记录一下希望可以帮助到更多遇到这个bug不会解决的小伙伴),报错代码如下:: import flask from flask import request import requests server = flask.Flask(__name__) # __name__代表当前的python文件。把当前的python文件当做一个服务启动 @server.route('/') # 只有在函数前加上@server.route (),这个函数才是个接口,不是一般的函数 def reg(): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36' } url = 'https://zqz-shangbiao.obs.cn-east-3.myhuaweicloud.com/1/2032/10156217.png' r = requests.get(url, headers=headers) return r.content server.run(debug=True) 。 问题:error sending request for url (http://127.0.0.1:12345/ 回答: 根据提供的引用内容,你遇到的问题是在发送请求时出现了错误。具体来说,对于vue项目报错POST http://127.0.0.1:3000/login net::ERR_CONNECTION_RESET,这个错误表明服务器端的接口/login拒绝连接。\[1\]而对于error sending request for url (http://127.0.0.1:12345/,这个错误可能是由于请求的URL无效或无法连接到该URL导致的。\[3\]为了解决这些问题,你可以检查服务器端的接口是否正确配置,并确保URL的正确性和可访问性。此外,还可以检查网络连接是否正常,以及防火墙或代理设置是否会影响请求的发送。 #### 引用[.reference_title] - *1* [POST http://127.0.0.1:3000/login net::ERR_CONNECTION_RESE](https://blog.csdn.net/Janner668/article/details/114929736)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Page not found (404) Request Method: GET Request URL: http://127.0.0.1:8000/ Using the URLconf defin](https://blog.csdn.net/weixin_45866062/article/details/124348985)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [已解决The method is not allowed for the requested URL.](https://blog.csdn.net/yuan2019035055/article/details/126728081)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值