9

OS がフリーズする Android アプリを開発しています。

私の質問はかなり単純ですが、長い検索の後、私は答えに近づきませんでした.

問題は、サンドボックス化されたアプリがどのようにして Android OS 全体 (4.0.4、4.1.1、4.1.2) をフリーズさせるのかということです。

具体的には、OS 全体がフリーズします。logcat も、adb も、何もありません。OSができる限り凍結されています。デバイスは Samsung 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();
}

フリーズが発生するまで、つまりUSBケーブルを切断するか、ライブラリオブジェクトに切断を指示するまで、すべて正常に動作します。いずれにせよ、OS 全体が不安定になり、すぐにフリーズするか、または USB (ボードまたはコンピューター) を再接続するとフリーズします。このフリーズの問題を usb-serial-for-android プロジェクトに投稿しましたが、まだコメントを受け取っていません。USBを外すときは、適切なプロトコルに従っていると思います。

多くのことがうまくいかない可能性があることを理解しています-アプリがクラッシュする可能性があります. アル。しかし、サンドボックス化されたアプリはどのように OS をクラッシュさせるのでしょうか。

アップデート

多くの実験の結果、thread.interrupt();行を削除することで、アプリをクラッシュさせたり、OS をフリーズさせたりすることなく機能することがわかりました。最初にマウントを解除せずに USB を取り外すと、OS がフリーズします。

ただし、サンドボックス化されたアプリが OS 全体をフリーズさせる方法を理解したいと思っています。ここには回答に至らないコメントがありますが、回答だけではありません。

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 に答える