2012-01-08 8 views
10

あなたのアプリがANR(Application Not Responding)をトリガーすると通知を受ける方法はありますか?デフォルトの例外ハンドラに似ていますか?ANRを聞いて応答しますか?

「あなたはそれをどうすればいいでしょうか?」と答えて、単にロギングします。何もしていない。

+3

@WarrenFaith Dudeあなたは何について話していますか?私は満足のいく答えを受け入れる。誰かが返事をしても、実際にはその質問に答えることはできませんが、私はそれらを受け入れません。私の質問のほとんどは*本当に難しいですか、答えがありません。通常、私が尋ねる頃には、私はたくさん見てきました。もしAndroidの質問で、私自身が答えを見つけることができなければ、それは本当に難しい*質問になるでしょう。私の2K担当者は質問に答えています。私のアプリが市場にある場合、私はフリーズを見ることができます。ショッカー。私は自分でそれをキャッチしたい。 @WarrenFaith PS。 –

+1

ANRを捕まえる方法を教えていただけたら、お約束します。あなたの答えは受け入れられます。あなたのアプリが市場にある場合、あなたの判断で...あなたがそれを書いたからといってそれを受け入れることになっているのですか? –

+2

@WarrenFaith PPSもしあなたの答えが「あなたができない」とすれば、あなたはリンクが付いているソースを引用する必要があります。 –

答えて

1

いいえ、プロセスのVM内で発生する例外とは異なり、ANRはVM外のシステムウォッチドッグによって生成されます。 Googleはinfo on triggers and avoidance

+0

私は本当にそこに方法がないと思うこれはかなりイライラしています。私自身のAPIやスレッドで特別なことをすることができますが、それはかなりハッキリです。 –

0

のログを(スレッドを使用して)リッスンするサービス(フォアグラウンドサービスが望ましい)を使用できます。また、ANRを示すログがある場合はそれを処理できます。ここ

はANRの原因となるアプリの小さなサンプルです:

... 
findViewById(R.id.button).setOnClickListener(new OnClickListener() 
    { 
    @Override 
    public void onClick(final View v) 
     { 
     try 
     { 
     Thread.sleep(10000); 
     } 
     catch(final InterruptedException e) 
     { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } 
     } 
    }); 
... 

は、ここで私はANRを得たとき、私はlogcatから得たログです:そう

08-03 13:02:37.746: E/ActivityManager(158): ANR in com.example.anr (com.example.anr/.MainActivity) 
08-03 13:02:37.746: E/ActivityManager(158): Reason: keyDispatchingTimedOut 
08-03 13:02:37.746: E/ActivityManager(158): Load: 6.19/2.37/0.86 
08-03 13:02:37.746: E/ActivityManager(158): CPU usage from 5598ms to 0ms ago: 
08-03 13:02:37.746: E/ActivityManager(158): 2.6% 158/system_server: 2.5% user + 0.1% kernel/faults: 86 minor 
08-03 13:02:37.746: E/ActivityManager(158): 0.5% 298/com.android.phone: 0.3% user + 0.1% kernel/faults: 15 minor 
08-03 13:02:37.746: E/ActivityManager(158): 0% 35/rild: 0% user + 0% kernel 
08-03 13:02:37.746: E/ActivityManager(158): 4.6% TOTAL: 3.9% user + 0.6% kernel 
08-03 13:02:37.746: E/ActivityManager(158): CPU usage from 2029ms to 2654ms later: 
08-03 13:02:37.746: E/ActivityManager(158): 11% 158/system_server: 4.8% user + 6.4% kernel/faults: 2 minor 
08-03 13:02:37.746: E/ActivityManager(158):  11% 192/InputDispatcher: 4.8% user + 6.4% kernel 
08-03 13:02:37.746: E/ActivityManager(158):  1.6% 163/Compiler: 1.6% user + 0% kernel 
08-03 13:02:37.746: E/ActivityManager(158):  1.6% 193/InputReader: 0% user + 1.6% kernel 
08-03 13:02:37.746: E/ActivityManager(158): 18% TOTAL: 9.3% user + 9.3% kernel 

、はい、私は思いますそれが可能だ。

+0

他のプロセスやOSからログを読み取ることができないため、Jelly Beanでは不可能です。また、ログを読むことはAndroid SDKの一部ではありません。 – CommonsWare

+0

正しい。私はJBを持っていないので、私はこれのための任意の回避策があるかどうかわからない。彼らはGoogleのアイオノミーでは、今では動作しませんが、それはあなたのようなものがアプリ内にあると考えられているかどうかわからないので、自分のアプリのログを読み取るのは大丈夫だ(私はそれがないと思います) 。いつも、このソリューションは最初から回避策です。現在のデバイスの約99%で動作するはずです。 –

+0

私は別の考えがあります。回答セクションに投稿します。 –

5

私はこれについてかなり考えてきました。あなたはになります。はかなり重い手ではありますが、以下のことをしてください。 ANRの書き込みアウトスレッドは、一般的に読み込み可能なディレクトリにファイル:

/data/anr/traces.txtあなたは、別のプロセスでは、定期的にファイルアンケートをサービスを持つことができます。日付が変わり、アプリが一番上にある場合は、おそらくANRイベントが発生しています。

私はファイルのフォーマットについて100%確信していませんが、

+0

これは私の好きな答えです。それを試してみてください。ファイルのフォーマットが重要であるかどうかは分からない。アプリパッケージの名前が含まれているため、それを生成したアプリであることを確認することができます。しかし、ファイルシステムのオブザーバーがそのファイルで作業するかどうかは疑問です。次に、パッケージ名が含まれているかどうかを確認できます。また、ANRに続いてユーザーがアプリを殺したかどうかを確認するために、アプリの開始時にチェックすることもできます。 – 3c71

3

システムウォッチドッグはアプリケーションに警告しないため、アプリケーション自体に独自のウォッチドッグを持たせることができます。 の手順は、単に次の操作を行うループのスレッドを起動し、簡単です:できるだけ早く、UIスレッドで実行する

  1. スケジュール小さなコード。
  2. X秒間待つ(あなたが決める)。
  3. コードが実行されているかどうかを確認する:もしあれば、1に戻る
  4. コードが実行されていない場合は、UIスレッドが少なくともX秒間ブロックされたことを意味し、UIスレッドスタックトレース

私はa small library that does exactly thatと書いています。私はACRAと一緒に使っています。

関連する問題