2012-03-20 22 views
9

मैंने अपने ऐप में स्ट्रिक्टोड सक्षम किया है और यह अपेक्षा के अनुसार कुछ क्रैश पैदा कर रहा है। मैं कैसे पता लगा सकता हूं कि मेरे कोड में मैं इन नीतियों का उल्लंघन कर रहा हूं?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

आपने सिकटोड को कैसे सक्षम किया? कृपया कोड पेस्ट करें ताकि हम इसका निरीक्षण कर सकें। – louielouie

+0

DetectAll.penaltyLog()। दोनों के लिए पेनल्टीडिथ()।नीचे आपकी प्रतिक्रिया को देखते हुए, ऐसा लगता है कि मुझे अपने लॉग फ़िल्टर में "सख्त मोड" जोड़ने की आवश्यकता है :) – 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()); 

यदि आप मुख्य थ्रेड पर नेटवर्क कहते हैं, तो आप इस अपवाद जो समझना कठिन है मिल जाएगा:

यहाँ तुम क्या शायद वर्तमान में है अपनी नीति में penaltyLog() जोड़ें ...

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

तो आप एक बहुत मोर देखेंगे नीचे एक की तरह एक उपयोगी संदेश। यह लॉगकैट आउटपुट में होगा।

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

जब भी मुझे इस तरह के स्टैक निशान दिखाई देते हैं तो मैं हमेशा अपनी गतिविधि जीवन चक्र घटनाओं को देखता हूं। चेकआउट करें कि आपके ऑनक्रेट, ऑनर्यूम, ऑन पॉज़ विधियों में क्या चल रहा है (और अधिक जीवन चक्र घटनाएं हैं लेकिन ये आम हैं)। उन विधियों में ब्रेक पॉइंट डालें और देखें कि इस घातक संदेश के साथ कौन सा टर्मिनेट करता है। फिर इसे वहां से ले जाएं।

का उपयोग कर

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

यह इस समस्या को दूर करने के लिए एक सुंदर अच्छा प्रारंभिक बिंदु होना चाहिए इस त्रुटि को पकड़ने की कोशिश करो।

0

स्ट्रिक्टोड (android.os.StrictMode) वर्ग का उपयोग विभिन्न नीतियों को सक्षम और लागू करने के लिए किया जा सकता है जिन पर जांच और रिपोर्ट की जा सकती है।

यह डिस्क लिखने के उल्लंघन को निष्पादित करने में एक स्ट्रिक्टोड उल्लंघन हो सकता है जो तब होता है जब आप मुख्य UI थ्रेड पर डिस्क लिखते हैं। इसे हल करने के लिए, आपको मुख्य थ्रेड से डिस्क लिखने की आवश्यकता है।

यदि आप इस बिंदु पर कोड नहीं ले जा सकते हैं, तो आप कोड के एक हिस्से के लिए चेक अक्षम कर सकते हैं।

अपमानजनक कोड निष्पादित होने से ठीक पहले किसी विशेष नियम उल्लंघन की जांच रोकने के लिए स्पष्ट रूप से कोड जोड़ें और फिर अपमान कोड पूरा होने के बाद उस नियम के लिए पहचान को फिर से सक्षम करें।

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

संबंधित मुद्दे