रिलीज़ से पहले Android एप्लिकेशन का अनुकूलन [बंद]


120

मैं अपने कार्यक्रम की दक्षता के बारे में " विशेष " स्थिति में हूं। अब मैं एक ऐसे चरण में हूं जहां मुझे एप्लिकेशन के प्रदर्शन में सुधार करने और बैटरी की खपत को कम करने की आवश्यकता है

प्रश्न से पहले:

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

तो, आपकी अनूठी अनुकूलन चाल (है) क्या है?

मैं एक विशेष स्थिति में हूं जहां मैं वास्तव में ज्ञान की तलाश में हूं और मुझे लगता है कि यह डेवलपर्स को एक ऐसी स्थिति के बारे में ज्ञान साझा करने का एक शानदार अवसर होगा जो वे सभी में रहे हैं।

कृपया, महान उत्तरों को वोट करें क्योंकि इससे महान डेवलपर्स को अपने ज्ञान को साझा करने के लिए प्रोत्साहित किया जाएगा।


2
चूंकि दक्षता अंततः कुछ भी करने के लिए नीचे आती है जिसे आपको ज़रूरत नहीं है (या जितनी बार आपको ज़रूरत है उससे अधिक) मुझे लगता है कि बहुत कुछ इस बात पर निर्भर करेगा कि आपके आवेदन को किस प्रकार की चीजों को पूरा करना है ... यह निर्दिष्ट किए बिना, आप सभी कर सकते हैं "सामान्य संदिग्धों" का एक संग्रह प्राप्त कर सकते हैं
क्रिस स्ट्रैटन

1
@ क्रिस स्ट्रैटन: ठीक है, तुम सही हो। लेकिन साथ ही, "सामान्य संदिग्धों" या एक विशिष्ट चाल के बारे में थोड़ा सा जवाब दूसरों के लिए यह निर्णय लेना आसान बना देगा कि क्या "अनुमान" वह है जो वे खोज रहे हैं (और यदि यह उनकी विशिष्ट स्थिति के लिए उपयोगी है)।
व्रोकलाई

हास्यास्पद है कि इस साइट पर कितने दिलचस्प सवाल बंद हो जाते हैं।
पैट्रिक

इस ब्लॉगपोस्ट को पढ़िए medium.com/@hammad_tariq/…
विकसित करें

जवाबों:


68

कुछ बिंदु पर आप उस बिंदु पर पहुंचने वाले हैं जहां ज्ञात चाल का उपयोग करके उनकी सीमाएं प्रभावित होंगी। इस बिंदु पर करने के लिए सबसे अच्छी बात यह है कि आपका कोड प्रोफ़ाइल है और देखें कि आपकी विशिष्ट आवश्यकताओं के आधार पर बोतल-गर्दन किन क्षेत्रों में है।

MAT और Traceview का उपयोग करके RAM के उपयोग की जांच करना : अपने एप्लिकेशन को प्रोफ़ाइल करने के लिए टूल का उपयोग करने के तरीके पर एक लेख।


धन्यवाद! मुझे वास्तव में संसाधनों के साथ उत्तर पसंद हैं। :-)
व्रोकलाई

1
इस ब्लॉगपोस्ट को पढ़ें। medium.com/@hammad_tariq/…
विकसित करें

37

ट्रैक और स्क्वैश आवंटन। जितना अधिक आप आवंटित करते हैं, उतनी बार कचरा कलेक्टर को चलाने की आवश्यकता होगी, आपकी प्रक्रिया को अपेक्षाकृत लंबे समय तक और कुछ भी करने से रोकती है, जैसे कि 100ms या तो।

इसके लिए मुझे पता है सबसे अच्छा उपकरण डीडीएमएस में शामिल आवंटन ट्रैकर है ।

न केवल जीसी उपयोगकर्ता के अनुभव पर प्रभाव डाल सकता है, बल्कि शानदार आवंटन और जीसी कुछ कंप्यूटिंग संसाधनों का उपभोग करते हैं।

यहाँ एक उदाहरण और एक छोटी सी चाल है। मेरे ऐप में, मेरे पास एक घड़ी है जो वर्तमान (ऑडियो) समय दिखाती है, जिसमें दसवां सेकंड भी शामिल है। यह अक्सर अद्यतन किया जाता है। जब भी आप सेटटेक्स्ट के साथ सेटटेक्स्ट () कहते हैं, तब टेक्स्टव्यू आंतरिक रूप से आवंटन करता है । लेकिन यह सेटटेक्स्ट (चार [] पाठ, इंट स्टार्ट, इंट लेन) संस्करण के साथ कुछ भी आवंटित नहीं करता है। यह प्रलेखित नहीं है, और जब मैंने इसके बारे में पूछा तो किसी ने जवाब नहीं दिया।

इस तरह कई हैं। और यह एक कारण है कि मेरे ऐप में 50% मूल कोड शामिल हैं (लेकिन अन्य कारण हैं)।

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


1
बहुत बढ़िया जवाब! ठोस चाल की सराहना की जाती है।
व्रोकलाई

22

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


गहरे रंगों के विवेकपूर्ण उपयोग का अर्थ है बैटरी की जीत।
रॉबर्ट मैसैओली

7
दूसरी ओर, एलसीडी स्क्रीन पर सफेद की तुलना में काला अधिक शक्ति खींचता है, क्योंकि प्रकाश (बैकलाइट द्वारा खट्टा) सफेद बाहर शुरू होता है और काले रंग का उत्पादन करने के लिए सक्रिय रूप से अवरुद्ध होना पड़ता है। [ Scientificamerican.com/article.cfm?id=fact-or-fiction-black-is ] निचला रेखा: इस रंग अनुकूलन पर बहुत अधिक गणना न करें।
स्पार्की

16

कई गतिविधियों वाले अनुप्रयोगों के लिए, आप उन गतिविधियों को पुनः आरंभ नहीं कर रहे हैं, जिन्हें उचित इरादे के झंडे का उपयोग करके सामने लाया जाना चाहिए। जाँच करें कि आपका ढेर नियंत्रण में है, और अनावश्यक विचार, बाइंडिंग और संदर्भ नहीं बनाए जा रहे हैं।

मुझे लगता है कि ऐप रन के रूप में आपको ये सब दिखाने के लिए सबसे अच्छा साधन है:

adb shell dumpsys meminfo 'your apps package name'

1
ओह, यह नया था। साझा करने के लिए धन्यवाद!
व्रोकलाई

15

SQLlite का उपयोग करते समय, अनुक्रमित पर विशेष ध्यान दें। कुछ भी मत मानो। Zwitscher में मुझे जबरदस्त स्पीडअप मिला, जब मैंने खोज के लिए आमतौर पर उपयोग किए जाने वाले स्तंभों पर अनुक्रमित किया।


13

कुछ सुझाव जो आपको यूआई के संदर्भ में अपने ऐप को अनुकूलित करने में मदद कर सकते हैं :

  • convertViewसूची एडेप्टर के लिए उपयोग - यह बहुत महंगा होगा यदि आप अंदर एक नया दृश्य बनाते हैं Adapter.getView()क्योंकि इस दिनचर्या को सूची में प्रत्येक स्थान के लिए कहा जाता है। उपयोग convertViewकरने से आप पहले से बनाए गए दृश्य का पुन: उपयोग कर सकते हैं। ApiDemosViewHolder में अच्छा उदाहरण (उपयोग के साथ ) पाया जा सकता है ।

  • ऐसा हो सकता है कि आपके लेआउट पूरी तरह से अनुकूलित नहीं हैं और इसमें सुधार किया जा सकता है (उदाहरण के लिए माता-पिता के विलय या हटाने का उपयोग करके)। एंड्रॉइड टूल लेआउटटॉप आपके लिए ऐसी स्थिति का पता लगाएगा । व्यक्तिगत विचारों के निरीक्षण के लिए इसका उपयोग HierarchyViewer के साथ किया जा सकता है। अधिक जानकारी यहाँ

  • पृष्ठभूमि को हटाए जाने योग्य - एंड्रॉइड फ्रेमवर्क का उपयोग किया जाता है (क्या यह अभी भी है?) यह पता लगाने में समस्या है कि क्या विचार खींचा जाना चाहिए। एक मौका है कि आपकी (डिफ़ॉल्ट) पृष्ठभूमि को केवल अपनी अपारदर्शी यूआई द्वारा छिपाए जाने के लिए आकर्षित किया जाएगा। इस बेकार ड्राइंग से छुटकारा पाने के लिए बस पृष्ठभूमि को हटाने योग्य बनाएं।

यह एक कस्टम शैली का उपयोग करके किया जा सकता है

<resources>
    <style name="Theme.NoBackground" parent="android:Theme">
        <item name="android:windowBackground">@null</item>
    </style>
</resources>

कुछ सुझाव जो बैटरी उपयोग के संदर्भ में आपके ऐप को अनुकूलित करने में आपकी सहायता कर सकते हैं :

  • नेटवर्किंग प्रकार की जाँच करें और तब तक प्रतीक्षा करें जब तक कि उपयोगकर्ता वाईफाई या 3 जी (और रोमिंग नहीं) के साथ क्षेत्र में हो जाए और उसके बाद ही उसे कनेक्शन का उपयोग करने की अनुमति दें

  • जब भी डाउनलोड और पार्सिंग को तेज करने के लिए संभव हो तो टेक्स्ट डेटा के लिए gzip का उपयोग करें

  • जटिल जावा वस्तुओं जैसे XmlPullParserFactory/ BitmapFactory/ StringBuilder/ Matcherआदि को रीसायकल करें ।

अधिक बैटरी ट्रिक के लिए कोडिंग को जीवन के लिए देखें - बैटरी लाइफ, यही है


"रीसायकल जटिल जावा ऑब्जेक्ट्स जैसे ..." कैसे? जबकि Java में GC
Yousha Aleayoub

9

कुछ सोचने के लिए: स्ट्रिंग का अत्यधिक उपयोग न करें, उदाहरण के लिए एक विशाल लूप में। यह बहुत सारी स्ट्रिंग ऑब्जेक्ट्स बनाएगा जिन्हें GC'ed होना है। "खराब कोडिंग" उदाहरण हर लूप में 2 स्ट्रिंग ऑब्जेक्ट का उत्पादन करेगा। अगला उदाहरण केवल एक अंतिम स्ट्रिंग और एक एकल स्ट्रिंगर का उत्पादन करेगा। गति के लिए विशाल छोरों का अनुकूलन करते समय यह एक बड़ा अंतर बनाता है। मैंने अपने वर्डलिस्ट प्रो एंड्रॉइड ऐप को बनाते समय स्ट्रिंगर का बहुत उपयोग किया और कुछ ही समय में 270000 शब्दों से गुजरते हुए यह वास्तव में तेज़ हो गया।

    //Bad coding:
    String s = "";
    for(int i=0;i<999999;i++){
        s = "Number=";
        s = s + i;
        System.out.println(s);
    }

    //Better coding
    final String txt = "Number=";
    StringBuilder sb = new StringBuilder();
    for(int i=0;i < 999999;i++){
        sb.setLength(0);
        sb.append(txt);
        sb.append(i);
        System.out.println(sb);
    }

मैंने इस मामले के बारे में अधिक विस्तारित ब्लॉगपोस्ट लिखा। यहाँ पढ़ें


6

मुझे लगता है कि हर जगह "अंतिम" चर का उपयोग करना जहां संभव हो, निष्पादन की गति में सुधार कर सकता है।


1
मुझे याद है कि कहीं न कहीं, क्या आप एक लिंक प्रदान कर सकते हैं?
वेस्ले विज़र

1
ऐसा नहीं है कि अंतिम चर के लिए सच है, लेकिन स्थिर अंतिम चर के लिए हो सकता है - देखें stackoverflow.com/questions/3117770/…
एलिस्टेयर कॉलिन्स

लिंक प्रदान नहीं कर सकता, लेकिन मैं इसके बारे में एक नोटिस मिला "रिटेनर्स गाइड टू ऐंड्रॉयड" रेटो मीयर (मई 19 2010) / Google IO द्वारा। यह छोटा है, यह डाउनलोड करने के लिए स्वतंत्र है और यह एक अच्छा ऐप बनाने के बारे में अच्छी सलाह देता है।
स्टेन

2
अंतिम चर कोड को अधिक कुशल बना सकते हैं क्योंकि इसका मतलब होगा कि सभी वस्तुओं को एक ही रन में GC'd किया जाएगा। अलग-अलग समय पर नहीं जब आप उन्हें शून्य पर सेट करते हैं।
रॉबर्ट मैसैओली

1
प्रश्न: संकलक स्पष्ट रूप से आपके लिए नहीं करता है? मुझे लगता है कि इसे अपने कोड विश्लेषण चरण में करना चाहिए।
पवन

6

अपने PNG चित्रों को OptiPNG और PNGCrush जैसे उपकरणों के साथ ऑप्टिमाइज़ करें एपीके आकार से कुछ (किलो) बाइट्स को शेव करने के लिए। वेबसाइटों के लिए छवि अनुकूलन युक्तियाँ यहां भी लागू होती हैं: उपयुक्त चित्र प्रारूपों का उपयोग करें, JPG संपीड़न के साथ खेलें, 8-बिट पारदर्शिता आदि के बजाय द्विआधारी पारदर्शिता का उपयोग करने पर विचार करें।

यदि आप अल्फा चैनल के साथ बड़े PNG शिप करते हैं, तो आप स्टार्टअप स्पीड के लिए कुछ एपीके साइज का व्यापार कर सकते हैं और RGB और A चैनलों के लिए अलग JPGs का उपयोग कर सकते हैं

यदि आप HTTP कनेक्शन बना रहे हैं, तो जांचें कि आपका HTTP क्लाइंट सामग्री संपीड़न का उपयोग करता है। यदि यह HTTP प्रतिसाद प्राप्त करता है, तो जांचें कि यह कैशिंग से संबंधित HTTP हेडर को सही ढंग से समझता है और उसका उपयोग करता है।


अंतर्दृष्टि के लिए धन्यवाद! मैंने इस बारे में कभी नहीं सुना है!
व्रोकलाई

5

यदि आपके पास नेटवर्क संचालन है, तो उसी httpclient उदाहरण का पुनः उपयोग करने का प्रयास करें। नियमित अभिव्यक्ति के उपयोग से बचें।


कारण? क्या आप व्यख्या कर सकते हैं?
युषा अलायबॉब

5

सिस्टम में चल रहे सभी थ्रेड्स को ट्रैक करने के लिए DDMS का उपयोग करने का प्रयास करें। उदाहरण के लिए मैंने देखा है कि मैं html सामग्री प्रदर्शित करने के लिए वेबव्यू का उपयोग कर रहा था, मैंने देखा कि यह कुकी प्रबंधन सत्र प्रबंधन आदि के लिए कुछ सूत्र बनाता है। जिससे मेरी मेमोरी फुट प्रिंट में वृद्धि हुई। इसलिए जब तक आपको जटिल HTML प्रदर्शित करने के लिए गंभीर आवश्यकता नहीं है, HTML सामग्री प्रदर्शित करने के लिए एंड्रॉइड में सामान्य उपयोगिता वर्ग "एचटीएमएल" का उपयोग करने का प्रयास करें। यह उन लोगों के लिए उपयोगी हो सकता है जो Eula प्रदर्शित कर रहे हैं क्योंकि eula typicall में html पाठ होता है।

यदि आपको नेटवर्क संचालन करना है, तो आप AndroidHttpClient का उपयोग करने का प्रयास करें यदि आप शुरुआत कर रहे हैं, तो इसे कैशिंग एसएसटी सत्रों के लिए कुछ अच्छी क्षमताएं मिली हैं और यह सब वास्तव में आपके प्रदर्शन को बेहतर बनाने में मदद करता है। हमेशा अपने सॉकेट कनेक्शन टाइमआउट को लगभग 60 सेकंड या कुछ परिमित मूल्यों के साथ सेट करें क्योंकि अनंत टाइमआउट विशेष रूप से गतिरोध का कारण बन सकता है यदि आप ssl हैंडशेक के दौरान अपने कनेक्शन को छोड़ देते हैं।



4

यदि आप टैग के बीच पाठ प्राप्त करने के लिए स्ट्रिंग हेरफेर दिनचर्या का उपयोग करके अपने XML इनपुट को पार्स कर सकते हैं, तो XPath का उपयोग करने से बचें। मैंने इस मामले में एक 10x सुधार की पुष्टि की है, एक 50000 आइटम डेटा सेट पर, एक एचटीसी डिजायर पर।


3

मुझे पता है कि मैं इस वार्तालाप में थोड़ा बाद में शामिल हो रहा हूं, लेकिन एक ही स्थान पर बहुत सारे अच्छे सुझावों का होना सही होगा, इसलिए मुझे उम्मीद है कि यह धागा बहुत बार जीवित और अद्यतन होगा। मेरी युक्तियां:

  • महंगी नौकरियों के साथ यूआई थ्रेड को ब्लॉक न करें, यदि ऐप से कोई प्रतिक्रिया नहीं होती है तो उपयोगकर्ता छोड़ देगा (AsyncThreads का उपयोग करें)।
  • LINT , नए टूल का उपयोग करें जो संभावित बगों के लिए एंड्रॉइड प्रोजेक्ट स्रोतों को स्कैन करता है।

..अपडेट किया जाएगा..

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