Profiling (profil oluşturma), uygulama performansını temel metrikler (CPU yükü, bellek tüketimi, ağ trafiği ve enerji kullanımı) üzerinden ölçme sürecidir. Profil oluşturmanın amacı, uygulamayı yavaşlatan veya aşırı kaynak tüketimine neden olan darboğazları bulmaktır. Android Developers'a göre, geliştirme sırasında düzenli profil oluşturma, üretimdeki performans hatalarının sayısını %60'a kadar azaltır ve düşük seviyeli cihazlarda bile akıcı bir UI sağlanmasına yardımcı olur.
Önemli Noktalar
Profiling, bir uygulamanın nasıl çalıştığına dair verilerin toplanması ve analizidir: hangi işlevler yürütülür, ne kadar sürer, ne kadar bellek tüketir ve ağ ile nasıl etkileşime girer. Günlük kaydının (logging) aksine, profil oluşturma sistem düzeyinde çalışır ve öznel değerlendirmeler yerine kesin sayısal metrikler sağlar.
Profil oluşturmanın temel amacı, kaynakları optimal olmayan şekilde kullanan kod bölümlerini bulmaktır. Bunlar, UI iş parçacığında çağrılan yavaş yöntemler, bellek sızıntıları, verimsiz SQL sorguları, aşırı ağ çağrıları veya aşırı enerji tüketimi olabilir. Profil oluşturma olmadan, geliştiriciler gerçek verilere güvenmek yerine “yavaş hissettiren” şeyleri düzeltir.
Google I/O 2023'e göre, geliştirme sırasında düzenli profil oluşturmaya tabi tutulan uygulamalar %40 daha az ANR (Uygulama Yanıt Vermiyor) hatası ve %50 daha az OutOfMemory çökmesi gösterir. Profil oluşturma araçları tüm modern IDE'lere entegre edilmiştir — Android için Android Studio Profiler ve iOS için Xcode Instruments.
Profil oluşturma statik (yürütme olmadan kod analizi — lint, Detekt) ve dinamik (uygulama çalışma zamanı sırasında ölçüm) olabilir. Gerçek performans sorunlarını bulmak için, bir cihaz veya emülatörde uygulamanın gerçek davranışını gösteren dinamik profil oluşturma kullanılır.
Her büyük sürümden önce, ağır UI bileşenleri (listeler, animasyonlar, özel Görünümler) tanıtılırken, kullanıcılar yavaşlık ve pil tüketiminden şikayet ettiğinde ve uygulama mimarisi değiştirildikten sonra profil oluşturma gereklidir. Sistematik bir yaklaşım, her sprintte profil oluşturma yapmak ve metriklerin bir temel çizgisini kaydetmektir.
CPU profilleme, hangi yöntemlerin ve iş parçacıklarının işlemciyi yüklediğini ve her çağrının yürütülmesinin ne kadar sürdüğünü izler. Temel amaç, beklenenden daha uzun süre çalışan ve UI iş parçacığını bloke ederek kare düşüşlerine (jank) ve ANR'lere neden olan işlevleri bulmaktır.
Android'de, CPU Profiler bir Yukarıdan Aşağıya ağaç (Top-Down tree) gösterir — belirli bir iş parçacığı bağlamında hangi yöntemin en uzun süre çalıştığını görebileceğiniz bir çağrı ağacı. iOS'ta, Instruments Time Profiler örnekleme temelinde çalışır: düzenli aralıklarla (örneğin, 1 ms), sistem her iş parçacığının çağrı yığınını kaydeder. Örnek istatistikleri, hangi kodun en fazla zamanı tükettiğini belirler.
// Örnek: jank'a neden olan yavaş bir yöntem
class UserAdapter : RecyclerView.Adapter<UserViewHolder>() {
override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
// ❌ Bu yöntem UI iş parçacığında çağrılır ve işlemeyi engeller
// Profilleme, decompressImage'ın zamanın %80'ini aldığını gösterecektir
val user = getItem(position)
val bitmap = ImageUtils.decompressImage(user.avatar)
holder.avatarView.setImageBitmap(bitmap)
}
}
CPU profilleme yaparken, Self Time değeri yüksek yöntemlere dikkat edin — bu, bir yöntemin alt yöntem çağrılarını saymadan kendi işi için harcadığı süredir. UI iş parçacığındaki bir yöntemin Self Time değeri 16 ms'yi aşarsa, 60 FPS ekranda bir kare düşüşü garanti edilir. Çözüm, ağır işlemleri bir arka plan iş parçacığına taşımaktır.
Bellek profilleme, bir uygulamanın ne kadar bellek kullandığını izler: hangi nesneler oluşturulur, ne kadar yaşar ve ne zaman serbest bırakılır. Temel amaç, sızıntıları (var olmaması gereken ancak bellekte kalan nesneler) ve aşırı tahsisatları (çok sık oluşturulan nesneler) bulmaktır.
Android'de, Memory Profiler gerçek zamanlı RAM tüketim grafiği, tahsis edilmiş tüm nesnelerin listesi ve her tür için ayrıntılar gösterir. Temel metrikler: Java Heap (JVM yığınındaki nesneler), Native Heap (C/C++ düzeyinde tahsisatlar), Graphics Memory (dokular ve GPU tamponları). iOS için, Instruments Allocations benzer metrikler gösterir: Heap Allocations (yığındaki nesneler) ve Anonymous VM (sanal bellek sayfaları).
| Metrik | Android Profiler | Instruments (iOS) |
|---|---|---|
| Yığın nesneleri | Java Heap + Native Heap | Heap Allocations |
| Grafik | Graphics Memory | VM Tracker |
| Sızıntılar | Memory Profiler + LeakCanary | Leaks instrument |
| Yığın dökümü | HPROF (Capture) | Heapshot |
Bellek profilleme yaparken, tipik kullanıcı senaryolarını (ekran açma ve kapama, liste yükleme, görsellerle çalışma) çalıştırdıktan sonra yığın dökümü almak önemlidir. İki dökümün (bir senaryodan önce ve sonra) karşılaştırılması, hangi nesnelerin serbest bırakılmadığını gösterecektir. Activity nesnelerinin sayısı arttıysa ancak ekran kapatıldıysa, bu bir sızıntıdır.
Android Studio'da, dökümü Memory Profiler üzerinden açın: nesneleri Retained Size'a (ne kadar büyükse, nesne o kadar fazla bellek tutar) göre sıralayın. Bellekte bulunmaması gereken Activity, Fragment ve Bitmap örneklerini arayın. Böyle bir nesne varsa, onu neyin tuttuğunu görmek için Reference Tree'ye gidin.
Ağ profilleme, uygulamadaki tüm HTTP isteklerini (URL, yanıt boyutu, yürütme süresi, yanıt kodları ve başlıklar) izler. Temel amaç, çok uzun süren, aşırı veri aktaran veya gereksiz yere yapılan istekleri bulmaktır.
Android'de, Network Profiler tüm ağ çağrılarının bir zaman çizelgesini, sürelerini ve aktarılan veri miktarını gösterir. Her istek, tam başlıkları ve yanıt gövdesini görüntülemek için açılabilir. iOS'ta, Instruments Network benzer görevler için URL Yükleme Sistemi izlemeyi kullanır ve isteklerin bir şelale diyagramını gösterir.
Ağ profilleme tarafından belirlenen tipik sorunlar: önbellekleme eksikliği (bir ekran her açıldığında aynı JSON yüklenir), yinelenen istekler (birden çok bileşen aynı anda aynı verileri ister), büyük yanıtlar (sunucu 100 KB gerekirken 5 MB JSON gönderir). Her sorun için standart bir çözüm vardır: OkHttp veya URLSession üzerinden önbellekleme yapılandırma, Combine veya Flow üzerinden abonelikleri birleştirme, sunucu tarafı sayfalama ekleme.
İlk bayta kadar geçen süreye (TTFB) özellikle dikkat edin. İyi bir bağlantıda TTFB 500 ms'yi aşarsa, sorun sunucu tarafındadır. İsteğin kendisi hızlıysa ancak JSON ayrıştırması saniyeler sürüyorsa, sorun serileştirme çözmededir ve ayrıca profillenmelidir.
Enerji profilleme, bir uygulamanın pil ömrünü nasıl etkilediğini ölçer. Bu nispeten yeni bir profilleme türüdür ancak mobil uygulamalar için kritik derecede önemlidir — kullanıcılar pili aşırı tüketen uygulamaları siler. Android Studio'daki Energy Profiler ve Instruments'taki Energy Log, her anda hangi işlemlerin (Wi-Fi, GPS, CPU, Bluetooth) enerji tükettiğini gösterir.
Mobil uygulamalardaki başlıca enerji tüketicileri: WakeLock (işlemciyi aktif tutma), GPS Konumu (sürekli konum güncellemeleri), ağ istekleri (özellikle 4G/5G ağlarında), arka plan animasyonları. Energy Profiler, uygulama olaylarını bir enerji tüketim ölçeğine bindirir — grafikte bir ani yükselme varsa, hangi işlemin buna neden olduğunu tam olarak belirleyebilirsiniz.
Apple WWDC 2023'e göre, bir uygulamanın enerji tüketimini %20 azaltmak, kullanıcı tutma oranını %12 artırır, çünkü kullanıcılar pili çok tüketen uygulamaları silme eğilimindedir. Öneri, GPS, arka plan senkronizasyonu ve akış içeren senaryoları test ederken Energy Profiler'ı her zaman etkinleştirmektir.
Araç seçimi, platforma ve profilleme türüne bağlıdır. Android için ana set Android Studio Profiler (CPU, Bellek, Ağ, Enerji), LeakCanary (bellek sızıntıları) ve Perfetto'dur (sistem düzeyinde profilleme). iOS için — Xcode Instruments şablonlarla: Time Profiler, Allocations, Leaks, Energy Log, Network ve Core Animation.
Flutter ile platformlar arası geliştirme için, Timeline (CPU), Memory, Network ve Debugger modülleriyle DevTools'u kullanın. React Native için — React DevTools ve Facebook'un Flipper'ı (ağ, veritabanı ve UI hiyerarşisi incelemesini destekler). Framework'ten bağımsız olarak, profillemenin temel ilkeleri evrenseldir: optimizasyondan önce ve sonra ölçün, temel çizgiyi kaydedin, her kod değişikliğinde metrikleri karşılaştırın.
Modern yaklaşımlar CI'da otomatik profillemeyi içerir. Android'de, Firebase Test Lab, UI testleriyle birlikte performans ölçümlerini destekler: yalnızca geçme/kalma sonuçları değil, her yineleme için CPU, Bellek ve Ağ grafikleri de alırsınız. iOS için benzer işlevsellik, XCUITest ve Instruments CLI ile GitHub Actions tarafından sağlanır.
Tek bir metriğin hızlı kontrolü için IDE'nin yerleşik profilleyicisini kullanın. Kapsamlı sızıntı analizi için — özel araçlar (LeakCanary, Instruments Leaks). Sistem düzeyinde sürücü profilleme için — Perfetto (Android) veya DTrace (macOS). İki veya üç aracın birleşimi, profilleme senaryolarının %95'ini kapsar.
Sıkça Sorulan Sorular
Günlük kaydı (logging) olayların sırasını metin biçiminde gösterirken, profilleme nicel metrikler — her kod parçasının ne kadar zaman, bellek, CPU ve ağ tükettiğini sağlar. Profilleme “ne kadar” sorusuna yanıt verirken, günlük kaydı “ne oldu” sorusuna yanıt verir.
Her büyük sürümden önce, yeni ağır UI bileşenleri tanıtılırken ve performans şikayetleri ortaya çıktığında profilleme yapılması önerilir. İdeal olarak, profilleme CI'ya entegre edilmiştir ve her pull request ile otomatik olarak çalışır.
Evet, ve bu bir emülatör kullanmaktan daha da tercih edilir. Gerçek bir cihaz, belirli donanımın sınırlamalarını dikkate alarak gerçek performansı gösterir. Android Studio Profiler ve Xcode Instruments, bağlı bir cihazda herhangi bir kısıtlama olmadan profillemeyi destekler.
Evet, herhangi bir profilleyici ek yük ekler. Örnekleme tabanlı CPU profilleme için ek yük %1–5'tir. Yığın dökümleriyle bellek profilleme için, döküm anında %10'a kadar çıkar. Modern araçlar etkiyi en aza indirmeye çalışır, ancak sonuçları yorumlarken her zaman dikkate alınmalıdır.
Temel çizgi (baseline), uygulamanın ilk kararlı sürümünde alınan referans performans metrikleri kümesidir. Her kod değişikliğinde, yeni metrikleri temel çizgiyle karşılaştırın. Temel çizgiye göre başlatma süresi 50 ms arttıysa, değişiklikleri birleştirmeden önce nedeni araştırın.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun