एंड्रॉइड एप्लिकेशन के आकार को कैसे बढ़ाएं?


125

मैं एक Android एप्लिकेशन लिख रहा हूं जिसमें कई 3D मॉडल का उपयोग किया गया है। बनावट के साथ ऐसा मॉडल बहुत सारी मेमोरी ले सकता है। मुझे पता चला कि निर्माता ढेर के आकार पर एक सीमा निर्धारित करता है जिसका एक अनुप्रयोग उपयोग कर सकता है। उदाहरण के लिए मेरा टैबलेट सैमसंग गैलेक्सी टैब 8.9 P7310 64MB मेमोरी ले सकता है।

क्या मेमोरी के इस आकार को बढ़ाने का कोई तरीका है जिसका कोई अनुप्रयोग उपयोग कर सकता है?

जवाबों:


210

आप बड़े हीप आकार का अनुरोध करने के लिए android: bigHeap = "true" का उपयोग कर सकते हैं , लेकिन यह किसी भी पूर्व हनीकॉम्ब डिवाइस पर काम नहीं करेगा। पूर्व 2.3 उपकरणों पर, आप VMRuntime वर्ग का उपयोग कर सकते हैं, लेकिन यह जिंजरब्रेड और इसके बाद के संस्करण पर काम नहीं करेगा।

संभव के रूप में बड़ी सीमा रखने का एकमात्र तरीका NDK के माध्यम से मेमोरी इंटेंसिव कार्य करना है, क्योंकि NDK SDK की तरह मेमोरी लिमिट नहीं लगाता है।

वैकल्पिक रूप से, आप केवल उस मॉडल के भाग को लोड कर सकते हैं जो वर्तमान में देखने में है, और शेष को लोड करें जैसा कि आपको इसकी आवश्यकता है, जबकि मेमोरी से अप्रयुक्त भागों को हटा दें। हालाँकि, यह संभव नहीं हो सकता है, यह आपके ऐप पर निर्भर करता है।


एनडीके दिलचस्प लग रहा है। क्या मैं एसडीके के साथ पहले से लिखे गए अपने कोड के संयोजन में इसका उपयोग कर सकता हूं?
कोक्सी

3
यह पूरी तरह से निर्भर करता है कि आपके पास कौन सा कोड है। मैं NDK का विशेषज्ञ नहीं हूं, और केवल मूल बातें जानता हूं। मैं आपको एंड्रॉइड-एनडीके Google समूह पर अपने कोड के विवरण के साथ यह सवाल पूछने की सलाह दूंगा, या एसओ के लिए एंड्रॉइड-एनडीके टैग के साथ एक नया प्रश्न पोस्ट करूंगा।
राघव सूद

मुझे आश्चर्य है कि अगर हम "बस" यूनीट 3 डी का उपयोग प्रश्न के अधिक विशिष्ट उत्तर के रूप में नहीं कर सकते हैं ("कई 3D मॉडल का उपयोग करता है") ... एकता एनडीके का उपयोग करती है या नहीं इस पर कोई स्पष्ट प्रमाण जल्दी से नहीं मिल सकता है।
क्रैगॉक्स

3
largeHeap=trueएफटीडब्ल्यू
लुइस अर्तोला

2
एंड्रॉइड एप के डेवलपर्स वास्तव में मजाकिया हैं, वे ऐसे हैं जैसे आप अधिक हीप चाहते हैं? ठीक है, यह अनुरोध करते हैं, यह केवल उन लोगों के लिए है, जिन्हें इसकी आवश्यकता है ... इस बीच हर डेवलपर इसे पहली चीज के रूप में जोड़ रहा है जब ऐप उत्पादन के लिए आता है :)
AndroidLover

110

क्या मेमोरी के इस आकार को बढ़ाने का कोई तरीका है जिसका कोई अनुप्रयोग उपयोग कर सकता है?

एपीआई स्तर 11+ पर चल रहे अनुप्रयोग हो सकता है android:largeHeap="true"पर <application>एक बड़े से भी सामान्य ढेर आकार अनुरोध करने के लिए प्रकट में तत्व है, और getLargeMemoryClass()पर ActivityManagerआपको बता देंगे कितना बड़ा है कि ढेर। तथापि:

  1. यह केवल एपीआई स्तर 11+ (यानी, छत्ते और उससे आगे) पर काम करता है

  2. बड़े ढेर कितने बड़े होंगे, इसकी कोई गारंटी नहीं है

  3. उपयोगकर्ता आपके बड़े-ढेर अनुरोध का अनुभव करेगा, क्योंकि यह रैम से बाहर उनके अन्य ऐप को मजबूर करेगा, आपके बड़े हीप द्वारा उपयोग के लिए सिस्टम रैम को मुक्त करने के लिए अन्य ऐप की प्रक्रियाओं को समाप्त कर देगा।

  4. # 3, और इस तथ्य के कारण कि मैं उम्मीद करता हूं कि android:largeHeapदुर्व्यवहार किया जाएगा, इसके लिए समर्थन भविष्य में छोड़ दिया जा सकता है, या उपयोगकर्ता को इसके बारे में इंस्टॉल समय पर चेतावनी दी जा सकती है (उदाहरण के लिए, आपको इसके लिए एक विशेष अनुमति का अनुरोध करने की आवश्यकता होगी )

  5. वर्तमान में, इस सुविधा को हल्के ढंग से प्रलेखित किया गया है


@CommonsWare यदि एक बड़ी राशि उपलब्ध नहीं है, तो मैं पहले से लोड की गई वस्तुओं (छवियों की तरह) को कैसे हटा सकता हूं?
Jeongbebs

@MiguelRivera: चित्रों के लिए, आदर्श आप अपनी स्मृति (देखें पुनरावृत्ति inBitmapपर BitmapOptions)। इसके अलावा, उनके लिए सभी संदर्भों को हटा दें, और अंततः वे कचरा एकत्र कर लेंगे।
कॉमंसवेयर

और आप क्या निर्णय लेते हैं?
गेनाडी रियाबकिन

@zest: मुझे नहीं पता कि आप किस चीज का जिक्र कर रहे हैं, क्षमा करें।
कॉमन्सवेयर

2
@Eftekhari: सीधे नहीं, आपके ऐप के लिए। अधिक सामान रखने से आपको अधिक CPU समय उस सामान से गुजरने में खर्च हो सकता है, लेकिन वहां का विवरण इस बात पर निर्भर करेगा कि आप मेमोरी के साथ क्या कर रहे हैं और अनुरोध करने के लिए सीधे बंधे नहीं हैं android:largeHeap। हालाँकि, अन्य ढेर प्रक्रियाओं का अनुरोध उपयोगकर्ता अनुभव को समग्र रूप से नुकसान पहुंचा सकता है, अन्य आवेदन प्रक्रियाओं को पहले से समाप्त करने के लिए मजबूर करने से अन्यथा आवश्यक होगा।
कॉमन्सवेयर

22

आप डायनामिक रूप से हीप साइज़ नहीं बढ़ा सकते।

आप android:largeHeap="true"मैनिफ़ेस्ट में उपयोग करके अधिक उपयोग करने का अनुरोध कर सकते हैं ।

इसके अलावा, आप का उपयोग कर सकते हैं native memory (NDK & JNI), तो आप वास्तव में ढेर आकार सीमा को बायपास करें।

यहाँ मैंने इसके बारे में कुछ पोस्ट की हैं:

और यहाँ एक पुस्तकालय है जो मैंने इसके लिए बनाया है:


@ प्रति एप्लिकेशन जावा स्तर पर हीप सीमा और मूल अलग है? उदाहरण के लिए s5 devcie 128mb java heap की सीमा और देशी दूसरी128 mb ले सकते हैं?
NitZRobotKoder

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

अगर मेरा ऐप देशी .so + java android Platform + java POJO लॉजिक + जावास्क्रिप्ट का उपयोग कर रहा है तो मेरा मतलब है। क्या हर स्तर पर android के अलग-अलग आकार होते हैं?
NitZRobotKoder


@NitZRobotKoder No. ढेर का आकार जावा / कोटलिन दुनिया के लिए है, जहाँ आप बहुत अधिक उपयोग करने पर OOM अपवाद प्राप्त कर सकते हैं। बाकी के लिए, यह मूल स्मृति है।
एंड्रॉयड डेवलपर

6

दूसरी प्रक्रिया का उपयोग करें। AndroidManifestनए के Serviceसाथ घोषणा करें

android:process=":second"

पहली और दूसरी प्रक्रिया के बीच विनिमय BroadcastReceiver


5

यह आपके एंड्रॉइड ओएस के अनुसार दो तरीकों से किया जा सकता है।

  1. आप android:largeHeap="true"बड़े आकार का अनुरोध करने के लिए Android मेनिफ़ेस्ट के एप्लिकेशन टैग में उपयोग कर सकते हैं , लेकिन यह किसी भी पूर्व हनीकॉम्ब डिवाइस पर काम नहीं करेगा।
  2. पूर्व 2.3 उपकरणों पर, आप VMRuntime वर्ग का उपयोग कर सकते हैं , लेकिन यह जिंजरब्रेड और ऊपर देखें के नीचे काम नहीं करेगा कि यह कैसे करना है।
VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE);

HeapSize सेट करने से पहले सुनिश्चित करें कि आपने उचित आकार दर्ज किया है जो अन्य एप्लिकेशन या OS कार्यक्षमता को प्रभावित नहीं करेगा। सेटिंग्स से पहले यह जांच लें कि आपका ऐप कितना आकार लेता है और फिर अपनी नौकरी को पूरा करने के लिए आकार निर्धारित करें। स्मृति का इतना उपयोग न करें अन्यथा अन्य एप्लिकेशन प्रभावित हो सकते हैं।

संदर्भ: http://dwij.co.in/increase-heap-size-of-android-application


4
तो जाहिर है, <2.3 का एक तरीका है, और> 2.3 का एक रास्ता है, लेकिन 2.3 खराब है!
माइकल

3

जो मुझे याद है कि आप VMRuntimeशुरुआती Android संस्करणों में कक्षा का उपयोग कर सकते हैं, लेकिन अब आप अभी और नहीं कर सकते।

मुझे नहीं लगता है कि डेवलपर को मोबाइल वातावरण में ढेर का आकार चुनने देना सुरक्षित माना जा सकता है। मुझे लगता है कि यह आसान है कि आप एक विशिष्ट डिवाइस में ढेर आकार को संशोधित करने का एक तरीका खोज सकते हैं (प्रोग्रामिंग पक्ष पर नहीं) जो कि इसे एप्लिकेशन से ही संशोधित करने का प्रयास कर रहा है।


0

जावा हीप को बढ़ाना अनुचित रूप से घाटे वाले मोबाइल पुनर्जीवित करता है। कभी-कभी यह केवल कचरा कलेक्टर के लिए प्रतीक्षा करने के लिए पर्याप्त होता है और फिर ढेर स्थान कम होने के बाद अपने संचालन को फिर से शुरू करें। इस स्थिर विधि का उपयोग करें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.