Android uygulamasını yayınlamadan önce optimize etme [kapalı]


120

Programımın verimliliği konusunda " özel " bir durumdayım . Şimdi uygulamanın performansını iyileştirmem ve pil tüketimini azaltmam gereken bir aşamadayım .

Sorudan önce:

Şimdi, diğer geliştiricilerin kendi uygulamalarını optimize etmek için kullandıkları özel düzeltmelerini merak ediyorum . Kullanıcıların asla tanımayacağı veya dikkat edemeyeceği şeyler. Bununla birlikte, düzeltmeler ya pil ömrünü uzatacak ya da uygulamanın bakımını iyileştirmeye yardımcı olacaktır.

Peki, benzersiz optimizasyon hileleriniz nedir?

Gerçekten bilgi aradığım belirli bir durumdayım ve bunun, geliştiricilerin içinde bulundukları bir durum hakkındaki bilgilerini paylaşmak için harika bir fırsat olacağını düşünüyorum.

Lütfen, harika geliştiricileri bilgilerini paylaşmaya teşvik edecek harika yanıtları oylayın.


2
Verimlilik nihayetinde ihtiyacınız olmayan (veya gerekenden daha sık) bir şey yapmamaya bağlı olduğundan, uygulamanızın ne tür şeyleri başarması gerektiğine bağlı olacağını düşünüyorum ... Bunu belirtmeden, tüm siz "olağan şüphelilerden" oluşan bir koleksiyon elde etmek
Chris Stratton

1
@Chris Stratton: Haklısın. Ama aynı zamanda, "olağan şüpheliler" veya belirli bir numara hakkında küçük bir cevap, aradıkları "tahmin" ise (ve kendi özel durumları için yararlıysa) başkalarının karar vermesini kolaylaştıracaktır.
Wroclai

Bu sitede kaç tane gerçekten ilginç sorunun kapatıldığı çok saçma.
Patrick

Yanıtlar:


68

Bir noktada, bilinen hileleri kullanmanın sınırlarını aşacağı noktaya geleceksiniz. Bu noktada yapılacak en iyi şey, kodunuzun profilini çıkarmak ve özel gereksinimlerinize göre dar boğazların hangi alanlarda olduğunu görmektir.

MAT kullanarak RAM kullanımını araştırma ve Traceview kullanma : uygulamanızı profillemek için araçların nasıl kullanılacağına ilişkin bir makale.


Teşekkürler! Kaynakları olan cevapları gerçekten seviyorum. :-)
Wroclai

1
Bu blog yayınını okuyun. medium.com/@hammad_tariq/…
Geliştirin

37

Tahsisleri takip edin ve ezin. Ne kadar çok ayırırsanız, çöp toplayıcının o kadar sık ​​çalışması gerekecek ve işleminizin 100 ms gibi nispeten uzun süreler boyunca başka bir şey yapmasını durduracaktır.

Bunun için bildiğim en iyi araç, DDMS'de bulunan Allocation Tracker'dır .

Yalnızca GC kullanıcı deneyimi üzerinde bir etkiye sahip değildir, aynı zamanda gereksiz tahsisler ve GC bazı hesaplama kaynaklarını tüketir.

İşte bir örnek ve küçük bir numara. Uygulamamda, saniyenin onda biri dahil geçerli (ses) zamanı gösteren bir saatim var. Bu sık sık güncellenir. Ve TextView, setText () öğesini bir CharSequence ile her çağırdığınızda dahili olarak tahsisleri gerçekleştirir . Ancak setText (char [] text, int start, int len) varyantıyla hiçbir şey ayırmaz. Bu belgelenmedi ve bunu sorduğumda kimse cevap vermedi.

Bunun gibi çok sayıda var. Ve bu, uygulamamın% 50 yerel kod içermesinin nedenlerinden biridir (ancak başka nedenler de vardır).

Bunun dışında ProGuard ile denemenizi tavsiye edebilirim . Birkaç optimizasyon geçişi gerçekleştirir ve bu tür bilgileri proje içinde kullanılmayan yöntemler olarak günlüğe kaydeder, bu da kodunuzdaki artıkları kaldırmanıza yardımcı olabilir.


1
Mükemmel cevap! Somut numaralar takdir edilmektedir.
Wroclai

22

Uygulamanızda çok fazla ekran süresi olacaksa, mümkün olan her yerde siyah kullanın . Bu, cihazın en kötü kısmının pil tüketimini azaltacaktır: özellikle AMOLED telefonlarda ve tabletlerde ekran.


Koyu renklerin akıllıca kullanılması pil için bir kazanç demektir.
Robert Massaioli

7
Öte yandan, LCD ekranlarda siyah beyazdan daha fazla güç çeker, çünkü ışık (arka ışık kaynaklı) beyaz renkte başlar ve siyah üretmek için aktif olarak engellenmesi gerekir. [ Scientificamerican.com/article.cfm?id=fact-or-fiction-black-is ] Alt satır: Bu renk optimizasyonunda çok fazla saymayın.
Sparky

16

Birden çok etkinliği olan uygulamalar için, yalnızca uygun Amaç bayrakları kullanılarak öne getirilmesi gereken etkinlikleri yeniden başlatmadığınızı kontrol edin. Yığınınızın kontrol altında olup olmadığını ve gereksiz görünümlerin, bağlamaların ve bağlamların oluşturulmadığını kontrol edin.

Tüm bunları uygulama çalışırken size göstermek için en iyi aracı buluyorum:

adb shell dumpsys meminfo 'your apps package name'

1
Oh, bu yeniydi. Paylaşım için teşekkürler!
Wroclai

15

SQLlite kullanırken, dizinlere özel dikkat gösterin. Hiçbir şey varsaymayın. Arama için yaygın olarak kullanılan sütunlara dizin koyduğumda, Zwitscher'da muazzam hızlanmalar yaşadım.


13

Uygulamanızı kullanıcı arayüzü açısından optimize etmenize yardımcı olabilecek birkaç ipucu :

  • convertViewliste bağdaştırıcıları için kullanın - Adapter.getView()bu yordam listedeki her konum için çağrıldığından, içeride yeni bir görünüm oluşturursanız çok pahalı olur . Kullanmak convertView, önceden oluşturulmuş görünümü yeniden kullanmanıza izin verir. ApiDemos'ta (kullanımıyla birlikte) iyi bir örnek ViewHolderbulunabilir .

  • Düzenleriniz tam olarak optimize edilmemiş olabilir ve geliştirilebilir (örneğin üst öğeleri birleştirerek veya kaldırarak). Android aracı layoutopt sizin için böyle bir durum bulacaktır. Tek tek görünümleri incelemek için HierarchyViewer ile birlikte kullanılabilir. Daha fazla bilgi burada .

  • arka plan çekilebilirini kaldırın - Android çerçevesi eskiden hangi görünümlerin çizilmesi gerektiğini tespit etmede bir sorun yaşıyordu (hala var mı?) . (Varsayılan) arka plan çekilebilirinizin yalnızca opak kullanıcı arayüzünüz tarafından daha sonra gizlenecek şekilde çizilme şansı vardır. Bu savurgan çizimden kurtulmak için arka plan çekilebilir olanı kaldırmanız yeterlidir.

Özel bir stil kullanılarak yapılabilir

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

Uygulamanızı pil kullanımı açısından optimize etmenize yardımcı olabilecek birkaç ipucu :

  • ağ türünü kontrol edin ve kullanıcı alana wifi veya 3G ile (ve dolaşımda değil) girene kadar bekleyin ve yalnızca o zaman bağlantıyı kullanmasına izin verin

  • indirmeyi ve ayrıştırmayı hızlandırmak için mümkün olduğunda metin verileri için gzip kullanın

  • XmlPullParserFactory/ BitmapFactory/ StringBuilder/ Matchervb. gibi karmaşık java nesnelerini geri dönüştürmek

Daha fazla pil numarası için bkz . Yaşam İçin Kodlama - Pil Ömrü, Yani .


"karmaşık java nesnelerini geri dönüştürmek ..." Nasıl? Java ise GC
Yousha Aleayoub

9

Düşünülmesi gereken bir şey: String'i aşırı KULLANMAYIN, örneğin büyük bir döngüde. Bu, GC'lenmiş olması gereken birçok String nesnesi yaratacaktır. "Kötü kodlama" örneği, her döngüde 2 dizi nesnesi oluşturacaktır. Sonraki örnek yalnızca bir final String ve tek bir stringbuilder üretecektir. Bu, hız için büyük döngüleri optimize ederken büyük bir fark yaratır. Wordlist Pro Android uygulamamı oluştururken stringbuilder'ı çok kullandım ve çok kısa sürede 270000 kelimeyi geçerken gerçekten hızlı oldu.

    //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);
    }

Konu hakkında daha geniş bir blog yazısı yazdım. burayı oku


6

Sanırım mümkün olan her yerde "son" değişkenleri kullanmak da yürütme hızını artırabilir.


1
Bunu bir yerde okuduğumu hatırlıyorum, bir bağlantı verebilir misin?
Wesley Wiser

1
Bunun nihai değişkenler için doğru olduğundan o kadar emin değilim, ancak statik son değişkenler için olabilir - bkz. Stackoverflow.com/questions/3117770/…
Alistair Collins

Bağlantı sağlayamıyorum, ancak Reto Meier (19 Mayıs 2010) / Google IO tarafından hazırlanan "Android'e yeni başlayanlar kılavuzu" nda bununla ilgili bir bildirimle karşılaştım. Kısa, indirmesi ücretsiz ve iyi bir uygulamanın nasıl oluşturulacağı konusunda iyi tavsiyeler var.
Stan

2
Nihai değişkenler, kodu daha verimli hale getirebilir çünkü bu, tüm nesnelerin aynı çalıştırmada GC'leneceği anlamına gelir. Bunları null olarak ayarladığınız zamana bağlı olarak farklı zamanlarda değil.
Robert Massaioli

1
Soru: Derleyici bunu sizin için açıkça yapmıyor mu? Bunu kod analizi aşamasında yapması gerektiğini düşünüyorum.
Pawan

6

APK boyutundan biraz (kilo) bayt azaltmak için PNG resimlerinizi OptiPNG ve PNGCrush gibi araçlarla optimize edin . Web siteleri için görüntü optimizasyon ipuçları burada da geçerlidir: uygun resim formatlarını kullanın, JPG sıkıştırmasıyla oynatın, 8 bitlik saydamlar yerine ikili saydamlar kullanmayı düşünün vb.

Alfa kanallı büyük PNG'ler gönderiyorsanız, başlangıç ​​hızı için bazı APK boyutlarında ticaret yapabilir ve RGB ve A kanalları için ayrı JPG'ler kullanabilirsiniz .

HTTP bağlantıları yapıyorsanız, HTTP istemcinizin içerik sıkıştırması kullandığını kontrol edin. Alınan HTTP yanıtlarını önbelleğe alıyorsa, önbelleğe alma ile ilgili HTTP üstbilgilerini doğru anladığından ve kullandığından emin olun.


Anlayışınız için teşekkürler! Bunu hiç duymadım!
Wroclai

5

Ağ işlemleriniz varsa, aynı httpclient örneğini yeniden kullanmayı deneyin. Normal ifadeler kullanmaktan kaçının.


Nedeni? nedenini açıklayabilir misin?
Yousha Aleayoub

5

Sistemde çalışan tüm iş parçacıklarını izlemek için DDMS'yi kullanmayı deneyin. Örneğin, html içeriğini görüntülemek için webview kullandığımı fark ettim, bunun çerez yönetimi oturum yönetimi vb. İçin birkaç iş parçacığı oluşturduğunu fark ettim ve bu da bellek ayak izimi artırdı. Bu nedenle, karmaşık html'yi görüntülemek için ciddi bir ihtiyacınız yoksa, html içeriğini görüntülemek için android'de normal "Html" yardımcı programı sınıfını kullanmayı deneyin. Bu, eula typicall html metni içerdiğinden, Eula'yı görüntüleyen kişiler için yararlı olabilir.

Ağ işlemlerini yapmanız gerekiyorsa, yeni başlayan biriyseniz AndroidHttpClient kullanmayı deneyin, SSL oturumlarını Önbelleğe Alma için bazı iyi yeteneklere sahiptir ve tüm bunlar gerçekten performansınızı artırmaya yardımcı olur. Soket bağlantı zaman aşımlarınızı her zaman yaklaşık 60 saniye veya bazı sonlu değerlere ayarlayın, çünkü sonsuz zaman aşımları, özellikle ssl el sıkışması sırasında bağlantınızı keserseniz kilitlenmelere neden olabilir.



4

Metni etiketler arasında almak için dize işleme rutinlerini kullanarak XML girişinizi ayrıştırabiliyorsanız, XPath kullanmaktan kaçının. Bu durumda, HTC Desire üzerinde 50000 öğe veri setinde 10 kat iyileştirmeyi test ettim ve onaylayabilirim.


3

Bu sohbete biraz sonra katılacağımı biliyorum, ancak tek bir yerde çok sayıda iyi ipucu olması mükemmel olur, bu yüzden bu ileti dizisinin canlı ve sık sık güncellenmesini umuyorum. İpuçlarım:

  • Pahalı işlerle UI iş parçacığını engellemeyin, kullanıcı uygulamadan yanıt gelmezse ayrılacaktır (AsyncThreads kullanın).
  • Android proje kaynaklarını olası hatalara karşı tarayan yeni araç LINT'i kullanın .

..güncellenecek..

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.