2013-09-02 7 views
9

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

私の質問はかなりシンプルですが、長時間の検索の後に私は答えに近づいていません。

質問は、どのようにサンドボックスされているアプリケーションが原因で、Android OS(4.0.4,4.1.1,4.1.2)全体がフリーズしますか?

具体的には、OS全体がフリーズします。 logcat、no adb、何もない!それはOSが得ることができるように冷凍されています。このデバイスはSamsung Galaxy Tab 2です。このアプリではUsbManagerusb-serial-for-android projectのライブラリを使用しています。図書館ではNDKを使用していますが、私のアプリでは使用できません。本質的に、アプリケーションは、適切なボードとシリアルに通信し、データを受け取り、シリアルコマンドを送信します。私は、USBケーブルを抜いたり、ライブラリのオブジェクトが接続を切断するように指示するとき - それは凍結が発生するまでで、

try { 

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

} catch (InterruptedException e) { 
     e.printStackTrace(); 
} 

それはすべてが正常に動作します:これは、この方法で処分されたワーカースレッド上で実行されます。どちらの方法でも、OS全体が不安定になり、直ちに、またはUSB(ボードまたはコンピュータ)を再び接続するとフリーズします。私はこのフリーズの問題をusb-serial-for-androidプロジェクトに投稿しましたが、まだコメントはありませんでした。私は、USBを解除するときに適切なプロトコルに従っていると信じています。

私は多くのことが間違っている可能性があることを理解しています - 私のアプリはクラッシュすることができます。 al。しかし、もう一度、サンドボックス化されたアプリがOSをクラッシュさせてしまいます。そうすることができれば、サンドボックス化されていないようです。

UPDATE

私は多くの実験の後に、それはアプリをクラッシュしたり、OSを凍結することなく動作しますthread.interrupt();行を削除していることを発見しました。 USBを取り外すことなくUSBを抜いても、OSはフリーズします。

私はまだサンドボックスアプリケーションがOS全体をフリーズする方法を理解したいと思っています。答えには逃げるコメントがありますが、回答だけではありません。

+1

フリーズのように、ホームボタンを使用して家に帰ることもできないのですか?あなたはエミュレータまたは実際のデバイスを使用していますか?デバイスを使用した場合、そのデバイスは何ですか?それがコンピュータに接続されている場合、logcatは何を言いましたか?何が起こって凍結を起こすことができますか? – Keale

+1

多くのもの。より具体的にする必要があります。 –

+1

私は、満たされていない終了条件、または再帰的に再起動するような動作を伴うタイトなループを探しています。あなたは*(もちろん)*ソース管理を使用しているため、最後に動作していたバージョンにロールバックして、何が原因で問題が発生したのかを調べます。 – andy256

答えて

0

上記のコードサンプルはどこにありますか?

これはUIスレッド上にある必要があり、ユーザー操作を妨げる可能性があります。

フリーズ前にANRメッセージも届きますか?

thread.join(); 

は無期限にブロックされます。 Thread.join() documentationを参照してください。

また、以下は私にとっては忙しいループのようです。

コメントで何をしていますか?何もない場合、ループは狂ったように回転します(while (true) { }と考える)。

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

OSがフリーズするだけのANRはありません。ワーカースレッドは、UIブロッキングを防止するために使用されます。ポストに述べられているように、USBが切断されるまで、すべて正常に動作します。 –

+0

申し訳ありませんが、私はワーカーのあなたの言及を逃した。 [destroy](http://developer.android.com/reference/java/lang/Thread.html#destroy())のように見えます。私はそれをコメントしたいと思います。また、ブロックすることができます、私は結合を試みることをお勧めします(ミリ、ナノ);また、最終的なcatch(Exception e){をキャッチオールとして、ループ全体をコメントアウトします。 – stackunderflow

+0

私は、スレッド終了プロセスを推薦している多くの記事を見てきました。あなたはスレッドを直接killすることはできませんが、それはアドバイスされていません。したがってループ。私は非常に成功するために概念実証のシナリオでUSBライブラリなしでこれをテストしました。スレッドが終了するまでループを待つことは推奨されません。なぜなら、それを生成するオブジェクトを破壊すると、アプリケーションが非常に不安定になってしまうからです。 –