15

アプリでStrictModeを有効にしましたが、予想どおりにいくつかのクラッシュが発生しています。コードのどこでこれらのポリシーに違反しているのかを知るにはどうすればよいですか?

これはスタックトレースです。

E/AndroidRuntime(19523): FATAL EXCEPTION: main
E/AndroidRuntime(19523): android.os.StrictMode$StrictModeViolation: policy=95 violation=2
E/AndroidRuntime(19523):        at android.os.StrictMode.executeDeathPenalty(StrictMode.java:1326)
E/AndroidRuntime(19523):        at android.os.StrictMode.access$1300(StrictMode.java:111)
E/AndroidRuntime(19523):        at android.os.StrictMode$AndroidBlockGuardPolicy.handleViolation(StrictMode.java:1319)
E/AndroidRuntime(19523):        at android.os.StrictMode$AndroidBlockGuardPolicy$1.run(StrictMode.java:1206)
E/AndroidRuntime(19523):        at android.os.Handler.handleCallback(Handler.java:605)
E/AndroidRuntime(19523):        at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(19523):        at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(19523):        at android.app.ActivityThread.main(ActivityThread.java:4424)
E/AndroidRuntime(19523):        at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(19523):        at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(19523):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
E/AndroidRuntime(19523):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
E/AndroidRuntime(19523):        at dalvik.system.NativeStart.main(Native Method)

しかし、ご覧のとおり...あまり役に立ちません...誰が私のアプリを殺したのかを知っているので、その理由を知る必要があります!

ありがとう。

4

4 に答える 4

21

penaltyLog()StrictMode.ThreadPolicy.Builderを呼び出して、アプリを停止するだけでなく、根本的な理由を表示する必要があります。

おそらく現在持っているものは次のとおりです。

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork()
.penaltyDeath()
.build());

メインスレッドでネットワークを呼び出すと、理解しにくい次の例外が発生します。

E/AndroidRuntime(8752): android.os.StrictMode$StrictModeViolation: policy=71 violation=4
E/AndroidRuntime(8752):     at android.os.StrictMode.executeDeathPenalty(StrictMode.java:1311)

penaltyLog()その後、ポリシーに追加すると...

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork()
.penaltyLog()
.penaltyDeath()
.build());

次に、以下のようなより役立つメッセージが表示されます。これは LogCat 出力になります。

D/StrictMode(8810): StrictMode policy violation; ~duration=2956 ms: android.os.StrictMode$StrictModeNetworkViolation: policy=87 violation=4
D/StrictMode(8810):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1090)

よく見ると、このスタック トレースが StrictMode 違反の原因となっているコードにつながることがわかります。

于 2012-03-20T04:26:55.120 に答える
1

このようなスタック トレースが表示されるたびに、アクティビティのライフサイクル イベントを調べます。onCreate、onResume、onPause メソッドで何が起こっているかを確認してください (ライフサイクル イベントは他にもありますが、これらは一般的なものです)。これらのメソッドにブレークポイントを置き、この致命的なメッセージで終了するメソッドを確認してください。それからそこからそれを取ります。

を使用してこのエラーをキャッチしてみてください

protected void onResume() {
  super.onResume();
  try {
    codeThatCrashesBecauseOfStrictMode();
  } catch(Throwable tr) { Log.e(tr); }
}

これは、この問題をデバッグするためのかなり良い出発点になるはずです。

于 2012-03-20T04:24:31.893 に答える