Android

Android’de Performans Problemlerini Keşfetme ve Çözme

Uygulama geliştiricileri,uygulamayı güzel bir kullanıcı arayüzü ile süslerken veya uygulamaları için yeni ve heyecan verici özellikleri eklemekle meşgul olduklarında, çoğu zaman performanslı bir uygulama oluşturmayı atlamaktadırlar.Bu makalede, her Android uygulama geliştiricisinin, ka&cced...

Tuğba Üstündağ |

14.03.2016

Uygulama geliştiricileri, uygulamayı güzel bir kullanıcı arayüzü ile süslerken veya uygulamaları için yeni ve heyecan verici özellikleri eklemekle meşgul olduklarında, çoğu zaman performanslı bir uygulama oluşturmayı atlamaktadırlar. Bu makalede, her Android uygulama geliştiricisinin, kaçınması gereken genel performans problemlerinden bahsedeceğim. Bu sorunların, kendi projelerinizde meydana gelip gelmediğini Android SDK tarafından sağlanan araçları kullanarak test etmeyi öğreneceksiniz. Uygulamanızın performansını  daha mükemmel yapabileceğinizi öğrenecek ve bu sayede uygulamayı oluşturduğunuzda kullanıcılar uygulamanızı daha çok sevecek ve indirecektir. 

 

Overdraw

  • Problemin Tespiti

Uygulamanızın kullanıcı arayüzünü hazırlarken, kullanıcıyla ilişkili ve göze hitap edecek bir görsellik oluşturmak sadece işin yarısıdır. Diğer yarısı ise kullanıcı arayüzünün, hızlı ve sorunsuz çalışmasını sağlamaktır.

Overdraw, kullanıcı arayüzünün tepki süresinin geç kalmasına sebeb olan, yani  görüntünün pikseller üzerine birden fazla yazıldığı durumlarda kullanılan bir terimdir. Pikselleri yeniden renklendirmek GPU'nun ekstra güç kaybetmesine, bunun sonucunda da uygulamanın Overdraw olan kısmının geç işlenmesine (rendering) neden olur.

Örneğin, linear için arka planı renklendirip, sonrasında onu kapsayan bir layout’a da renk verirseniz, aynı yeri 2 kez renklendirmiş olursunuz. Yani renklendirdiğiniz alanın arkasını da renklendirmiş olursunuz. Kullanıcı görsel anlamda bu farkı göremez, kullanıcının hiç fark edemeyeceği bir değişikliği arka planda işlenir hale getirmiş olursunuz. Bu işlem gereksiz olduğu için GPU işlemede zaman kaybettirir. Bu da performans kaybına yol açar.

Bu nedenlerden dolayı, uygulamanızın performansını test ederken, Overdraw olup olmadığını kontrol etmek ilk yapmanız gereken işlemlerden biridir.

Overdraw'ı Tespit Etme

Çok şanslısınız ki, Android cihazlarda Overdraw'ı tespit etmek için yeni bir uygulama yüklemeniz gerekmemektedir. Çünkü Android cihazınızın kendi ayarlarında Overdraw miktarını tespit etmeyi sağlayan bir özellik bulunmaktadır.

İlk yapmanız gereken işlem, test etmek istediğiniz uygulamayı Android cihazınıza yüklemektir. Daha sonra cihazda, Ayarlar (Settings) menüsünden Geliştirici Seçeneklerini (Developer Options) seçin. Ekranda aşağıya doğru indiğinizde Çizim (Draw) bölümünde bulunan Düzen sınırlarını göster (Debug GPU Overdraw)  butonunu göreceksiniz. Bu seçeneği aktif hale getirin.

 

 

Bu araç, arayüzde Overdraw'ın farklı yerlerde kullanıldığını vurgulamak için renk blokları kullanır. Artık yapmanız gereken tek şey, Overdraw’ı tespit etmek istediğiniz uygulamanızı çalıştırmaktır.

Peki, bu renklerden nasıl Overdraw'ı tespit edeceğiz?

Şöyle ki, her rengin bir anlamı bulunmaktadır. Bu anlamları öğrendiğimizde işimiz tam anlamıyla kolaylaşacaktır.

 

Arayüzde gördüğünüz renklerin anlamları:

Rengin olmadığı alanlar: Arayüzde Overdraw yok anlamına gelir. Yani bu pikselin bir kez boyalı olduğunu anlarız.

Mavi alanlar: 1x Overdraw bulunmaktadır. Mavi alandaki piksellerin 2 kez boyandığını anlarız.

Yeşil alanlar: 2x Overdraw bulunmaktadır. Yeşil alandaki piksellerin 3 kez boyandığını anlarız.

Pembe alanlar: 3x Overdraw bulunmaktadır. Uygulamanıza bağlı olarak, pembe küçük alanlarda Overdraw genellikle olabilir. Ancak kırmızı alanı, orta veya büyük  boyutta olan alanlar görürseniz o zaman çok fazla Overdraw var anlamına gelir. Bunun da sebebini araştırmak gerekir.

Kırmızı alanlar: 4x Overdraw bulunmaktadır. Kırmızı alandaki piksellerin 5 kez veya daha fazla boyandığını anlarız. Kırmızı alan gördüğünüzde, kesinlikle bu alanda neden Overdraw olduğunu incelemeniz gerekir.

 

Overdraw'ları Azaltma

Bir önceki adımımızda Overdraw'ları tespit ettik. Bu adım da ise Overdraw'ları nasıl en aza indirgeyeceğimizden bahsedeceğim.

Overdraw durumu fark edildiğinde, öncelikle uygulamanın XML dosyası açılıp çakışan alanları aranmalıdır. Kısmi çizilebilen nesneler kullanıcıya gözükmediği için herhangi bir arka plan bir başka nesnenin üzerine gelebilir. Bu nedenle ebeveyn nesne beyaz olarak boyansa bile, arka planı beyaz olarak ayarlanmış alanlara bakmalısınız. Bu gibi şeyler üst üste çizim hatalarına neden olabilir.

 Android sistemi otomatik olarak, basit Overdraw durumlarını azaltır, fakat karmaşık görüntü nesnelerinde pek bir anlam ifade etmez çünkü Android içeriğin nasıl çizileceğini bilemez.

Eğer karmaşık ve sonradan üretilen bir görüntü nesnesi kullanacaksanız, çizilen alanın sınırlarını clipRect metoduyla belirlemelisiniz. Daha fazla bilgi için resmi Android dokümanlarını ziyaret etmenizi tavsiye ederim.

 

Bellek Sızıntısı

  • Problemin Tespiti

Android bellek yönetimli bir ortamdır, bu sizde yanlış bir güvenlik hissi yaratmasın çünkü bellek açıkları hala oluşabilir.Çöp toplayıcı (garbage collector) nesneleri, sadece ulaşılamadığı durumlarda silmektedir. Eğer ulaşılamayan bir nesneye işaret etmiyorsa yani bir şekilde nesne referansı bellekte bulunuyorsa, bu nesne silinmeyecektir.

Bu ulaşılamayan nesneler başıboş durmakta, kirlilik oluşturmakta ve değerli boş alanda yer tutmaktadır. Uygulamanızın boş alanı gitgide küçülecek, ne zaman ki çöp toplayıcı olayları yönetemeyeceği noktaya gelinceye kadar çalışacaktır.

Bu kötü haberin iki nedeni vardır. Birincisi çöp toplayıcı çalışma esnasında uygulamanızda gözle görülür bir performans etki yaratmaz ve birçok çöp toplayıcı olayı az bir zaman içinde ve ufak bir gecikmeyle çalışmaktadır. İkinci problem ise mobil cihazlar başlangıçta az bir bellekle başlamaya meyillidir ve bir bellek sızıntısı hızlıca OutOfMemory hatasına sebep olup uygulamanızı durdurur.

Bellek sızıntıları tespit etmek zor olabilir. Yalnızca kullanıcılar şikâyete başladığında, bellek sızıntısının uygulamanız için bir sorun olduğunu fark edebilirsiniz. Şükürler olsun ki Android SDK ‘da bu anlamda bize fayda sağlayacak kullanışlı bazı araçlar bulunmaktadır.

 

Çözüm

Android uygulamanızda artan bellek kullanımı takip edebilmeniz için büyük  ölçüde yardımı olan araçlar bulunmaktadır. Grafiksel olarak gösterim için, Android Memory Monitör kullanılmaktadır. Sonuçta sorunu tespit edip incelemeniz gerekir. İşte tam da  bu konuyla alakalı, yani Android uygulamalarda potansiyel bellek sızıntılarını bulabilmek ve önlemek noktasında yardımcı olabilecek ayrıntılı bir makaleyi daha önce sizlere hazırladım. Dilerseniz, "Android’ de Bellek Sızıntısını Önleme"  adlı makalemi okuyarak bu konuda daha ayrıntılı bilgi edinebilirsiniz.

 

Kaynaklar:

1- http://tugbaustundag.com/androidde-bellek-sizintisini-onleme

2- http://code.tutsplus.com/tutorials/detect-and-resolve-performance-problems-on-android--cms-24058

3- http://riggaroo.co.za/fixing-memory-leaks-in-android-outofmemoryerror/?utm_term=0_4eb677ad19-ef86743f54-337838825&utm_content=buffer7b25e&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer

Tuğba Üstündağ |

14.03.2016

Yorumlar

Baran
12.07.2016 - 08:43

Ellerine sağlık

mckare
21.03.2016 - 03:02

Elinize sağlık ,bu konuda Türkçe kaynak bulmak çok zor.