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