9

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

我的问题相当简单,但经过长时间的搜索,我还没有找到答案。

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

具体来说,整个操作系统冻结。没有 logcat,没有 adb,什么都没有!它与操作系统一样被冻结。该设备是三星 Galaxy Tab 2。该应用程序使用UsbManager来自usb-serial-for-android 项目的库。虽然库可能使用 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,它仍然会冻结操作系统。

我仍然想了解沙盒应用程序如何冻结整个操作系统。这里有一些评论无法回答,但不仅仅是答案。

4

1 回答 1

0

您上面的代码示例在哪里?

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

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

    thread.join();

将无限期阻塞。请参阅Thread.join() 文档

此外,对我来说,以下看起来像是一个忙碌的循环。

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

    while(thread.getState() != Thread.State.TERMINATED){
          // wait until thread finishes
    }
于 2013-09-03T10:15:56.783 回答