Поиск того, что нарушило политику StrictMode - PullRequest
12 голосов
/ 20 марта 2012

Я включил 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)

но, как вы можете видеть ... это не очень полезно ... Я знаю, кто убил мое приложение, мне нужно знать почему!

Спасибо.

Ответы [ 3 ]

19 голосов
/ 20 марта 2012

Вам нужно вызвать 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.

1 голос
/ 10 января 2015

Класс StrictMode (android.os.StrictMode) может использоваться для включения и применения различных политик, для которых можно проверять и сообщать о них.

Это может быть нарушение StrictMode при выполнении нарушения записи на диск, которое возникает при выполнении записи на диск в основном потоке пользовательского интерфейса.Чтобы решить эту проблему, вам нужно переместить запись с диска из основного потока.

Если вы не можете переместить код на этом этапе, вы можете отключить проверку части кода.

Явно добавьте код, чтобы прекратить проверку на конкретное нарушение правила непосредственно перед тем, как испорченный код будет выполнен, и затем снова включите обнаружение для этого правила после того, как испорченный код завершен.

StrictMode.ThreadPolicy old = StrictMode.getThreadPolicy();
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder(old)
    .permitDiskWrites()
    .build());
doCorrectStuffThatWritesToDisk();
StrictMode.setThreadPolicy(old);

Исходный код взят из здесь.

1 голос
/ 20 марта 2012

Всякий раз, когда я вижу подобные трассировки стека, я всегда заглядываю в события своего жизненного цикла Activity. Ознакомьтесь с тем, что происходит в ваших методах onCreate, onResume, onPause (есть больше событий жизненного цикла, но они распространены). Поместите точки останова в эти методы и посмотрите, какой из них заканчивается этим фатальным сообщением. Тогда возьми это оттуда.

Попробуйте перехватить эту ошибку, используя

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

Это должно быть хорошей отправной точкой для устранения этой проблемы.

...