2012-03-20 24 views
9

He habilitado StrictMode en mi aplicación y está causando algunos bloqueos como se esperaba. ¿Cómo puedo saber en qué parte de mi código violé estas políticas?Encontrando lo que violó la política de StrictMode

Este 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 se puede ver ... no es muy útil ... Yo sé quién mató a mi aplicación, lo que necesito saber por qué!

Gracias.

+0

¿Cómo activó SrictMode? Por favor, pegue el código para que podamos inspeccionarlo. – louielouie

+0

DetectAll.penaltyLog(). PenaltyDeath() para ambos.Mirando su respuesta a continuación, parece que necesito agregar "StrictMode" a mis filtros de registro :) – copolii

Respuesta

14

Debe llamar al penaltyLog() en su StrictMode.ThreadPolicy.Builder, para que le muestre el motivo subyacente y también la detención de su aplicación.

Esto es lo que es probable que tenga actualmente:

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

Si se 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 penaltyLog() añadir a su póliza ...

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

a continuación podrá ver una gran mor e mensaje útil como el de abajo. Esto estará en la salida de 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 se mira de cerca, verá que este seguimiento de la pila le llevará al código que está causando la violación StrictMode.

+0

Nota: Esto * ES * lo que estoy haciendo, pero su entrada de registro me mostró que tengo que ajustar mis filtros de registro (que es lo que sospechaba cuando intentaba conciliar el sueño :)). Usted gana el pastel :) Gracias – copolii

+0

Bueno, no me parece más útil. ¿Cómo sé en qué código se bloquea? – Denny

0

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

tratar de atrapar este error utilizando

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

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

0

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

Esto puede ser una violación de StrictMode al ejecutar una violación de escritura de disco que ocurre cuando está realizando grabaciones de disco en la hebra de la IU principal. Para resolverlo, necesita mover el disco escribe fuera del hilo principal.

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

Agregue explícitamente código para detener la comprobación de una violación de regla específica justo antes de que se ejecute el código ofensivo y luego vuelva a habilitar la detección para esa regla después de que se haya completado el código ofensivo.

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

Creo que debería hacer referencia a la respuesta que tomó ese código de: http://stackoverflow.com/a/13323445/1372202 – Jannik

Cuestiones relacionadas