我正在开发一个导致操作系统卡住的 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/