Encontrar lo que violó la política de StrictMode

He habilitado StrictMode en mi aplicación y está causando algunos fallos como se esperaba. ¿Cómo puedo saber en qué parte de mi código estoy violando estas políticas?

Éste es el seguimiento de la pila:

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) 

Pero como puedes ver … no es muy útil … Sé quién mató mi aplicación, necesito saber por qué!

Gracias.

Debes llamar a penaltyLog() en tu StrictMode.ThreadPolicy.Builder, para que te muestre la razón subyacente, así como detener tu aplicación.

Esto es lo que probablemente tiene actualmente:

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

Si llama a la red en el hilo principal, obtendrá esta excepción que es difícil de entender:

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

Si a continuación, agrega penaltyLog() a tu directiva …

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

Entonces usted verá un mensaje mucho más útil como el siguiente. Esto será en la salida 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) 

Si observa de cerca, verá que este rastreo de pila le llevará al código que está causando la violación StrictMode.

Cada vez que veo huellas de pila como ésta siempre miro a mis eventos de ciclo de vida de actividad. Compruebe lo que está pasando en sus métodos onCreate, onResume, onPause (hay más eventos del ciclo de vida, pero estos son los más comunes). Ponga puntos de quiebre en esos métodos y vea cuál termina con este mensaje fatal. Entonces tómalo de ahí.

Intente capturar este error usando

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

Esto debería ser un punto de partida bastante bueno para depurar este problema.

La clase StrictMode (android.os.StrictMode) se puede utilizar para habilitar y aplicar varias políticas que se pueden comprobar y reportar.

Esto puede ser una violación StrictMode al ejecutar una infracción de escritura de disco que se produce cuando está realizando escrituras de disco en el subproceso de interfaz de usuario principal. Para solucionarlo, necesita mover el disco escribe fuera del subproceso principal.

Si no puede mover el código en este punto, podría desactivar la comprobación de una parte del código.

Agregue código explícitamente para detener la comprobación de una infracción de regla particular justo antes de ejecutar el código infractor y, a continuación, vuelva a activar la detección para esa regla después de que se haya completado el código infractor.

 StrictMode.ThreadPolicy old = StrictMode.getThreadPolicy(); StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder(old) .permitDiskWrites() .build()); doCorrectStuffThatWritesToDisk(); StrictMode.setThreadPolicy(old); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.