2012-03-20 2 views
9

내 앱에서 StrictMode를 사용하도록 설정했는데 예상대로 충돌이 발생합니다. 내 코드에서 어디에서 정책을 위반하는지 어떻게 알 수 있습니까?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) 

하지만 ... 볼 수있는 매우 유용한 아니에요 ... 나는 사람들이 내 응용 프로그램을 죽인 알고, 그 이유를 알 필요가!

감사합니다.

+0

SrictMode를 어떻게 사용하셨습니까? 우리가 검사 할 수 있도록 코드를 붙여주세요. – louielouie

+0

DetectAll.penaltyLog(). penaltyDeath() 둘 다입니다.아래 응답을 보면 내 로그 필터에 "StrictMode"를 추가해야하는 것처럼 보입니다. – copolii

답변

14

StrictMode.ThreadPolicy.Builder에서 penaltyLog()으로 전화하여 앱을 종료하는 것 외에도 근본적인 이유를 표시해야합니다.

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

당신 경우 : 메인 스레드의 네트워크를 호출 할 경우

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

, 당신은 이해하기 어려운이 예외를 얻을 것이다 : 여기

은 아마 현재 가지고 무엇을
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 
.detectDiskReads() 
.detectDiskWrites() 
.detectNetwork() 
.penaltyLog() 
.penaltyDeath() 
.build()); 

다음 당신이 훨씬 MOR을 볼 수 ... 정책에 penaltyLog()를 추가 다음과 같은 유용한 메시지. 이것은 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 위반의 원인이되는 코드로 연결된다는 것을 알 수 있습니다.

+0

참고 :이 작업은 수행 중이지만 로그 항목은 내 로그 필터를 조정해야한다는 것을 나타냅니다. (그것은 내가 잠들려고 노력하는 동안 의심하고 있었던 것이다 :)). 당신은 케이크를 이기고 :) 감사합니다 – copolii

+0

글쎄, 그것은 내게 도움이되지 않습니다. 어떤 코드가 충돌하는지 어떻게 알 수 있습니까? – Denny

0

이와 같이 스택 추적을 볼 때마다 필자는 항상 내 Activity 라이프 사이클 이벤트를 조사합니다. onCreate, onResume, onPause 메소드에서 어떤 일이 일어나고 있는지 점검하십시오 (더 많은 라이프 사이클 이벤트가 있지만 일반적인 이벤트입니다). 이 메소드에 중단 점을 넣고이 치명적인 메시지로 어느 것이 종료되는지 확인합니다. 그럼 거기서 가져와.

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

이이 문제를 디버깅 꽤 좋은 출발점이되어야합니다 사용하여이 오류를 잡기보십시오.

0

StrictMode (android.os.StrictMode) 클래스는 검사하고보고 할 수있는 다양한 정책을 사용하고 시행하는 데 사용할 수 있습니다.

주 UI 스레드에서 디스크 쓰기를 수행 할 때 발생하는 디스크 쓰기 위반을 실행하는 경우 StrictMode 위반이 될 수 있습니다. 이를 해결하려면 디스크 쓰레드를 메인 쓰레드에서 옮겨야합니다.

이 시점에서 코드를 이동할 수 없으면 코드의 일부분에 대한 검사를 비활성화 할 수 있습니다.

불법 코드가 실행되기 바로 전에 특정 규칙 위반에 대한 검사를 중지하고 문제 코드가 완료된 후 해당 규칙에 대한 검색을 다시 사용하도록 설정하는 코드를 명시 적으로 추가하십시오.

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

나는 그 코드를 가져온 답을 참조해야한다고 생각합니다 : http://stackoverflow.com/a/13323445/1372202 – Jannik