2013-01-07 13 views
9

पर ऐप चल रहा है, जबकि पृष्ठभूमि प्रक्रिया यादृच्छिक रूप से मर रही है। मैंने एक एंड्रॉइड ऐप लिखा है जो सैमसंग एस 3 को छोड़कर मैंने कोशिश किए हर फोन पर समस्याओं के बिना चलता है। क्या होता है कि, जबकि मेरा ऐप चल रहा है, अन्य पृष्ठभूमि प्रक्रियाएं (अन्य ऐप्स, जो है) मरना शुरू कर देंगे। उदाहरण के लिए, मेरे ऐप का उपयोग करने के कुछ समय बाद, लाइव वॉलपेपर मर जाएगा, और उपयोगकर्ता को मेरे ऐप से बाहर निकलने के बाद अपने फोन पर ब्लैक बैकग्राउंड मिलेगी। और अंत में, इसका उपयोग करने के कुछ समय बाद, मेरे ऐप को ओएस द्वारा भी मार दिया गया। निराशाजनक बात यह है कि मुझे लॉग में कोई त्रुटि संदेश नहीं दिखाई दे रहा है जो मुझे इस बात का संकेत देगा कि वास्तव में समस्या क्या है।सैमसंग एस 3

यह केवल सैमसंग एस 3 पर होता है (और उदाहरण के लिए एस 2 पर नहीं)।

मैंने सोचा था कि यह स्मृति से संबंधित था, क्योंकि मेरा ऐप बहुत मेमोरी गहन है (यह वेब से बहुत सारी छवियां लोड कर रहा है), लेकिन मुझे लॉग में कोई "स्मृति नहीं" त्रुटियां नहीं दिखाई दे रही हैं।

मुझे यह भी संदेह है कि मैं जिस HTTP ढांचे का उपयोग कर रहा हूं वह छोटी हो सकती है, इसलिए मैंने अपाचे एचटीपी कॉम्पोनेंट्स से java.net पर स्विच किया। HttpURLConnection, लेकिन इससे मदद नहीं मिली।

यह क्यों हो रहा है या इसे डीबग करने के तरीके के बारे में कोई विचार की सराहना की जाएगी।

यहाँ लॉग से एक अंश है जो मर रहा है कुछ पृष्ठभूमि प्रक्रियाओं से पता चलता है (उदाहरण के लिए, लाइव वॉलपेपर):

01-07 01:57:37.245: I/InputDispatcher(2296): Delivering touch to current input target: action: 0x1 
01-07 01:57:37.505: D/dalvikvm(29490): GC_FOR_ALLOC freed 1535K, 17% free 28032K/33735K, paused 71ms, total 71ms 
01-07 01:57:37.580: D/dalvikvm(6718): WAIT_FOR_CONCURRENT_GC blocked 0ms 
01-07 01:57:37.620: D/dalvikvm(6718): GC_EXPLICIT freed 91K, 9% free 17663K/19399K, paused 3ms+5ms, total 40ms 
01-07 01:57:38.190: I/InputReader(2296): Touch event's action is 0x0 (deviceType=0) [pCnt=1, s=0.428 ] 
01-07 01:57:38.190: I/InputDispatcher(2296): Delivering touch to current input target: action: 0x0 
01-07 01:57:38.190: I/InputDispatcher(2296): Delivering touch to current input target: action: 0x0 
01-07 01:57:38.190: I/InputDispatcher(2296): Delivering touch to current input target: action: 0x0 
01-07 01:57:38.190: I/InputDispatcher(2296): Delivering touch to current input target: action: 0x0 
01-07 01:57:38.190: I/InputDispatcher(2296): Delivering touch to current input target: action: 0x0 
01-07 01:57:38.335: I/InputReader(2296): Touch event's action is 0x1 (deviceType=0) [pCnt=1, s=] 
01-07 01:57:38.335: I/InputDispatcher(2296): Delivering touch to current input target: action: 0x1 
01-07 01:57:38.335: I/InputDispatcher(2296): Delivering touch to current input target: action: 0x1 
01-07 01:57:38.335: I/InputDispatcher(2296): Delivering touch to current input target: action: 0x1 
01-07 01:57:38.750: D/dalvikvm(29490): GC_FOR_ALLOC freed 1688K, 18% free 27981K/33735K, paused 114ms, total 114ms 
01-07 01:57:39.695: W/PowerManagerService(2296): Timer 0x3->0x3|0x0 
01-07 01:57:39.700: D/PowerManagerService(2296): setTimeoutLocked::SmartSleep : after19500 
01-07 01:57:39.930: I/InputReader(2296): Touch event's action is 0x0 (deviceType=0) [pCnt=1, s=0.429 ] 
01-07 01:57:39.930: I/InputDispatcher(2296): Delivering touch to current input target: action: 0x0 
01-07 01:57:39.930: I/InputDispatcher(2296): Delivering touch to current input target: action: 0x0 
01-07 01:57:39.930: I/InputDispatcher(2296): Delivering touch to current input target: action: 0x0 
01-07 01:57:39.930: I/InputDispatcher(2296): Delivering touch to current input target: action: 0x0 
01-07 01:57:39.930: I/InputDispatcher(2296): Delivering touch to current input target: action: 0x0 
01-07 01:57:40.020: D/DeviceInfo(2296): SysScope Service has unexpectedly disconnected! 
01-07 01:57:40.065: I/InputReader(2296): Touch event's action is 0x1 (deviceType=0) [pCnt=1, s=] 
01-07 01:57:40.065: I/InputDispatcher(2296): Delivering touch to current input target: action: 0x1 
01-07 01:57:40.065: I/InputDispatcher(2296): Delivering touch to current input target: action: 0x1 
01-07 01:57:40.065: I/InputDispatcher(2296): Delivering touch to current input target: action: 0x1 
**01-07 01:57:40.080: I/ActivityManager(2296): Process com.android.smspush (pid 28031) (adj 1) has died.** 
01-07 01:57:40.090: W/WallpaperService(2296): Wallpaper service gone: ComponentInfo{com.sec.ccl.csp.app.secretwallpaper.themetwo/com.sec.ccl.csp.app.secretwallpaper.themetwo.SecretWallpaperService} 
01-07 01:57:40.125: D/KeyguardViewMediator(2296): setHidden false 
**01-07 01:57:40.135: I/ActivityManager(2296): Process com.android.server.device.enterprise:remote (pid 28016) (adj 1) has died.** 
**01-07 01:57:40.145: I/ActivityManager(2296): Process com.sec.ccl.csp.app.secretwallpaper.themetwo (pid 29715) (adj 1) has died.** 
01-07 01:57:40.285: D/dalvikvm(29490): GC_CONCURRENT freed 1616K, 17% free 28289K/33735K, paused 27ms+21ms, total 178ms 
01-07 01:57:40.285: D/dalvikvm(29490): WAIT_FOR_CONCURRENT_GC blocked 112ms 
01-07 01:57:40.445: D/dalvikvm(2296): GC_CONCURRENT freed 1869K, 59% free 24186K/57991K, paused 26ms+12ms, total 197ms 
01-07 01:57:40.660: D/dalvikvm(29490): GC_CONCURRENT freed 1587K, 16% free 28622K/33735K, paused 3ms+7ms, total 51ms 
01-07 01:57:40.685: D/KeyguardViewMediator(2296): setHidden false 
+1

आपके विवरण से ऐसी त्रुटि का पता लगाने में बहुत मुश्किल है। हालांकि यह विशिष्ट एस 3 से संबंधित हो सकता है। क्या आप इसे किसी अन्य एस 3 फोन पर आज़मा सकते हैं? मैं यह कह रहा हूं क्योंकि यह बहुत अजीब है कि अन्य ऐप्स आपके द्वारा मारे गए हैं और कुछ समय बाद आपका ऐप भी मारे गए। हो सकता है कि कुछ ऐसा है जो सामान्य रूप से ऐप्स को मारता है (एक वायरस? या एक दोषपूर्ण स्मृति?)। इसके अलावा लाइव वॉलपेपर एंड्रॉइड द्वारा हर समय मारे जाते हैं लेकिन जैसे ही संसाधन आपकी स्थिति में मुक्त हो जाते हैं, वे पुन: स्थापित होते हैं, इसलिए ऐसा नहीं होता है कि कुछ सिस्टम के डिफ़ॉल्ट व्यवहार को रोकता है। – Christos

+0

मैंने 3 अलग-अलग एस 3 उपकरणों पर कोशिश की (और वे सभी एंड्रॉइड के समान संस्करण को भी नहीं चला रहे थे)। समस्या मूल स्मृति रिसाव में थी, मेरा जवाब देखें। और यह पता लगाने में वास्तव में मुश्किल था :( – kolufild

उत्तर

7

मैंने इस मुद्दे को ट्रैक किया है। यह वास्तव में here वर्णित Typeface.createFromAsset() विधि के कारण एक स्मृति रिसाव था। लीक करने वाली स्मृति मूल स्मृति (जावा ढेर पर नहीं) है, इसलिए यही कोई आउटऑफमेमरी अपवाद नहीं था।

क्या अजीब बात यह है कि यह समस्या हनीकॉम (3.0) के बाद तय की जानी चाहिए, लेकिन मेरे मामले में, यह जेलीबीन (4.1) चला रहा है जो एस 3 पर हो रहा है। (मैंने कई एस 3 पर कोशिश की, और वे सभी को यह मुद्दा है)। यह दिलचस्प होगा अगर जेलीबीन चलाने वाले किसी दूसरे फोन तक पहुंचने वाला कोई व्यक्ति परीक्षण करेगा, तो हम देख सकते हैं कि यह वहां पुन: उत्पन्न होता है (जिस लिंक को मैंने पोस्ट किया है उसे पुन: पेश करने का एक आसान तरीका दिखाता है)।

9

इसमें 3 मुख्य कारण एक पृष्ठभूमि प्रक्रिया stoped किया जा सकता है, और मैं शुरू करेंगे से सबसे संभावित करने के लिए कम:

आप inadvertedly पूछा यह पूछा रोकने के लिए

एक बग है कि अजीब स्थितियों में सेवा बंद करने के लिए अनुरोध कर सकता है के लिए अपने कोड की जाँच करें। यह सेवा के भीतर या आपके आवेदन से अन्य गतिविधि में हो सकता है।

न आया हुआ अपवाद

सेवा न आया हुआ अपवाद मारा। इस स्थिति में आपको लॉग में जानकारी देखने में सक्षम होना चाहिए, हालांकि लॉग लंबे समय तक नहीं टिकता है और आप इसे याद कर सकते हैं।

इस संभावना को संबोधित करने के लिए आप एक DefaultUncaughtExceptionHandler इस तरह सेट कर सकते हैं:

UncaughtExceptionHandler currentHandler = Thread.getDefaultUncaughtExceptionHandler(); 
if (!(currentHandler instanceof DefaultExceptionHandler)) { 
    // Register default exceptions handler 
    Thread.setDefaultUncaughtExceptionHandler(
      new DefaultExceptionHandler(currentHandler)); 
} 

और इस तरह एक अस्थायी फ़ाइल पर लिखने में अपने DefaultExceptionHandler वर्ग को परिभाषित:

public class DefaultExceptionHandler implements UncaughtExceptionHandler { 
    private UncaughtExceptionHandler defaultExceptionHandler; 

    public DefaultExceptionHandler(UncaughtExceptionHandler pDefaultExceptionHandler) 
    { 
     defaultExceptionHandler = pDefaultExceptionHandler; 
    } 

    public void uncaughtException(Thread t, Throwable e) { 
     final Writer result = new StringWriter(); 
     final PrintWriter printWriter = new PrintWriter(result); 
     e.printStackTrace(printWriter); 
     try { 
      String filename = "your_temp_filename"; 
      BufferedWriter bw = new BufferedWriter(new FileWriter(filename)); 
      bw.write(result.toString()); 
     bw.flush(); 
     bw.close(); 
     } catch (Exception e2) { 
      e2.printStackTrace(); 
     } 
     defaultExceptionHandler.uncaughtException(t, e);   
    } 
} 

Android ओएस सेवा पूछा

आपके विवरण के आधार पर यह सबसे संभावित है कारण, और जिस पर आप पर कम नियंत्रण है।

एंड्रॉइड को आपके आवेदन को मारने से रोकने का कोई तरीका नहीं है जब इसे अतिरिक्त संसाधनों की आवश्यकता होती है या जब ऐसा लगता है कि आपकी सेवा बहुत लंबे समय तक चल रही है। मारने से पहले चलाने के लिए सेवा की अनुमति समय डिवाइस से डिवाइस में बदल सकती है, क्योंकि यह आवंटित संसाधनों पर निर्भर करता है (यानी स्क्रीन आकार के साथ छवियों की स्मृति आवश्यकता में परिवर्तन) और संसाधन उपलब्ध हैं।

इस मामले में, केवल उचित बात आप कर सकते हैं आप सेवा foreground service के रूप में प्रयोग शुरू कर रहा है:

startForeground(int id, Notification notification); 

जो ओएस है कि आपकी सेवा उपयोगकर्ता दृश्यता है और कम संभावित में रखा जाएगा मारने के लिए सूचित सेवा की सूची। कुछ उपकरणों के साथ इसका उपयोग करने का मेरा अनुभव यह है कि सेवा बिना किसी रुकावट के चल रही है, भले ही आप औसत समय में कई अन्य अनुप्रयोगों का उपयोग करें।

सम्मान।

+0

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

+0

मुझे यह नहीं मिला :-) शायद आपको अपना प्रश्न थोड़ा सा करना चाहिए। वैसे भी, आप ऊपर वर्णित स्थिति 3 में हैं, लेकिन आपका आवेदन वह है जो ओएस को स्मृति को पुनः प्राप्त करने के लिए अन्य पृष्ठभूमि सेवाओं को रोकने के लिए प्रेरित करता है। क्या आपने यह जांचने के लिए 'डीडीएमएस - आवंटन ट्रैकर' और/या 'MAT'' को आजमाया है कि आपका ऐप स्मृति का उपयोग कैसे कर रहा है और संभावित सुधार ढूंढ सकता है? – Luis

+0

मैंने कोशिश की। मेमोरी उपयोग अधिकतम ढेर आकार के करीब कभी नहीं मिलता है। साथ ही, स्मृति उपयोग कम होने पर भी क्षणों पर पुनरारंभ होता है। ऐसा लगता है कि मैं आपके द्वारा वर्णित तीसरे परिदृश्य में भाग रहा हूं, सिवाय इसके कि मेरा ऐप एक सेवा नहीं है। लेकिन निराशाजनक बात यह है कि लॉग यह नहीं दिखाते कि ऐप्स क्यों मारे गए हैं। – kolufild

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