Bir Android uygulamasının kullanıcı arayüzü iş parçacığı çok uzun süre engellendiğinde "Uygulama Yanıt Vermiyor" (ANR) hatası tetiklenir. Android vitals, uygulamanızın farklı cihazlardaki kararlılığını ve yanıt verme hızını izlemenize yardımcı olmak için Google Play Console'da ANR metriklerini izler ve raporlar.
Android vitals metrikleri ve eşikleri
Android vitals, uygulamanızın ANR oranını izlemenize ve iyileştirmenize yardımcı olabilir. Android vitals, çeşitli ANR oranlarını ölçer:
- ANR oranı: Herhangi bir türde ANR yaşayan günlük etkin kullanıcı sayınızın yüzdesi.
- Kullanıcı tarafından algılanan ANR oranı: Günlük etkin kullanıcılarınız arasında, kullanıcı tarafından algılanan en az bir ANR yaşayanların yüzdesidir. Şu anda yalnızca
Input dispatching timed outtüründeki ANR'ler kullanıcı tarafından algılanan ANR olarak kabul edilmektedir. - Çoklu ANR oranı: Günlük etkin kullanıcı sayınız arasında en az iki ANR yaşayanların yüzdesidir.
Günlük etkin kullanıcı, uygulamanızı tek bir günde tek bir cihazda, muhtemelen birden fazla oturumda kullanan benzersiz bir kullanıcıdır. Tek bir günde uygulamanızı birden çok cihazda kullanan bir kullanıcı, o günün etkin kullanıcı sayısına her cihaz için bir kullanıcı olarak eklenir.
Kullanıcı tarafından algılanan yanıt yok hatası oranı önemli veriler arasında yer alır. Yani Google Play'de uygulamanızın keşfedilebilirliğini etkiler. Bu metriğin saydığı ANR'lerin her zaman kullanıcılar uygulamayla etkileşim halindeyken gerçekleşerek çok fazla aksamaya yol açması, bu metriği önemli kılar.
Google Play, bu metrik için iki kötü davranış eşiği belirlemiştir:
- Genel olarak kötü davranış eşiği: Tüm cihaz modellerinde, günlük etkin kullanıcı sayısının en az% 0,47'si, kullanıcı tarafından algılanan ANR yaşamıştır.
- Cihaz bazında kötü davranış eşiği: Günlük kullanıcıların en az% 8'i tek bir cihaz modeliyle ilişkili, kullanıcı tarafından algılanan ANR yaşamıştır.
Uygulamanız genel kötü davranış eşiğini aşarsa tüm cihazlarda bulunabilirliği azalabilir. Uygulamanız bazı cihazlarda cihaz başına kötü davranış eşiğini aşarsa bu cihazlarda bulunabilirliği azalabilir ve mağaza girişinizde bir uyarı gösterilebilir.
Uygulamanız aşırı ANR gösterdiğinde Android vitals, Play Console üzerinden sizi uyarabilir.
Google Play'in Android vitals verilerini nasıl topladığı hakkında bilgi edinmek için Google Play Console belgelerine bakın.
Sorunu tespit etme
Uygulama, ANR gerçekleştiğinde ön plandaysa sistem, Şekil 1'de gösterildiği gibi kullanıcıya bir iletişim kutusu gösterir. ANR iletişim kutusu, kullanıcıya uygulamayı kapanmaya zorlama fırsatı verir.
ANR'ler, uygulamanın kullanıcı arayüzünü güncellemekten sorumlu ana iş parçacığının kullanıcı girişi etkinliklerini işleyememesi veya çizememesi nedeniyle kullanıcıda hayal kırıklığına yol açan bir sorundur. Uygulamanın ana iş parçacığı hakkında daha fazla bilgi için İşlemlere ve iş parçacıklarına genel bakış başlıklı makaleyi inceleyin.
Aşağıdaki durumlardan biri gerçekleştiğinde uygulamanız için bir ANR tetiklenir:
- Giriş gönderme zaman aşımına uğradı: Uygulamanız bir giriş etkinliğine (ör. tuşa basma veya ekrana dokunma) 5 saniye içinde yanıt vermezse.
- Hizmet yürütme: Uygulamanız tarafından bildirilen bir hizmet, birkaç saniye içinde
Service.onCreateveService.onStartCommandveyaService.onBindyürütmeyi tamamlayamazsa. Service.startForegroundçağrılmadı: Uygulamanız ön planda yeni bir hizmet başlatmak içinContext.startForegroundServicekullanıyor ancak hizmet 5 saniye içindestartForegroundçağrısı yapmıyor.- Intent yayını: Bir
BroadcastReceiverbelirli bir süre içinde yürütmeyi tamamlamadıysa. Uygulamanın ön planda herhangi bir etkinliği varsa bu zaman aşımı 10 saniyedir. JobScheduleretkileşimleri: BirJobServicebirkaç saniye içindeJobService.onStartJobveyaJobService.onStopJobyönteminden dönmezse ya da kullanıcı tarafından başlatılan bir iş başlarsa ve uygulamanız,JobService.onStartJobçağrıldıktan sonra birkaç saniye içindeJobService.setNotificationyöntemini çağırmazsa. Android 13 ve önceki sürümleri hedefleyen uygulamalarda ANR'ler sessizdir ve uygulamaya bildirilmez. Android 14 ve sonraki sürümleri hedefleyen uygulamalarda ANR'ler açıktır ve uygulamaya bildirilir.
Android vitals'ın yanı sıra, sahada ANR'leri tespit etmek için başka araçlar da kullanabilirsiniz. Ancak üçüncü taraf araçlar, Android 10 (API düzeyi 29) ve önceki sürümlerde ANR'leri bildiremez.
ANR'leri teşhis etme
ANR'leri teşhis ederken dikkat edilmesi gereken bazı yaygın kalıplar vardır:
- Uygulama, ana iş parçacığında G/Ç içeren yavaş işlemler gerçekleştiriyor.
- Uygulama, ana iş parçacığında uzun bir hesaplama yapıyor.
- Ana iş parçacığı başka bir işleme eşzamanlı bir bağlayıcı çağrısı yapıyor ve bu diğer işlemin geri dönmesi uzun sürüyor.
- Ana iş parçacığı, başka bir iş parçacığında gerçekleşen uzun bir işlem için senkronize edilmiş bir bloğu beklerken engelleniyor.
- Ana iş parçacığı, işleminizde veya bir bağlayıcı çağrısı aracılığıyla başka bir iş parçacığıyla kilitlenmiş durumda. Ana iş parçacığı yalnızca uzun bir işlemin tamamlanmasını beklemiyor, aynı zamanda kilitlenme durumunda.
Aşağıdaki teknikler, ANR'lerinizin nedenini belirlemenize yardımcı olabilir.
HealthStats
HealthStats; toplam kullanıcı ve sistem süresi, CPU süresi, ağ, radyo istatistikleri, ekran açık ve kapalı kalma süresi ve uyandırma alarmlarını yakalayarak bir uygulamanın durumu hakkında metrikler sağlar. Bu sayede genel CPU kullanımını ve pil tüketimini ölçebilirsiniz.
Hata ayıkla
Debug, geliştirme sırasında Android uygulamalarını incelemenize yardımcı olur. Uygulamalardaki takılma ve gecikmeleri belirlemek için izleme ve ayırma sayıları da buna dahildir.
Çalışma zamanı ve yerel bellek sayaçlarının yanı sıra belirli bir işlemin bellekte kapladığı yeri belirlemenize yardımcı olabilecek bellek metriklerini almak için Debug aracını da kullanabilirsiniz.
ApplicationExitInfo
ApplicationExitInfo, Android 11 (API düzeyi 30) ve sonraki sürümlerde kullanılabilir ve uygulamadan çıkış nedeni hakkında bilgi sağlar. ANR'ler, yetersiz bellek, uygulama kilitlenmeleri, aşırı CPU kullanımı, kullanıcı kesintileri, sistem kesintileri ve çalışma zamanında istenen izin değişiklikleri buna dahildir.
Yüksek düzey modu
StrictMode, uygulamanızı geliştirirken ana iş parçacığında yanlışlıkla yapılan G/Ç işlemlerini bulmanıza yardımcı olur. StrictMode aracını uygulama veya etkinlik düzeyinde kullanabilirsiniz.
Arka planda ANR iletişim kutularını etkinleştir
Android, yayın mesajını işlemek için çok uzun süre harcayan uygulamalar için ANR iletişim kutularını yalnızca cihazın Geliştirici seçenekleri bölümünde Tüm ANR'leri göster seçeneği etkinleştirilmişse gösterir. Bu nedenle, uygulama performans sorunları yaşasa bile arka plan ANR iletişim kutuları kullanıcıya her zaman gösterilmez.
CPU ve sistem izlerinin profilini oluşturma
Oyununuz çalışırken sistem izlerini ve CPU etkinliğini kaydetmek için Android Studio CPU Profiler'ı kullanın. Oyun motorunuzun oluşturma, ses ve çalışan iş parçacıklarıyla birlikte ana Activity iş parçacığını incelemek, uzun kareleri, eşzamanlı öğe yüklemelerini ve iş parçacığı çekişmesini ANR'yi tetiklemeden önce tespit etmenize yardımcı olur.
İzleme dosyası alma
Android, ANR ile karşılaştığında izleme bilgilerini depolar. Daha eski Android sürümlerinde cihazda tek bir /data/anr/traces.txt dosyası bulunur. Daha yeni Android sürümlerinde birden fazla /data/anr/anr_* dosyası vardır. ANR izlerine bir cihazdan veya emülatörden erişmek için Android Debug Bridge (adb) aracını root olarak kullanabilirsiniz:
adb root
adb shell ls /data/anr
adb pull /data/anr/<filename>
Cihazdaki "Hata raporu al" geliştirici seçeneğini veya geliştirme makinenizdeki adb bugreport komutunu kullanarak fiziksel cihazdan hata raporu alabilirsiniz. Daha fazla bilgi için Hata raporlarını yakalama ve okuma başlıklı makaleyi inceleyin.
Sorunları düzeltme
Sorunu belirledikten sonra, sık karşılaşılan sorunları düzeltmek için bu bölümdeki ipuçlarını kullanabilirsiniz.
Ana iş parçacığında yavaş kod
Kodunuzda, uygulamanın ana iş parçacığının 5 saniyeden uzun süre meşgul olduğu yerleri belirleyin. Oyununuzda şüpheli kullanım alanlarını arayın ve ANR'yi yeniden oluşturmaya çalışın.
Oyunlarda ana iş parçacığı duraklamaları genellikle Android ana Activity iş parçacığında (ör. onCreate, onResume veya kullanıcı arayüzü iş parçacığından çağrılan JNI geri çağırmalarında) eşzamanlı öğe açma, gölgelendirici derleme veya ağır oyun durumu başlatma işlemleri çalıştırıldığında meydana gelir. Oyun döngüsü yürütme, öğe işleme ve sahne başlatma işlemlerini özel motor, oluşturma veya arka plan çalışan iş parçacıklarına taşıyın. Böylece ana iş parçacığı, giriş ve yaşam döngüsü etkinliklerini işlemek için boş kalır.
Ana iş parçacığında G/Ç
Ana iş parçacığında G/Ç işlemlerinin yürütülmesi, ana iş parçacığındaki işlemlerin yavaşlamasının yaygın bir nedenidir ve ANR'lere yol açabilir.
Tüm öğe paketi okumalarını, kayıtlı oyun serileştirmelerini, SharedPreferences erişimlerini ve ağ isteklerini ana Activity iş parçacığından arka plan çalışan iş parçacıklarına taşıyın. Böylece depolama alanı veya ağ gecikmesi, giriş gönderimini engelleyemez.
Kilitlenmeler
Kilitlenme, bir iş parçacığı bekleme durumuna girdiğinde meydana gelir. Bunun nedeni, gerekli bir kaynağın başka bir iş parçacığı tarafından tutulmasıdır. Bu iş parçacığı da ilk iş parçacığı tarafından tutulan bir kaynağı beklemektedir. Uygulamanın ana iş parçacığı bu durumdaysa ANR'ler meydana gelebilir.
Oyunlarda kilitlenmeler ve kilit çekişmeleri, Android ana Activity iş parçacığı (yaşam döngüsü, yüzey veya giriş geri çağırmalarını işleme) ile yerel C ya da C++ oluşturma, mantık veya ses iş parçacıkları arasında sık sık meydana gelir. Yerel motor kilitleri için ana iş parçacığında eşzamanlı beklemelerden kaçının ve JNI ile motor iş parçacıkları arasında iletişim kurarken tutarlı kilit sıralaması veya kilitsiz mesaj sıraları kullanın.
Kilitlenmeler, bilgisayar biliminde iyi incelenmiş bir olgudur ve kilitlenmeleri önlemek için kullanabileceğiniz kilitlenme önleme algoritmaları vardır.
Daha fazla bilgi için Wikipedia'da Kilitlenme ve Kilitlenmeyi önleme algoritmaları başlıklı makaleleri inceleyin.
Yavaş yayın alıcıları
Uygulamalar, yayın alıcıları aracılığıyla uçak modunu etkinleştirme veya devre dışı bırakma ya da bağlantı durumundaki bir değişiklik gibi yayın mesajlarına yanıt verebilir. Uygulamanın, yayın mesajını işlemesi çok uzun sürdüğünde ANR meydana gelir.
ANR aşağıdaki durumlarda gerçekleşir:
- Bir yayın alıcısı, makul bir süre içinde
onReceiveyöntemini yürütmeyi tamamlamadı. - Yayın alıcısı
goAsyncyöntemini çağırıyor ancakPendingResultnesnesindefinishyöntemini çağıramıyor.
Uygulamanız, bir BroadcastReceiver'nin onReceive yönteminde yalnızca kısa işlemler gerçekleştirmelidir. Ancak uygulamanız bir yayın mesajı sonucunda daha karmaşık işlemler gerektiriyorsa görevin en fazla birkaç saniye sürmesi bekleniyorsa görevi bir arka plan çalışan iş parçacığına, birkaç saniyeden uzun sürmesi beklenen görevler için ise WorkManager'e ertelemeniz gerekir.
GameActivity
GameActivity kitaplığı, C veya C++ dilinde yazılmış oyun ve uygulamaların örnek olay incelemelerinde ANR'leri azaltmıştır. Mevcut yerel etkinliğinizi GameActivity ile değiştirirseniz kullanıcı arayüzü iş parçacığı engellemesini azaltabilir ve bazı ANR'lerin oluşmasını önleyebilirsiniz.
Oyununuzu Unity ile geliştiriyorsanız Unity oyunları için ANR'lerde hata ayıklama, Yaygın Unity oyunları ANR'leri ve Unity oyunları için Android kilitlenmelerini ve ANR'leri simgeleştirme başlıklı makaleleri inceleyin.
ANR'ler hakkında daha fazla bilgi için Uygulamanızın yanıt vermesini sağlama başlıklı makaleyi inceleyin. Mesaj dizileri hakkında daha fazla bilgi için Mesaj dizileriyle daha iyi performans başlıklı makaleyi inceleyin.
Sizin için önerilenler
- Not: JavaScript devre dışı bırakıldığında bağlantı metni gösterilir.
- Aşırı sayıda uyandırma