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:
|
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.