Mobil Mühendislik
Büyüyen Android Uygulamalarında Kod Tabanı Evrimi: Mimari Yapılanma, Compose Pratikleri ve Kalite Metrikleri
Büyüyen Android Uygulamalarında Kod Tabanı Evrimi: Mimari Yapılanma, Compose Pratikleri ve Kalite Metrikleri
Büyüyen bir Android kod tabanı, mimari kuralları otomatik denetlenen modüllerle, ölçülen Compose performansıyla ve Play eşiklerine bağlı kalite metrikleriyle sağlıklı kalır; Agent'lar kod yazdıkça bu kuralların CI'da yaşaması zorunlu hâle geliyor.
Büyüyen Android kod tabanı, kurallar wiki'de değil CI'da yaşadığında sağlıklı kalır: denetlenen modül sınırları, ölçülen Compose performansı, Play eşiklerine bağlı kalite.
Google'ın mimari önerileri ve Now in Android bu yapıyı tarif ediyor; Agent çağında mimarinin guardrail'den güçlü olduğu fikri ise yeni yükseliyor.
Zihinsel model
Mimari yolun kendisidir, talimat dosyası tabeladır: tabelayı okumayan da yoldan çıkamıyorsa kural kalıcıdır.
Neden
- Feature bazlı api/impl modülleri değişikliği tek modüle hapseder; derleme süresini ve istenmeyen erişimi birlikte keser.
- Wiki'deki kural ilk yoğun sprintte delinir; Agent'lar çalışan ama katman sınırını ihlal eden kodu daha hızlı üretir.
- Play çökme, ANR ve wake lock eşiklerini mağaza görünürlüğüne bağladığı için kalite görüş değil ölçülebilir hedef olur.
Kanıt
Instagram Direct'te Compose-first mimariye geçen ekranlarda UI kodu yüzde 50 küçüldü.
Android Developers Blog, 2026Kullanıcının fark ettiği çökme oranı yüzde 1,09 eşiğini aşan uygulamaların mağaza görünürlüğü etkilenebiliyor.
Android Developers, Android vitals, 2026Google'ın mimari önerileri, Composable ve ViewModel'in veri kaynağıyla doğrudan konuşmamasını ve ViewModel'e Context verilmemesini istiyor.
Android Developers, 2026Karşı görüş
Küçük ekipte erken modülerleştirme ve mimari testler kazandırdığından fazla bakım yükü getirir; feature modüllerine derleme süresi ya da ekip çakışması gerçek soruna dönüşünce geçilmeli.
Kavramlar
Pratikte
- Katman ve modül bağımlılık kurallarını Konsist ya da lint ile CI'da test olarak yaz.
- Modülleri teknik katmana göre değil feature'a göre böl, ortak Gradle ayarını convention plugin'e taşı.
- Soğuk açılış ve kaydırmayı Macrobenchmark ile CI'da ölç, bütçeyi aşan PR'ı otomatik işaretle.
Ekip ve özellik sayısı arttıkça bir Android uygulaması yavaşlar, kırılganlaşır ve derleme süresi şişer. Bunu önleyen üç eksen birlikte çalışmak zorunda: mimari yapılanma, Jetpack Compose pratikleri ve kalite metrikleri. Ekim 2026 itibarıyla zemin netleşti: Google'ın mimari önerileri tek activity ve Navigation 3'ü açıkça tavsiye ediyor, Navigation 3 Eylül 2026'da 1.2 sürümüne ulaştı, Compose 1.12 ve Kotlin 2.4 güncel, AGP 9 ile yerleşik Kotlin ve yeni DSL varsayılan oldu. Google Play çökme ve ANR eşiklerine ek olarak aşırı partial wake lock'u da mağaza görünürlüğüne bağladı ve Şubat 2027'den itibaren bellek kullanımı ile kod optimizasyonu eşiklerinin de görünürlüğü etkileyebileceğini duyurdu. Android Studio artık Claude, Codex ve Antigravity gibi Agent'ları ACP üzerinden çalıştırabiliyor; kod üretim hızı arttıkça kuralların insan gözüyle değil araçlarla korunması kritik hâle geliyor.
Çıkarımlar
- UI ve data katmanı zorunlu, domain katmanı ancak paylaşılan ya da karmaşık iş kuralı varsa gerekli; Composable doğrudan veri kaynağına dokunmamalı.
- Modülleri teknik katmana göre değil feature'a göre böl; convention plugin'lerini AGP 9 DSL'ine ve yeni Variant API'ye şimdiden taşı.
- Strong skipping varsayılan olsa da her recomposition'da yeni koleksiyon üretmek atlamayı bozar; recomposition sayaçlarıyla ölç.
- Play eşiklerini kalite hedefi yap: çökme %1,09, ANR %0,47, aşırı wake lock %5; Şubat 2027'de bellek eşikleri de geliyor.
- Mimari kuralları wiki'de değil, CI'da çalışan lint ve mimari testlerde yaşat; Agent'ın ürettiği kod da aynı kapıdan geçsin.
Alt başlıklar
Katmanlı mimari: UI, domain ve data sınırları
Google'ın resmî uygulama mimarisi rehberi iki zorunlu katman tarif ediyor: UI katmanı ve data katmanı; domain katmanı ise isteğe bağlı. UI katmanında ViewModel ekran durumunu tek bir değişmez UiState nesnesi olarak sunar, Composable yalnızca bu durumu çizer ve kullanıcı olaylarını yukarı iletir. Buna tek yönlü veri akışı (UDF) denir. Data katmanında repository'ler veri kaynaklarını saklar ve dışarıya Flow ya da suspend fonksiyonlar açar.
Büyüyen projelerde sorun, bu sınırların zamanla delinmesidir. Tipik belirti: bir Composable içinde doğrudan Retrofit servisi ya da Room DAO çağrılması, veya ViewModel'in Android Context taşıması. Google'ın güncel önerileri bunu açıkça söylüyor: Composable ya da ViewModel veri kaynağıyla doğrudan konuşmamalı, ViewModel'e Context ya da Application verilmemeli, durum tek bir StateFlow olarak sunulmalı. Domain katmanını her projeye zorla eklemek de ayrı bir anti-pattern; yalnızca birden fazla ViewModel'in paylaştığı ya da karmaşık iş kuralları varsa use case sınıfları anlam kazanır.
Somut bir eşik: bir ViewModel 400 satırı ya da 8-10 bağımlılığı aşıyorsa, genelde iki ekranın sorumluluğunu taşıyordur ve bölünmeyi hak eder.
Ekim 2026 itibarıyla durum
Son 12 ayda Android araç zinciri büyük bir sürüm atladı. Navigation 3, Kasım 2025'te 1.0 ile stabil oldu, Nisan 2026'da 1.1 ile scene'ler arası shared element geçişlerini, 23 Eylül 2026'da 1.2 ile Result API'yi ve KMP deep link desteğini getirdi. Compose kütüphaneleri 7 Ekim 2026 itibarıyla 1.12.1, Material 3 ise 1.4.0 sürümünde. Kotlin 2.4.0 Haziran 2026'da çıktı, en güncel sürüm 8 Ekim'de yayımlanan 2.4.21. AGP 9 ile yerleşik Kotlin desteği ve yeni DSL varsayılan oldu, eski varyant API'si gizlendi; Eylül 2026'da çıkan AGP 9.4, AGP 10'da yeni Variant API'nin zorunlu olacağını hatırlatıyor. Google Play tarafında çökme için yüzde 1,09 ve ANR için yüzde 0,47 eşikleri sürüyor; aşırı partial wake lock için yüzde 5'lik session eşiği de görünürlüğü etkileyebiliyor. Şubat 2027'den itibaren bellek ve kod optimizasyonu eşikleri de bu listeye girecek. Agent tarafında Android Studio, Eylül 2026'da ACP üzerinden Claude Agent, Codex ve Antigravity'yi bağlayan Bring Your Own Agent önizlemesini açtı; Android CLI ise Ekim'de 20'den fazla resmî SKILL.md skill'i ve uzak cihaz akışı ekledi.
Modülerleştirme: feature, core ve api/impl ayrımı
Tek bir app modülünde 200 bin satır kod olduğunda iki şey olur: her değişiklik tüm modülü yeniden derletir ve herkes her şeye erişebilir. Modülerleştirme her iki sorunu birlikte çözer. Google'ın Now in Android örnek projesi yaygın bir şablon sunuyor: feature modülleri (ör. feature:profile), paylaşılan core modülleri (core:data, core:designsystem, core:network) ve bunları birleştiren app modülü.
Büyük ekiplerde bir adım daha atılıyor: her feature için api ve impl modülleri. Diğer feature'lar yalnızca api modülüne bağımlı olur, böylece impl içindeki değişiklik yalnızca o modülü yeniden derletir. Ortak Gradle yapılandırmasını tekrar tekrar yazmak yerine build-logic altında convention plugin'ler kullanılır; 40 modüllü bir projede bu, yüzlerce satır kopya build dosyasını ortadan kaldırır. AGP 9 ile bu altyapının bakımı da değişti: yerleşik Kotlin varsayılan, eski android DSL sınıfları gizlendi ve AGP 10'da yeni Variant API zorunlu olacak. Convention plugin'leriniz hâlâ eski applicationVariants API'sine dayanıyorsa, AGP yükseltmesinin asıl maliyeti orada çıkar.
Anti-pattern: modülleri teknik katmana göre bölmek (tüm ViewModel'ler bir modülde, tüm repository'ler başka birinde). Bu yapı derleme izolasyonu sağlamaz ve her feature değişikliği birden fazla modüle dokunur.
Compose'da kararlılık ve gereksiz recomposition
Compose performans sorunlarının çoğu, değişmeyen verinin ekranı yeniden oluşturmasından (recomposition) kaynaklanır. Compose, parametreleri değişmeyen Composable'ları atlayabilir; bunun için parametrelerin kararlı (stable) olduğunu bilmesi gerekir. Kotlin 2.0.20 ile varsayılan gelen strong skipping modu burada büyük fark yarattı: artık kararsız parametreli Composable'lar da atlanabiliyor, kararsız parametreler referans eşitliğiyle karşılaştırılıyor ve Composable içindeki lambda'lar otomatik olarak remember ile hatırlanıyor.
Yine de tuzaklar bitmedi. Her recomposition'da yeni bir List oluşturup aşağı geçirmek, referans eşitliğini bozduğu için atlamayı engeller. Çözüm, durumu ViewModel'de bir kez üretip aynı örneği korumak ya da kotlinx.collections.immutable koleksiyonlarını kullanmaktır. Hızlı değişen değerleri (kaydırma konumu gibi) mümkün olan en geç aşamada, ör. Modifier.offset'in lambda sürümünde okumak, recomposition'ı layout ya da çizim aşamasına iter.
Teşhis için Layout Inspector'daki recomposition sayaçları ve Compose compiler'ın ürettiği stabilite raporları birlikte kullanılmalı.
Navigation 3 ve adaptif arayüzler
Navigation 3, Kasım 2025'te 1.0 sürümüyle stabil oldu ve Compose için sıfırdan tasarlandı. Nisan 2026'da 1.1 scene'ler arası shared element geçişlerini, Eylül 2026'da 1.2 Result API'sini, KMP deep link desteğini ve öngörülü geri hareketi için yardımcıları ekledi. Google'ın mimari önerileri de artık tek activity ve Navigation 3'ü açıkça tavsiye ediyor. En büyük fark, geri yığının (back stack) artık kütüphanenin değil sizin elinizde olması: ekranları temsil eden anahtarlardan oluşan bir listeyi kendiniz tutuyorsunuz, NavDisplay bu listeyi gözlemleyip ilgili ekranı çiziyor. Navigation 2'deki NavController'ın iç durumu yüzünden zorlaşan “tek doğruluk kaynağı” sorunu böylece ortadan kalkıyor.
Büyüyen uygulamalar için iki kazanç öne çıkıyor. Birincisi test edilebilirlik: geri yığın düz bir Kotlin listesi olduğu için navigasyon mantığını birim testlerle doğrulamak kolaylaşıyor. İkincisi Scenes API: tablet ve katlanabilir cihazlarda liste-detay gibi çok bölmeli düzenleri aynı navigasyon yapısıyla kurabiliyorsunuz.
Geçiş için gerçekçi bir yaklaşım, her şeyi bir anda taşımak yerine yeni feature modüllerini Navigation 3 ile yazmak ve eski grafiği kademeli küçültmek. Anti-pattern: tür güvenli anahtarlar yerine string rotalarla devam edip argümanları elle ayrıştırmak.
Kalite metrikleri: Play eşikleri, başlangıç süresi ve kare kaybı
Kalite tartışmasını görüşe değil sayıya bağlamanın en kolay yolu, Google Play'in kendi eşikleri. Android vitals'ta kullanıcının fark ettiği çökme oranı için genel kötü davranış eşiği yüzde 1,09, ANR oranı için yüzde 0,47; tek bir telefon modelinde ise her ikisi için yüzde 8. Play bu değerleri son 28 günün ortalamasıyla değerlendiriyor ve eşiği aşan uygulamaların mağaza görünürlüğü etkilenebiliyor. Listeye pil de girdi: arka planda 24 saatte toplam 2 saati aşan partial wake lock “aşırı” sayılıyor ve bu durum session'ların yüzde 5'inden fazlasında görülürse görünürlük etkilenebiliyor. Google ayrıca Şubat 2027'den itibaren bellek kullanımı, bitmap belleği ve kod optimizasyonu eşiklerinin de görünürlüğe yansıyabileceğini duyurdu.
Bu metriklerin yanına iki performans metriği eklemek gerekir: soğuk başlangıç süresi ve yavaş ya da donmuş kare oranı. Macrobenchmark ile CI'da başlangıç ve kaydırma testleri koşup sonuçları her sürümde karşılaştırmak, regresyonu kullanıcıdan önce yakalar. Baseline Profiles, uygulamanın kritik yollarını önceden derleyerek ilk açılışta yorumlanan kod miktarını azaltır; Google ilk açılıştan itibaren yaklaşık yüzde 30 kod çalıştırma hızlanması raporluyor, Startup Profiles ise başlangıca yaklaşık yüzde 15 daha ekleyebiliyor.
Pratik öneri: her metrik için bir bütçe belirleyin, ör. orta segment test cihazında soğuk açılış 1,5 saniyenin altında, ve bütçeyi aşan PR'ı otomatik işaretleyin.
Kuralları otomatik koru: lint, mimari testler ve build sağlığı
Mimari kurallar bir wiki sayfasında yaşadığı sürece, büyüyen ekipte ilk yoğun sprintte delinir. AI kod asistanları üretim hızını artırdıkça bu daha da belirgin hâle geliyor: model, çalışan ama katman sınırını ihlal eden kodu kolayca üretebiliyor. Bu yüzden kuralların CI'da çalışan kontrollere dönüşmesi gerekir. Meta'nın Instagram Direct ekibinin Eylül 2026'da Google ile paylaştığı vaka bunu sayıya döküyor: sınırları mimarinin kendisine gömen, durumu yalnızca UiState ile alan Compose-first yapıya geçilen ekranlarda UI kodu yüzde 50 küçüldü, tipik bir Agent session'ınun token maliyeti yüzde 33 düştü. Ekibin vardığı sonuç, skill ve guardrail'lerin token harcadığı ve atlatılabildiği, doğru yolu kolay kılan mimarinin ise kalıcı olduğu.
Üç katmanlı bir koruma işe yarıyor. Birincisi statik analiz: detekt ve Android Lint, Compose'a özgü kural setleriyle birlikte. İkincisi mimari testler: Konsist gibi araçlarla “feature modülleri birbirinin impl modülüne bağımlı olamaz” ya da “ViewModel sınıfları Context almaz” gibi kuralları birim test olarak yazmak. Üçüncüsü modül bağımlılık grafiğinin kendisini denetlemek; döngüsel ya da yasak bağımlılık eklenince build kırılmalı.
Build sağlığı da kalite metriğidir. Gradle configuration cache ve build cache açık olmalı, temiz ve artımlı derleme süreleri haftalık izlenmeli. Artımlı derlemesi 2 dakikayı geçen bir proje, geliştiricinin gün içinde onlarca kez beklemesi demek.
Son gelişmeler
Ekim 2026 itibarıyla
Önce kendi cevabını düşün, sonra aç.
Küçük bir ekibiz, beş ekranlık uygulamada modülerleştirme gereksiz değil mi?
Beş ekranda büyük ölçüde gereksiz. Ama core:designsystem ve core:network gibi iki üç modülle başlamak sonradan ayırmanın maliyetini düşürür. Feature modüllerine, derleme süresi ya da ekip çakışmaları gerçek bir sorun hâline geldiğinde geçmek daha mantıklı.
Strong skipping varsayılan olduysa stabilite konusunu artık düşünmemize gerek var mı?
Daha az, ama sıfır değil. Kararsız parametreler artık referans eşitliğiyle karşılaştırıldığı için her seferinde yeni nesne geçirirseniz atlama yine çalışmaz. Recomposition sayaçlarıyla sıcak noktaları bulup yalnızca orada müdahale etmek yeterli.
Navigation 2'den 3'e geçmek için mevcut uygulamayı durdurmalı mıyız?
Hayır. Yeni feature'ları Navigation 3 ile yazıp eski grafiği kademeli küçültmek daha güvenli. Navigation 3 artık 1.2 sürümünde ve Google'ın mimari önerilerinde varsayılan tavsiye; geçişin değeri özellikle tablet ve katlanabilir desteği, öngörülü geri hareketi ve navigasyon mantığını test etme ihtiyacı olan uygulamalarda yüksek.
AI asistanlar kod yazarken mimari kuralları bozmasın diye ne yapıyorsunuz?
Kuralları Agent'ın okuyacağı bir talimat dosyasına ya da skill'e yazmak işe yarar ama yetmez. Asıl güvence, aynı kuralların Konsist ya da lint ile CI'da test olarak çalışması; ihlal eden kod insan da yazsa Agent da yazsa merge edilemez. Instagram Direct vakasının da gösterdiği gibi en güçlü koruma, yanlış deseni ifade etmeyi zorlaştıran mimarinin kendisi.
AGP 9'a geçmek için acele etmeli miyiz?
Evet, çünkü bekledikçe borç büyüyor. AGP 9 eski DSL'i gizledi ve yerleşik Kotlin'i varsayılan yaptı; geçici kaçış bayrakları AGP 10'da kalkacak. En çok iş genelde convention plugin'lerde ve eski varyant API'sine bağlı özel Gradle görevlerinde çıkıyor; önce AGP Upgrade Assistant ile tarayıp onları taşıyın.
Notun kaynakları
- Android Developers: Guide to app architecture
- Android Developers: Strong skipping mode
- Android Developers Blog: Jetpack Navigation 3 is stable (Kasım 2025)
- Android Developers: Android vitals
- Android Developers: Navigation 3 release notes
- Android Developers: Compose release notes
- Kotlin: Kotlin releases
- Android Developers: Android Gradle plugin release notes
- Android Developers: AGP 9.0 release notes
- Android Developers: Excessive partial wake locks
- Android Developers Blog: Use any AI agent of your choice in Android Studio (Eylül 2026)
- Android Developers Blog: Device Streaming and Android skills in Android CLI (Ekim 2026)
- Android Developers: Baseline Profiles overview
Sunum stili
12 slayt. Tıklarsan sunum o slayttan başlar.
Slayt notları
Üç ekseni söyle: mimari, Compose, metrik. Bunların ayrı ayrı değil birlikte çözülmesi gerektiğini vurgula.
Ekip ve özellik sayısı arttıkça yavaşlama ve kırılganlık birlikte gelir. Ekibe artımlı build sürelerini sor.
Tipik ihlal: Composable içinden Retrofit ya da DAO çağrısı, Context taşıyan ViewModel. 400 satırı ya da 8-10 bağımlılığı aşan ViewModel bölünmeyi hak eder.
Now in Android iyi bir şablon. 40 modüllü projede convention plugin'ler yüzlerce satır kopya build dosyasını ortadan kaldırır.
Kotlin 2.0.20 ile strong skipping varsayılan; yine de her recomposition'da yeni koleksiyon üretmek atlamayı bozar. Önce ölç, sonra düzelt.
Navigation 3 Kasım 2025'te stabil oldu, Eylül 2026'da 1.2'ye ulaştı ve Google'ın önerilen yolu. Gerçekçi geçiş: yeni feature modüllerini Nav 3 ile yaz, eski grafiği kademeli küçült.
Play bu değerleri son 28 günün ortalamasıyla değerlendiriyor; eşiği aşan uygulamanın mağaza görünürlüğü etkilenebiliyor. Şubat 2027'de bellek ve kod optimizasyonu eşikleri de ekleniyor.
Soğuk başlangıç ve donmuş kare oranını Play metriklerinin yanına koy. Her sürümde karşılaştır.
Kural wiki'de yaşarsa ilk yoğun sprintte delinir. Artımlı build'i 2 dakikayı geçen proje, günde onlarca kez bekleme demek.
Mimari kuralları hem Agent talimat dosyasına hem CI'daki testlere yazın. Instagram Direct'te sınırları mimariye gömmek Agent session'ı token maliyetini %33 düşürdü.
Model çalışan ama katman sınırını ihlal eden kodu kolayca üretir. İnsan gözüne güvenmek bu hızda ölçeklenmez.
Bu hafta tek bir mimari kuralı Konsist testine çevirmeyi öner.