应用程序如何冻结Android操作系统

时间:2013-09-02 01:05:24

标签: android freeze

我正在开发一款导致操作系统冻结的Android应用程序。

我的问题很简单,但经过漫长的搜索后,我的答案就越来越近了。

问题是,如何将沙盒化的应用程序导致整个Android操作系统(4.0.4,4.1.1,4.1.2)冻结?

具体来说,整个操作系统都会冻结。没有logcat,没有adb,没有!它像操作系统一样可以冻结。该设备是三星Galaxy Tab 2.该应用程序使用UsbManagerusb-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时遵循了正确的协议。

我知道很多事情都可能出错 - 我的应用可以崩溃等等。人。但是沙盒应用程序又是如何使操作系统崩溃的 - 如果能够做到这一点,它似乎并不是非常沙盒化的。

更新

我经过多次实验后发现,通过删除thread.interrupt();行,它可以在不崩溃应用程序或冻结操作系统的情况下运行。如果在没有先卸下USB的情况下拔掉USB,它仍会冻结操作系统。

我仍然希望了解沙盒应用程序如何冻结整个操作系统。这里有评论可以回答,但不是单独的答案。

1 个答案:

答案 0 :(得分:0)

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

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

您是否还在冻结前收到ANR条消息?

    thread.join();

将无限期阻止。请参阅Thread.join() documentation

此外,以下内容对我来说似乎是一个繁忙的循环。

你在评论中做什么?如果没有,那么循环会像疯了一样旋转(想想while (true) { })。

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