Yanıt vermeyen ileti dizisini bulma

Bu dokümanda, ANR yığınındaki yanıt vermeyen iş parçacığının nasıl tanımlanacağı gösterilmektedir dökümü. Yanıt vermeyen ileti dizisi, aşağıda gösterildiği gibi ANR türüne göre değişiklik gösterir tablosunu oluşturalım.

ANR türü Yanıt vermeyen mesaj dizisi
Giriş dağıtımı Ana iş parçacığı
Giriş dağıtımı, odaklanılmış pencere yok Ana iş parçacığı. Bu ANR türü, genellikle engellenmiş bir ANR'den kaynaklanmaz ileti dizisi.
Yayın alıcı (eşzamanlı) İş parçacığı çalışıyor onReceive() Ana olmayan bir iş parçacığında özel bir işleyici yoksa ana iş parçacığı budur. kullanılarak belirtilir Context.registerReceiver
Yayın alıcı (eşzamansız) Hangi iş parçacığının veya iş parçacığı havuzunun sorumlu olduğunu görmek için kodu kontrol edin sonrasında yayını işlemek için gereken goAsync. çağrılır.
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, yavaş bir içerik sağlayıcıdan kaynaklanıyorsa bağlayıcı iş parçacığı emin olun.
  • ANR uzun bir uygulama başlatmasından kaynaklanıyorsa ana iş parçacığı.
Yanıt yok: onStartJob. veya onStopJob Ana iş parçacığı

Bazen ileti dizisi, farklı bir ileti dizisindeki temel nedenden dolayı yanıt vermiyor ya da süreçtir. İleti dizisi, aşağıdakilerin beklendiği için yanıt vermeyebilir:

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

Yanıt vermeyen ileti dizilerinin yaygın nedenleri

İleti dizilerinin yanıt vermemesinin yaygın nedenleri aşağıda belirtilmiştir.

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

Bağlayıcı çağrılarının çoğu hızlı olsa da uzun kuyruk çok yavaş olabilir. Bu büyük ihtimalle cihaz yüklendiğinde veya bağlayıcı yanıt ileti dizisinde yavaş (ör. kilit anlaşmazlığı, gelen bağlayıcı çağrısı veya donanım) soyutlama katmanı (HAL) zaman aşımı.

Eşzamanlı bağlayıcı çağrılarını arka plandaki ileti dizilerine taşıyarak bu sorunu çözebilirsiniz Mümkün olduğunca kullanın. Aramanın ana ileti dizisinde yapılması gerekiyorsa anlamına gelir. Bunu yapmanın en iyi yolu Perfetto izlerini kullanmaktır.

Grupta BinderProxy.transactNative veya Binderproxy.transact bulun. Bu, bir bağlayıcı çağrısı gerçekleştiği anlamına gelir. Bu iki satırın ardından, iki satır arasındaki binder API'yi kullandığınızdan emin olun. Aşağıdaki örnekte çağrı, IAccessibilityManager.addClient

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 ardışık bağlayıcı çağrısı

Sıkı bir döngü içinde çok sayıda art arda bağlayıcı çağrısı gerçekleştirmek, iş parçacığının uzun süre koruyor.

Engelleyen bir G/Ç

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

Kilit anlaşmazlığı

Kilit alınırken bir iş parçacığı engellenirse ANR'ye yol açabilir.

Aşağıdaki örnekte, kilit:

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)
[...]

Engelleme iş parçacığı bir video indirmek için 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 çerçevede çok fazla şey oluşturmak ana iş parçacığının çerçeve boyunca yanıt vermiyor, örneğin:

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

Başka bir bileşen tarafından engellendi

Yayın alıcı gibi başka bir bileşen, ana iş parçacığını beş saniyeden uzun sürede giriş dağıtma ANR'leri ve ciddi kilitlenmelere neden olabilir.

Uygulama bileşenlerindeki ana iş parçacığı üzerinde ağır işlem yapmaktan kaçının. Yayını çalıştır farklı bir ileti dizisine gönderin.