Sakin olun ve performansla ilgili daha fazla bilgi edinmek için rehberliğimizi takip edin.
Performans Spotlight Haftası'nın 3. gününe hoş geldiniz. Bugün, uygulama performansının önemli alanlarıyla ilgili ayrıntıları ve yol gösterici bilgileri paylaşmaya devam ediyoruz. Profil yönlendirmeli optimizasyon, Jetpack Compose performans iyileştirmeleri ve kamera arkası çalışma ile ilgili dikkat edilmesi gereken noktaları ele alıyoruz. Hemen başlayalım.
Profile Guided Optimization
Temel profiller ve başlatma profilleri, Android uygulamalarının başlatma ve çalışma zamanı performansını iyileştirmek için temel unsurlardır. Bunlar, Profile Guided Optimization (Profile Yönlendirmeli Optimizasyon) adı verilen bir performans optimizasyonu grubunun parçasıdır.
Bir uygulama paketlendiğinde d8 dexer, sınıfları ve yöntemleri alır ve uygulamanızın classes.dex dosyalarını doldurur. Bir kullanıcı uygulamayı açtığında, uygulama başlayana kadar bu dex dosyaları birbiri ardına yüklenir. Başlangıç profili sağlayarak d8'e ilk classes.dex dosyalarına hangi sınıfların ve yöntemlerin dahil edileceğini bildirirsiniz. Bu yapı, uygulamanın daha az dosya yüklemesini sağlar ve bu da başlangıç hızını artırır.
Temel profiller, tam zamanında (JIT) derleme adımlarını etkili bir şekilde kullanıcı cihazlarından geliştirici makinelerine taşır. Oluşturulan Ahead Of Time (AOT) derlenmiş kodun hem başlangıç süresini hem de oluşturma sorunlarını azalttığı kanıtlanmıştır.
Trello ve temel profiller
Trello uygulamasındaki mühendislere, temel profillerin uygulamalarının performansını nasıl etkilediğini sorduk. Trello, temel kullanıcı yolculuğuna Baseline Profilleri'ni uyguladıktan sonra uygulama başlatma süresinde % 25'lik önemli bir azalma gördü.
Trello, temel profilleri kullanarak uygulamasının başlatma süresini % 25 oranında iyileştirdi.
Meta'da temel profiller
Ayrıca Meta'daki mühendisler, Temel Profiller ile Android uygulamalarını nasıl hızlandırdıkları hakkında yakın zamanda bir makale yayınladı.
Meta'nın uygulamalarında, ekipler temel profilleri uyguladıktan sonra çeşitli kritik metriklerde % 40'a varan iyileşmeler gördü.
Bunun gibi teknik iyileştirmeler, kullanıcı memnuniyetini ve işletme başarısını artırmanıza da yardımcı olur. Bu bilgileri ürün sahipleriniz, CTO'larınız ve karar vericilerle paylaşmak da uygulamanızın performansını hızlandırmaya yardımcı olabilir.
Temel Profil'i kullanmaya başlama
Temel veya Başlangıç Profili oluşturmak için uygulamayı çalıştıran bir makro karşılaştırma testi yazarsınız. Test sırasında, uygulama derlemesi sırasında kullanılacak profil verileri toplanır. Testler, yarın ele alacağımız yeni UiAutomator API kullanılarak yazılmıştır.
Bu tür bir karşılaştırma yazmak kolaydır ve tam örneği GitHub'da görebilirsiniz.
@Test fun profileGenerator() { rule.collect( packageName = TARGET_PACKAGE, maxIterations = 15, stableIterations = 3, includeInStartupProfile = true ) { uiAutomator { startApp(TARGET_PACKAGE) } } }
Dikkat edilmesi gereken noktalar
Öncelikle, kullanıcılarınızın en çok kullandığı yol için bir makro karşılaştırma testi temel profili ve bir başlangıç profili yazarak başlayın. Bu, kullanıcılarınızın uygulamanıza girmek için kullandığı ana giriş noktasıdır. Bu nokta genellikle oturum açtıktan sonra olur. Ardından, yalnızca temel profiller için daha eksiksiz bir resim elde etmek üzere daha fazla test senaryosu yazmaya devam edin. Her şeyi bir temel profil ile kapsamanız gerekmez. En çok kullanılan yollara bağlı kalın ve sahadaki performansı ölçün. Bu konuyla ilgili daha fazla bilgiyi yarınki gönderide bulabilirsiniz.
Profile Guided Optimization'ı kullanmaya başlama
Temel Profil'in nasıl çalıştığını öğrenmek için Android Developers Summit'teki bu videoyu izleyin:
Ayrıca, ayrıntılı bir inceleme için Android Build Time'ın Profile Guided Optimization bölümüne göz atın:
Ayrıca, Baseline Profilleri ve Startup Profilleri hakkında daha fazla bilgi edinmek için kapsamlı rehberlerimiz de mevcuttur.
Jetpack Compose'da performans iyileştirmeleri
Android'in kullanıcı arayüzü çerçevesi, mühendislik ekibinin performans yatırımlarının karşılığını aldı. Jetpack Compose'un 1.9 sürümünden itibaren, dahili uzun kaydırma karşılaştırma testi sırasında kaydırma duraklaması % 0,2'ye düştü.
Bu iyileştirmeler, en son sürümlerde yer alan çeşitli özellikler sayesinde mümkün oldu.
Özelleştirilebilir önbellek penceresi
Varsayılan olarak, tembel düzenler yalnızca kaydırma yönünde bir öğeyi önceden oluşturur ve ekranın dışına kaydırılan öğeler atılır. Artık görüntü alanı veya dp boyutunun bir kısmı aracılığıyla saklanacak öğe sayısını özelleştirebilirsiniz. Bu sayede uygulamanız daha fazla işi önceden yapabilir ve kareler arasında duraklatılabilir kompozisyonu etkinleştirdikten sonra mevcut süreyi daha verimli kullanabilir.
Özelleştirilebilir önbellek pencerelerini kullanmaya başlamak için bir LazyLayoutCacheWindow oluşturun ve bunu tembel listenize veya tembel ızgaranıza iletin. Uygulamanızın performansını farklı önbellek penceresi boyutlarını (ör. görüntü alanının% 50'si) kullanarak ölçün. Optimum değer, içeriğinizin yapısına ve öğe boyutuna bağlıdır.
val dpCacheWindow = LazyLayoutCacheWindow(ahead = 150.dp, behind = 100.dp)
val state = rememberLazyListState(cacheWindow = dpCacheWindow)
LazyColumn(state = state) {
// column contents
}Duraklatılabilir kompozisyon
Bu özellik, kompozisyonların duraklatılmasına ve çalışmalarının birkaç kareye bölünmesine olanak tanır. API'ler 1.9 sürümünde kullanıma sunuldu ve artık 1.10 sürümünde tembel düzen önceden getirme işleminde varsayılan olarak kullanılıyor. En çok faydayı, daha uzun kompozisyon sürelerine sahip karmaşık öğelerde görürsünüz.
Daha fazla beste performansı optimizasyonu
Ekip, Compose'un 1.9 ve 1.10 sürümlerinde biraz daha az belirgin olan çeşitli optimizasyonlar da yaptı.
Arka planda eş yordamları kullanan çeşitli API'ler iyileştirildi. Örneğin, Draggable ve Clickable kullanılırken geliştiriciler daha hızlı tepki süreleri ve daha iyi tahsis sayıları görmelidir.
Düzen dikdörtgeni izlemedeki optimizasyonlar, onVisibilityChanged() ve onLayoutRectChanged() gibi değiştiricilerin performansını artırdı. Bu, söz konusu API'ler açıkça kullanılmasa bile düzen aşamasını hızlandırır.
Bir diğer performans iyileştirmesi de onPlaced() aracılığıyla konumları gözlemlerken önbelleğe alınmış değerleri kullanmaktır.
Metni arka planda önceden getirme
1.9 sürümünden itibaren Compose, arka plandaki bir iş parçacığında metinleri önceden getirme özelliğini ekler. Bu sayede, metin düzeninin daha hızlı olmasını sağlamak için önbellekleri önceden ısıtabilirsiniz. Bu özellik, uygulama oluşturma performansı için önemlidir. Düzen sırasında metin, kelime önbelleğinin doldurulduğu Android çerçevesine aktarılmalıdır. Bu işlem varsayılan olarak kullanıcı arayüzü iş parçacığında çalışır. Önceden getirme işlemini ve kelime önbelleğini arka plan iş parçacığına yüklemek, özellikle daha uzun metinlerde düzeni hızlandırabilir. Arka plan iş parçacığında önceden getirme işlemi yapmak için, arka planda BasicText kullanan herhangi bir composable'a özel bir yürütücü iletebilirsiniz. Bunu yapmak için CompositionLocalProvider'ye LocalBackgroundTextMeasurementExecutor iletebilirsiniz.
val defaultTextMeasurementExecutor = Executors.newSingleThreadExecutor()
CompositionLocalProvider(
LocalBackgroundTextMeasurementExecutor provides DefaultTextMeasurementExecutor
) {
BasicText("Some text that should be measured on a background thread!")
}Metne bağlı olarak bu, metin oluşturma performansınızı artırabilir. Uygulamanızın oluşturma performansını iyileştirdiğinden emin olmak için sonuçları karşılaştırın ve karşılaştırma testi yapın.
Arka planda çalışma performansıyla ilgili dikkat edilmesi gereken noktalar
Arka planda çalışma, birçok uygulamanın önemli bir parçasıdır. Aşağıdaki gibi görevleri gerçekleştirmek için WorkManager veya JobScheduler gibi kitaplıklar kullanıyor olabilirsiniz:
- Analitik etkinlikleri düzenli olarak yükleme
- Arka uç hizmeti ile veritabanı arasında veri senkronizasyonu
- Medya işleme (ör. resimleri yeniden boyutlandırma veya sıkıştırma)
Bu görevleri yürütürken karşılaşılan en büyük zorluklardan biri performans ve güç verimliliği arasında denge kurmaktır. WorkManager, bu dengeyi kurmanıza olanak tanır. Güç tasarrufu sağlayacak şekilde tasarlanmıştır ve belirtilen kısıtlamalar veya sistem tarafından uygulanan kısıtlamalar da dahil olmak üzere çeşitli faktörlerden etkilenen optimum yürütme penceresine işlerin ertelenmesine olanak tanır.
Ancak WorkManager, herkese uygun tek bir çözüm değildir. Android'de, belirli yaygın temel kullanıcı yolculukları (CUJ'ler) göz önünde bulundurularak özel olarak tasarlanmış, güç açısından optimize edilmiş çeşitli API'ler de bulunur.
Widget'ı güncelleme ve konum bilgilerini arka planda alma gibi bu işlemlerden yalnızca birkaçının listesi için Arka planda çalışma açılış sayfasına bakın.
Arka plan görevleri için yerel hata ayıklama araçları: Sık karşılaşılan senaryolar
Arka Planda Çalışma hatalarını ayıklamak ve bir görevin neden gecikmiş veya başarısız olmuş olabileceğini anlamak için sistemin görevlerinizi nasıl planladığını görmeniz gerekir.
Bu konuda yardımcı olması için WorkManager'da yerel olarak hata ayıklamanıza ve performansı optimize etmenize yardımcı olacak çeşitli ilgili araçlar bulunur (bunlardan bazıları JobScheduler için de çalışır). Aşağıda, WorkManager'ı kullanırken karşılaşabileceğiniz bazı yaygın senaryolar ve bunları ayıklamak için kullanabileceğiniz araçların açıklamaları yer almaktadır.
Planlanmış işin neden yürütülmediğiyle ilgili hata ayıklama
Planlanmış işin gecikmesi veya hiç yürütülmemesi, belirtilen kısıtlamaların karşılanmaması ya da sistem tarafından kısıtlamalar getirilmesi gibi çeşitli faktörlerden kaynaklanabilir.
Planlanmış işin neden çalışmadığını araştırırken ilk adım, işin başarıyla planlandığını onaylamaktır. Planlama durumunu onayladıktan sonra, çalışmanın yürütülmesini engelleyen karşılanmamış kısıtlamalar veya ön koşullar olup olmadığını belirleyin.
Bu senaryoda hata ayıklamak için çeşitli araçlar vardır.
Background Task Inspector
Background Task Inspector, doğrudan Android Studio'ya entegre edilmiş güçlü bir araçtır. Tüm WorkManager görevlerinin ve bunlarla ilişkili durumların (Çalışıyor, Sıraya Alındı, Başarısız, Başarılı) görsel bir temsilini sağlar.
Planlanmış çalışmanın neden Background Task Inspector ile yürütülmediğini hata ayıklamak için listelenen çalışma durumlarına bakın. "Kuyruğa alındı" durumu, işinizin planlandığını ancak henüz çalıştırılmayı beklediğini gösterir.
Avantajları: Bu araç, tüm görevleri görüntülemenin kolay bir yolunu sunmasının yanı sıra özellikle zincirleme işleriniz varsa faydalıdır. Arka plan görevi denetleyicisi, önceki bir görevin başarısız olmasının sonraki görevin yürütülmesini etkileyip etkilemediğini görselleştirebilen bir grafik görünümü sunar.
Background Task Inspector liste görünümü
Background Task Inspector grafik görünümü
adb shell dumpsys jobscheduler
Bu komut, belirtilen kısıtlamalar ve sistem tarafından uygulanan kısıtlamalarla birlikte tüm etkin JobScheduler işlerinin (WorkManager Worker'ları da dahil) listesini döndürür. İş geçmişi de döndürülür.
Planlanmış işinizi ve ilişkili kısıtlamaları farklı bir şekilde görüntülemek istiyorsanız bu seçeneği kullanın. WorkManager 2.10.0'dan önceki WorkManager sürümlerinde adb shell dumpsys jobscheduler, bu ada sahip Worker'ların listesini döndürür:
[package name]/androidx.work.impl.background.systemjob.SystemJobService
Uygulamanızda birden fazla Worker varsa WorkManager 2.10.0'a güncelleme yaptığınızda Worker adlarını görebilir ve Worker'ları kolayca ayırt edebilirsiniz:
#WorkerName#@[package name]/androidx.work.impl.background.systemjob.SystemJobService
Avantajları: Bu komut, Background Task Inspector ile belirleyemeyeceğiniz sistem tarafından uygulanan kısıtlamalar olup olmadığını anlamak için kullanışlıdır. Örneğin, bu, uygulamanızın bekleme grubunu döndürür. Bu da planlanmış işin tamamlanacağı pencereyi etkileyebilir.
Hata ayıklama günlük kaydını etkinleştirme
WM— eklenmiş ayrıntılı WorkManager günlüklerini görmek için özel günlük kaydını etkinleştirebilirsiniz.
Avantajları: Bu özellik sayesinde, çalışmaların ne zaman planlandığı, kısıtlamaların ne zaman karşılandığı ve yaşam döngüsü etkinlikleri hakkında bilgi edinebilirsiniz. Ayrıca, uygulamanızı geliştirirken bu günlüklerden yararlanabilirsiniz.
WorkInfo.StopReason
Belirli bir çalışanda öngörülemeyen performans fark ederseniz WorkInfo.getStopReason ile önceki çalıştırma denemesinde çalışanınızın durdurulma nedenini programatik olarak gözlemleyebilirsiniz.
Uygulamanızı, işinizin arka plan kısıtlamalarından, sınırlamalardan, sık zaman aşımlarından etkilenip etkilenmediğini veya kullanıcı tarafından durdurulup durdurulmadığını belirlemek için getWorkInfoByIdFlow kullanarak WorkInfo'yu gözlemleyecek şekilde yapılandırmanız iyi bir uygulamadır.
Avantajları: Çalışanlarınızın performansı hakkında saha verileri toplamak için WorkInfo.StopReason'ı kullanabilirsiniz.
Android vitals tarafından işaretlenen, WorkManager ile ilişkilendirilmiş yüksek uyanık kalma kilidi süresinde hata ayıklama
Android vitals'da, pilin hızlı tükenmesine katkıda bulunan uyanık kalma kilitlerini vurgulayan aşırı sayıda kısmi uyanık kalma kilitleri metriği bulunur. WorkManager'ın görevleri yürütmek için uyandırma kilitleri aldığını ve uyandırma kilitlerinin Google Play tarafından belirlenen eşiği aşması durumunda uygulamanızın görünürlüğünü etkileyebileceğini öğrenince şaşırabilirsiniz. İşinize atfedilen bu kadar uzun uyanık kalma kilidi süresinin nedenini nasıl hata ayıklayabilirsiniz? Aşağıdaki araçları kullanabilirsiniz.
Android vitals kontrol paneli
Öncelikle Android vitals aşırı uyanık kalma kilidi kontrol panelinde yüksek uyanık kalma kilidi süresinin WorkManager'dan kaynaklandığını, alarm veya başka bir uyanık kalma kilidinden kaynaklanmadığını doğrulayın. WorkManager nedeniyle hangi uyandırma kilitlerinin tutulduğunu anlamak için Diğer API'ler tarafından oluşturulan uyandırma kilitlerini belirleme dokümanını kullanabilirsiniz.
Perfetto
Perfetto, sistem izlerini analiz etmek için kullanılan bir araçtır. Özellikle WorkManager'da hata ayıklama için kullanırken işinizin ne zaman başladığını, ne kadar sürdüğünü ve güç tüketimine nasıl katkıda bulunduğunu görmek için "Cihaz Durumu" bölümünü inceleyebilirsiniz.
"Cihaz Durumu: İşler" kanalında, yürütülen tüm çalışanları ve bunlarla ilişkili uyandırma kilitlerini görebilirsiniz.
Perfetto'daki Cihaz Durumu bölümünde CleanupWorker ve BlurWorker yürütme işlemleri gösteriliyor.
Kaynaklar
Karşılaşabileceğiniz diğer senaryolarda kullanılabilecek hata ayıklama yöntemlerine genel bir bakış için WorkManager'da hata ayıklama sayfasını inceleyin.
Bu yöntemlerden bazılarını uygulamalı olarak denemek ve WorkManager'da hata ayıklama hakkında daha fazla bilgi edinmek için Gelişmiş WorkManager ve Test codelab'ine göz atın.
Sonraki adımlar
Bugün, kod daraltmanın ötesine geçerek Android Çalışma Zamanı ve Jetpack Compose'un uygulamanızı nasıl oluşturduğunu inceledik. Temel profillerle kritik yolları önceden derlemek veya yeni Compose 1.9 ve 1.10 özellikleriyle kaydırma durumlarını düzeltmek gibi işlemlerle bu araçlar, uygulamanızın hissine odaklanır. Ayrıca, arka planda yapılan işlemlerde hata ayıklamayla ilgili en iyi uygulamaları ayrıntılı olarak ele aldık.
Android'e Sor
Cuma günü performansla ilgili canlı bir soru-cevap etkinliği düzenliyoruz. #AskAndroid hashtag'ini kullanarak sorularınızı sorun ve uzmanlardan yanıt alın.
Zorluk
Pazartesi günü R8'i etkinleştirme konusunda size meydan okuduk. Bugün sizden uygulamanız için bir temel profil oluşturmanızı istiyoruz.
Android Studio Otter'daki Baseline Profile Generator modül sihirbazı sayesinde bu işlem her zamankinden daha kolay. En kritik kullanıcı yolculuğunuzu (yalnızca uygulamanızın başlatılması ve giriş yapılması olsa bile) seçin ve bir profil oluşturun.
Erişim sağladığınızda CompilationMode.None ile CompilationMode.Partial karşılaştırması yapmak için Macrobenchmark çalıştırın.
Başlangıç süresindeki iyileştirmelerinizi #optimizationEnabled hashtag'ini kullanarak sosyal medyada paylaşın.
Yarın izlemeye başlayın
Uygulamanızı R8 ile küçültmüş ve çalışma zamanınızı Profile Guided Optimization ile optimize etmişsinizdir. Ancak bu başarıları paydaşlarınıza nasıl kanıtlayabilirsiniz? Ayrıca, regresyonları canlı sürüme ulaşmadan nasıl yakalarsınız?
Yarın 4. Gün: Performans Dengeleme Rehberi başlıklı oturumda bize katılın. Bu oturumda, Play Vitals'daki alan verilerinden Perfetto ile derin yerel izlemeye kadar başarınızı nasıl ölçeceğinizi ayrıntılı olarak ele alacağız.
Okumaya devam edin
-
"Nasıl yapılır?" rehberleri
Yeni özellikler üzerinde çalışırken uygulama performansı genellikle ikinci plana atılır. Ancak geliştiriciler her zaman akla ilk gelen olarak görmese de kullanıcılar, uygulamanızın performansının tam olarak nerede geride kaldığını görebilir.
Ben Weiss • Okuma süresi: 3 dk.
-
"Nasıl yapılır?" rehberleri
Aşırı pilin hızlı tükenmesinin Android kullanıcıları için akla ilk gelen sorunlardan biri olduğunun farkında olan Google, geliştiricilerin daha az güç tüketen uygulamalar geliştirmesine yardımcı olmak için önemli adımlar atmaktadır.
Alice Yuan • Okuma süresi: 8 dk.
-
"Nasıl yapılır?" rehberleri
Hem cihaz üzerinde hem de bulut modellerini kullanan yapay zeka destekli özelliklerin örneklerini sunarak kullanıcılarınız için keyifli deneyimler oluşturmanıza ilham vermek istedik.
Thomas Ezan, Ivy Knight • Okuma süresi: 2 dakika
Gelişmelerden haberdar olun
Android geliştirmeyle ilgili en son analizleri her hafta gelen kutunuza alın.