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:
- Android Honeycomb: NetworkOnMainThreadException incluso cuando se utiliza AsyncTask y no modo estricto?
- Android StrictMode y volcado de montón
- Abrir una subactividad varias veces provoca un InstanceCountViolation a pesar de ser destruido
- ¿Cuál es el ciclo de vida de StrictMode de Android?
- StrictMode para versiones de plataforma inferiores
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.
- Android StrictMode InstanceCountViolation
- Política de Android StrictMode
- Definición de DEVELOPER_MODE para StrictMode
- Permiso de StrictModeBuilder no funciona
- StrictMode + Analytics
- ¿Debería tener acceso a SharedPreferences fuera del subproceso de interfaz de usuario?
- Se ha adquirido un recurso en el rastreo de pila adjunto pero nunca se ha liberado. Consulte java.io.Closeable para obtener información sobre cómo evitar fugas de recursos
- Android StrictMode que publica falsos positivos
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);