2012-03-20 12 views
9

Ho attivato StrictMode nella mia app e causano alcuni arresti anomali come previsto. Come posso sapere da dove nel mio codice sto violando queste politiche?Individuazione della norma StrictMode violata

Questa è l'analisi dello stack:

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) 

ma come si può vedere ... non è molto utile ... Io so chi ha ucciso la mia app, ho bisogno di sapere perché!

Grazie.

+0

Come è stato attivato SrictMode? Si prega di incollare il codice in modo che possiamo ispezionarlo. – louielouie

+0

DetectAll.penaltyLog(). PenaltyDeath() per entrambi.Guardando la tua risposta qui sotto, sembra proprio che ho bisogno di aggiungere "StrictMode" ai miei filtri di registro :) – copolii

risposta

14

Devi chiamare penaltyLog() sul tuo StrictMode.ThreadPolicy.Builder, in modo che ti mostrerà il motivo sottostante e l'arresto della tua app.

Ecco cosa probabilmente avete attualmente:

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

Se si chiama la rete sul thread principale, otterrete questa eccezione che è difficile da capire:

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

Se poi si aggiungi penaltyLog() alla vostra politica ...

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

poi si vedrà una più mor e un messaggio utile come quello qui sotto. Questo sarà nell'output 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) 

Se guardate attentamente, vedrete che questo stack trace vi condurrà al codice che sta causando la violazione StrictMode.

+0

Nota: Questo * È * quello che sto facendo, ma la tua voce di registro mi ha mostrato che ho bisogno di regolare i miei filtri di registro (che è quello che sospettavo mentre cercavo di addormentarmi :)). Vinci la torta :) Grazie – copolii

+0

Beh, non sembra più utile per me. Come faccio a sapere su quale codice si arresta? – Denny

0

Ogni volta che vedo tracce dello stack come questo, cerco sempre gli eventi del ciclo di vita di Activity. Scopri cosa sta succedendo nei tuoi metodi onCreate, onResume, onPause (ci sono più eventi del ciclo di vita, ma questi sono quelli comuni). Metti i punti di interruzione in questi metodi e vedi quale terminare con questo messaggio fatale. Quindi prendilo da lì.

Prova la cattura di questo errore utilizzando

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

questo dovrebbe essere un buon punto di partenza per il debug di questo problema.

0

La classe StrictMode (android.os.StrictMode) può essere utilizzata per abilitare e applicare varie politiche che possono essere controllate e segnalate.

Questo può essere una violazione StrictMode nell'esecuzione di una violazione di scrittura del disco che si verifica quando si eseguono scritture su disco sul thread principale dell'interfaccia utente. Per risolverlo, è necessario spostare il disco dal thread principale.

Se non è possibile spostare il codice a questo punto, è possibile disabilitare il controllo per una parte del codice.

Aggiungere codice in modo esplicito per interrompere il controllo di una particolare violazione della regola appena prima dell'esecuzione del codice illecito e quindi riabilitare il rilevamento per tale regola dopo che il codice incriminato è stato completato.

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

Penso che dovresti fare riferimento alla risposta che hai preso da quel codice: http://stackoverflow.com/a/13323445/1372202 – Jannik

Problemi correlati