Yanıt vermeyen ileti dizisini bulma

Bu belgede, ANR yığın dökümünde yanıt vermeyen iş parçacığının nasıl tanımlanacağı gösterilmektedir. Yanıt vermeyen iş parçacığı, aşağıdaki tabloda gösterildiği gibi ANR türüne göre değişiklik gösterir.

ANR türü Yanıt vermeyen ileti dizisi
Giriş dağıtımı Ana iş parçacığı
Odaklanılmış pencere olmadan giriş gönderme Ana iş parçacığı. Bu ANR türü genellikle engellenen bir iş parçacığından kaynaklanmaz.
Yayın alıcısı (eşzamanlı) İş parçacığı çalışıyor: onReceive(). Context.registerReceiver kullanılarak ana olmayan bir iş parçacığında özel bir işleyici belirtilmedikçe bu, ana iş parçacığıdır.
Yayın alıcısı (eşzamansız) goAsync çağrıldıktan sonra yayını işleme işini yapmaktan hangi iş parçacığı veya iş parçacığı havuzunun sorumlu olduğunu görmek için kodu kontrol edin.
Hizmet zaman aşımını yürütme Ana iş parçacığı
Ön plan hizmeti başlangıcı Ana iş parçacığı
İçerik sağlayıcı yanıt vermiyor Şu ikisinden birini yapın:
  • ANR, içerik sağlayıcı sorgusunun yavaş olmasından kaynaklanıyorsa bağlayıcı iş parçacığı.
  • ANR'nin uzun bir uygulama başlatılması nedeniyle ana iş parçacığı.
onStartJob veya onStopJob için yanıt yok Ana iş parçacığı

Bazen iş parçacığı farklı bir iş parçacığı veya işlemdeki temel nedenden dolayı yanıt vermiyor. İleti dizisi, aşağıdaki iletinin beklendiği için yanıt vermeyebilir:

  • Farklı bir iş parçacığı tarafından tutulan bir kilit.
  • Farklı bir işleme yavaş bir bağlayıcı çağrısı.

Yanıt vermeyen ileti dizilerinin yaygın nedenleri

Yanıt vermeyen ileti dizilerinin yaygın nedenleri aşağıda verilmiştir.

Bağlayıcı çağrısı yavaş

Çoğu bağlayıcı çağrısı hızlı olsa da uzun kuyruk çok yavaş olabilir. Kilit anlaşmazlığı, gelen çok sayıda bağlayıcı çağrısı veya donanım soyutlama katmanı (HAL) zaman aşımı gibi durumlarda cihaz yüklüyse veya bağlayıcı yanıt ileti dizisi yavaşsa bu durumun meydana gelme olasılığı daha yüksektir.

Bu sorunu, mümkün olduğunda eşzamanlı bağlayıcı çağrılarını arka plan iş parçacıklarına taşıyarak çözebilirsiniz. Aramanın ana iş parçacığında gerçekleşmesi gerekiyorsa aramanın neden yavaş olduğunu öğrenin. Bunu yapmanın en iyi yolu Perfetto izlerini kullanmaktır.

Yığınlarda BinderProxy.transactNative veya Binderproxy.transact arayın. Bu, bir bağlayıcı çağrısı yapıldığı anlamına gelir. Bu iki satırı izleyerek çağrılan binder API'yi görebilirsiniz. Aşağıdaki örnekte, çağrı IAccessibilityManager.addClient kullanılmıştır.

main tid=123

...
android.os.BinderProxy.transactNative (Native method)
android.os.BinderProxy.transact (BinderProxy.java:568)
android.view.accessibility.IAccessibilityManager$Stub$Proxy.addClient (IAccessibilityManager.java:599)
...

Çok sayıda art arda bağlayıcı çağrısı

Sıkı bir döngüde çok sayıda ardışık bağlayıcı çağrısı yapmak, bir iş parçacığını uzun süre engelleyebilir.

Engelleyen bir G/Ç

Ana iş parçacığında hiçbir zaman engelleme G/Ç işlemi gerçekleştirme. Bu bir anti kalıptır.

Kilit anlaşmazlığı

Kilit alınırken bir iş parçacığı engellenirse bu durum ANR'ye neden olabilir.

Aşağıdaki örnekte, kilit almaya çalışırken ana iş parçacığının engellendiği gösterilmektedir:

main (tid=1) Blocked

Waiting for com.example.android.apps.foo.BarCache (0x07d657b7) held by
ptz-rcs-28-EDITOR_REMOTE_VIDEO_DOWNLOAD
[...]
at android.app.ActivityThread.handleStopActivity(ActivityThread.java:5412)
[...]

Engelleyen ileti dizisi, video indirmek için bir HTTP isteğinde bulunuyor:

ptz-rcs-28-EDITOR_REMOTE_VIDEO_DOWNLOAD (tid=110) Waiting

at jdk.internal.misc.Unsafe.park(Native method:0)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:211)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:715)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1047)
at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:230)
at com.example.android.apps.foo.HttpRequest.execute(HttpRequest:136)
at com.example.android.apps.foo$Task$VideoLoadTask.downloadVideoToFile(RequestExecutor:711)
[...]

Pahalı çerçeve

Tek bir karede çok fazla şeyin oluşturulması, ana iş parçacığının çerçevenin süresi boyunca yanıt vermemesine neden olabilir. Örneğin:

  • Gereksiz birçok ekran dışı öğe oluşturma.
  • Çok sayıda kullanıcı arayüzü öğesi oluştururken O(n^2) gibi verimsiz bir algoritma kullanma.

Diğer bileşen tarafından engellendi

Yayın alıcısı gibi başka bir bileşen, ana iş parçacığını beş saniyeden uzun süre engellerse giriş dağıtımı ANR'leri ve ciddi duraklamalar yaşanabilir.

Uygulama bileşenlerindeki ana iş parçacığına çok fazla iş yapmaktan kaçının. Mümkün olduğunda yayın alıcılarını farklı bir iş parçacığında çalıştırın.