5

से प्रीलोडेड सिस्टम ड्रॉबल्स (बिटमैप्स) के आईडी या नामों को कैसे ढूंढें, मैं अपने ऐप के मेमोरी उपयोग का विश्लेषण कर रहा हूं, और अजीब Drawables मिला है, जो लगातार ढेर के कुछ मेगाबाइट "खाता है"। ढेर डंप में प्रकट होता हैस्मृति डंप

path_to_gc_roots ऊपर बिटमैप्स

यह हमेशा बिटमैप्स में से एक के लिए जड़ों जीसी के लिए पथ

Dominator tree 2 के साथ Dominator पेड़ बहुत बड़ी बिटमैप्स: यहाँ MAT से कुछ स्क्रीनशॉट हैं मेरे फोन से (सैमसंग गैलेक्सी नेक्सस, ओएस 4.1.1), इससे कोई फर्क नहीं पड़ता कि मैं अपने ऐप का कितना समय या गहन उपयोग करता हूं।

मै मैट का उपयोग करके इस बिटमैप्स के स्रोत को खोजने की कोशिश कर चुका हूं - बिना किस्मत के। सभी उपयोगी जानकारी मुझे लगता है करने में सक्षम था width और बिटमैप्स का height था, यह दोनों 512x512 है: bitmap_info

लेकिन हमारे एप्लिकेशन को किसी भी एकल 512x512 ड्रॉएबल जरूरत नहीं है। मुझे लगता है कि यह कुछ "सिस्टम" drawables है। लेकिन वास्तव में क्या? उन्हें इतना बड़ा क्यों?

मैंने android.content.res.Resources कक्षा के स्रोत कोड को भी देखा है, sPreloadedDrawables फ़ील्ड का उपयोग खोज - कोई भाग्य के साथ भी। मुझे मेमोरी डंप से मिलता है - keysPreloadedDrawables सरणी से है, लेकिन मैं इस कुंजी से फ़ाइल नाम या संसाधन आईडी निर्धारित नहीं कर सकता।

तो, मेरे सवालों का है:

  • मैं नाम या इस बिटमैप्स की आईडी कैसे तय कर सकते हैं?

  • इस विशाल बिटमैप्स के लिए क्या लोड किया जाता है और वे हमेशा स्मृति में क्यों रहते हैं?

अद्यतन:

मैं look at this bitmaps from memory dump के लिए एक रास्ता मिल गया है। यह दो बिटमैप्स एक साधारण ग्रेडियेंट, एक काला, अन्य - सफेद है। मुझे लगता है कि यह Holo.Light और Holo.Dark आईसीएस विषयों के लिए संसाधन है। लेकिन मेरा दूसरा सवाल अभी भी वास्तविक है: यह बिटमैप हमेशा स्मृति में क्यों रहता है? क्या उन्हें अपलोड या रीसायकल करने का कोई तरीका है?

+0

तुम क्यों इन बिटमैप्स का नाम/आईडी चाहते हैं कर रहे हैं? – toadzky

+0

मुझे यह बिटमैप लोड करने के लिए इस बिटमैप्स का नाम/आईडी चाहिए और शायद मेरे कोड – HitOdessit

उत्तर

0

एंड्रॉइड.जर से यह तस्वीर, जिसे आपको अपनी परियोजना में शामिल करना है। ऊर्ध्वाधर ढाल के साथ दो वर्ग हैं। पहला - 0x000000 से 0x272d33 तक, दूसरा - 0xe8e8e8 से 0xfafafa तक। आप उन्हें android.jar/res/drawable-nodpi/background_holo_dark.png और background_holo_light.png में ढूंढ सकते हैं। बेशक, आप अपने एंड्रॉइड एसडीके संस्करण के आधार पर अलग-अलग परिणाम प्राप्त कर सकते हैं।

+0

से उनके साथ कुछ करने की कोशिश कर रहा है, इसने मेरे प्रश्न का उत्तर नहीं दिया - ** कैसे ** इस के नाम ढूंढने के लिए बिटमैप्स केवल मेमोरी डंप है? आपको यह नाम कैसे मिला? – HitOdessit

+0

यदि संसाधन सार्वजनिक है, तो आईडी आईडी फ़ाइल नाम है। यह android.R.drawable.background_holo_ [अंधेरा | प्रकाश] – toadzky

0

मुझे लगता है कि वे स्मृति में रहेंगे क्योंकि वे गतिविधियों के लिए डिफ़ॉल्ट पृष्ठभूमि हैं। अपनी थीम में एक अलग पृष्ठभूमि निर्दिष्ट करने का प्रयास करें और देखें कि वे अभी भी वहां हैं या नहीं।

+0

होना चाहिए यदि यह एक मामला है, तो एक समय के समय में स्मृति में दो थीम क्यों हैं? (अंधेरे और हल्के विषयों) – HitOdessit

+0

वास्तव में कोई विचार नहीं है। – toadzky

0

प्रीलोड किए गए ड्रॉबल्स ज़ीगोट द्वारा लोड किए जाते हैं।

ZygoteInit#preloadResources()

/** 
* Load in commonly used resources, so they can be shared across 
* processes. 
* 
* These tend to be a few Kbytes, but are frequently in the 20-40K 
* range, and occasionally even larger. 
*/ 
private static void preloadResources() { 
    final VMRuntime runtime = VMRuntime.getRuntime(); 

    try { 
     mResources = Resources.getSystem(); 
     mResources.startPreloading(); 
     if (PRELOAD_RESOURCES) { 
      Log.i(TAG, "Preloading resources..."); 

      long startTime = SystemClock.uptimeMillis(); 
      TypedArray ar = mResources.obtainTypedArray(
        com.android.internal.R.array.preloaded_drawables); 
      int N = preloadDrawables(runtime, ar); 
      ar.recycle(); 
      Log.i(TAG, "...preloaded " + N + " resources in " 
        + (SystemClock.uptimeMillis()-startTime) + "ms."); 


      startTime = SystemClock.uptimeMillis(); 
      ar = mResources.obtainTypedArray(
        com.android.internal.R.array.preloaded_color_state_lists); 
      N = preloadColorStateLists(runtime, ar); 
      ar.recycle(); 
      Log.i(TAG, "...preloaded " + N + " resources in " 
        + (SystemClock.uptimeMillis()-startTime) + "ms."); 
     } 
     mResources.finishPreloading(); 
    } catch (RuntimeException e) { 
     Log.w(TAG, "Failure preloading resources", e); 
    } 
} 

तुम देखो, प्रीलोडेड ड्रॉएबल com.android.internal.R.array.preloaded_drawables

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