我正在开发一个导致操作系统冻结的Android应用程序.
我的问题很简单,但经过漫长的搜索,我已经没有接近答案了.
问题是,沙盒的应用程序怎么能导致整个Android操作系统(4.0.4,4.1.1,4.1.2)冻结?
具体来说,整个操作系统冻结.没有logcat,没有adb,没有!它像操作系统一样可以冻结.该设备是三星Galaxy Tab 2.该应用程序使用usb-serial-for-android项目中UsbManager的库和库.虽然库可能使用NDK,但我的应用程序却没有.本质上,应用程序与专业板串行通信,接收数据和发送串行命令.这是在以这种方式处理的工作线程上完成的:
try {
thread.interrupt();
thread.join();
while(thread.getState() != Thread.State.TERMINATED){
// wait until thread finishes
}
} catch (InterruptedException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
一切正常,直到冻结发生 - 当我断开USB电缆或指示库对象断开连接时.无论哪种方式,整个操作系统都会变得不稳定并立即冻结或再次连接USB(板或计算机).我已将此冻结问题发布到usb-serial-for-android项目但尚未收到任何评论.我相信我在脱离usb时遵循了正确的协议.
我知道很多事情都可能出错 - 我的应用程序可以崩溃等.人.但是沙盒应用程序又是如何使操作系统崩溃的 - 如果能够做到这一点,它似乎并不是非常沙盒化的.
UPDATE
我经过多次实验后发现,通过删除thread.interrupt();它的工作线而不会崩溃应用程序或冻结操作系统.如果在没有先拆卸USB的情况下拔掉USB,它仍会冻结操作系统.
我仍然希望了解沙盒应用程序如何冻结整个操作系统.这里有评论回避答案,但不仅仅是答案.
您上面的代码示例位于哪里?
它应该位于 UI 线程上,可能会阻止用户交互。
您在冻结之前是否也收到ANR消息?
thread.join();
Run Code Online (Sandbox Code Playgroud)
将无限期地阻塞。请参阅Thread.join() 文档。
另外,以下对我来说看起来像是一个繁忙的循环。
评论里你在做什么?如果什么都没有,那么循环就会疯狂地旋转(想想while (true) { })。
while(thread.getState() != Thread.State.TERMINATED){
// wait until thread finishes
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3068 次 |
| 最近记录: |