android - 应用程序如何卡住 Android 操作系统

标签 android freeze

我正在开发一个导致操作系统卡住的 Android 应用程序。

我的问题很简单,但经过长时间的搜索,我并没有接近答案。

问题是,沙盒应用如何导致整个 Android 操作系统(4.0.4、4.1.1、4.1.2)卡住?

具体而言,整个操作系统卡住。没有 logcat,没有 adb,什么都没有!它像操作系统一样卡住。该设备是 Samsung Galaxy Tab 2。该应用程序使用 UsbManager 和来自 usb-serial-for-android project 的库。 .虽然库可能使用 NDK,但我的应用程序没有。本质上,该应用程序与专有板进行串行通信,接收数据并发送串行命令。这是在以这种方式处理的工作线程上完成的:

try {

        thread.interrupt();
        thread.join();          
        while(thread.getState() != Thread.State.TERMINATED){
              // wait until thread finishes
        }

} catch (InterruptedException e) {
       e.printStackTrace();
}

一切正常,直到发生卡住 - 当我断开 USB 电缆或指示库对象断开连接时。无论哪种方式,整个操作系统都会变得不稳定并且会立即卡住或在再次连接 USB(板或计算机)时卡住。我已将此卡住问题发布到 usb-serial-for-android 项目,但尚未收到任何评论。我相信我在断开 USB 时遵循了正确的协议(protocol)。

我知道很多事情都可能出错——我的应用程序可能会崩溃等。阿尔。但是沙盒应用程序又是如何使操作系统崩溃的——如果它能做到这一点,它似乎就不是沙盒化的。

更新

经过大量实验,我发现通过删除 thread.interrupt(); 行,它可以在不使应用程序崩溃或卡住操作系统的情况下运行。如果在没有先卸载 USB 的情况下拔下 USB,它仍然会卡住操作系统。

不过,我仍然希望了解沙盒应用程序如何卡住整个操作系统。这里有一些评论回避了答案,但不仅仅是答案。

最佳答案

上面的代码示例位于何处?

它应该在 UI 线程上,可能会阻止用户交互。

你是否也得到 ANR卡住前的消息?

    thread.join();

将无限期阻塞。参见 Thread.join() documentation .

此外,以下内容对我来说就像一个繁忙的循环。

你在评论里干什么?如果什么都没有,那么循环将疯狂旋转(想想 while (true) { })。

    while(thread.getState() != Thread.State.TERMINATED){
          // wait until thread finishes
    }

关于android - 应用程序如何卡住 Android 操作系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18564446/

相关文章:

c++ system()挂起使用netcat连接到不同线程中的套接字

java - 如何防止我的音乐播放器在电话铃声响起并挂断电话后启动?

移动操作系统、Android 和 ipad 上的 Javascript

android - 如何在列表中实现圆角效果

php - Android GCM 中的通知生成问题

c# - Form.Invoke 卡住 UI

javascript - 防止长时间计算导致浏览器卡顿和崩溃

python - PyCurl 请求在执行时无限挂起

java - 停止播放音频/广播并取消返回主屏幕的通知控制,音乐停止,通知停止,前台服务不起作用

Java - 套接字 - 卡住