Вызов «DisplayManagerGlobal.getDisplayInfo ()» вызывает приложение не отвечает (ANR) в приложении - PullRequest
1 голос
/ 13 апреля 2020

Очевидно, что-то в приложении вызывает метод из разных потоков (как основного, так и связующего потока), что вызывает внутреннюю ANR. Это происходит довольно часто, и у меня нет идеи относительно того, где это происходит, потому что я не могу воспроизвести его на эмуляторах или тестовых устройствах, которые у меня есть.

Что делает приложение : Это приложение для блокировки приложений, которое отображает полноэкранный режим блокировки наложения на приложение и запрашивает пароль (шаблон), который также поддерживает механизм разблокировки отпечатков пальцев. Чтобы успешно прослушать отпечаток пальца, мы также должны использовать прозрачное действие, чтобы сделать приложение go «передним планом», а затем дождаться ввода отпечатка пальца, так как в противном случае механизм распознавания отпечатков пальцев не прослушивает и не имеет обратного вызова для это тоже. Может быть, в этом причина, потому что действие запускается и заканчивается часто в каждом заблокированном приложении.

ANR сообщается по двум вопросам:

Broadcast of Intent { act=android.intent.action.SCREEN_ON flg=0x50200010 (has extras) } Broadcast of Intent { act=android.intent.action.SCREEN_OFF flg=0x50200010 (has extras) }

Что касается этого, приложение имеет службу переднего плана, которая всегда работает, потому что ему необходимо в любое время блокировать приложения в соответствии с требованием, и оно прослушивает эти события от динамического c широковещательного приемника. Тем не менее, ни в одном из них нет блокирующих или синхронизированных вызовов, только механизм остановки и запуска непрерывного рабочего потока, который проверяет текущее приложение переднего плана.

Полный отчет ANR

Связанный отчет ANR (связанный раздел, сообщаемый с устройства Android 10, API 29):

"main" prio=5 tid=1 Blocked
  | group="main" sCount=1 dsCount=0 flags=1 obj=0x71773f98 self=0x7f95a7d000
  | sysTid=28841 nice=-4 cgrp=default sched=0/0 handle=0x7f96febee8
  | state=S schedstat=( 151471598466 24930775143 453988 ) utm=9534 stm=5612 core=3 HZ=100
  | stack=0x7fddb4d000-0x7fddb4f000 stackSize=8192KB
  | held mutexes=
  at android.hardware.display.DisplayManagerGlobal.getDisplayInfo (DisplayManagerGlobal.java:177)
- waiting to lock <0x038dbdd7> (a java.lang.Object) held by thread 6
  at android.view.Display.updateDisplayInfoLocked (Display.java:1214)
  at android.view.Display.updateDisplayInfoLocked (Display.java:1209)
  at android.view.Display.getState (Display.java:1174)
- locked <0x053b6aeb> (a android.view.Display)
  at android.view.ViewRootImpl$1.onDisplayChanged (ViewRootImpl.java:1601)
  at android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate.handleMessage (DisplayManagerGlobal.java:1417)
  at android.os.Handler.dispatchMessage (Handler.java:107)
  at android.os.Looper.loop (Looper.java:237)
  at android.app.ActivityThread.main (ActivityThread.java:7811)
  at java.lang.reflect.Method.invoke (Native method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:493)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1068)

"Binder:28841_6" prio=5 tid=6 Runnable
  | group="main" sCount=0 dsCount=0 flags=0 obj=0x132c19b0 self=0x7f08d9a400
  | sysTid=29512 nice=0 cgrp=default sched=0/0 handle=0x7f0133ed50
  | state=R schedstat=( 673333745225 29381013522 76199 ) utm=67111 stm=221 core=7 HZ=100
  | stack=0x7f01248000-0x7f0124a000 stackSize=991KB
  | held mutexes= "mutator lock"(shared held)
  at android.os.MessageQueue.enqueueMessage (MessageQueue.java:581)
- locked <0x0306e956> (a android.os.MessageQueue)
  at android.os.Handler.enqueueMessage (Handler.java:754)
  at android.os.Handler.sendMessageAtTime (Handler.java:703)
  at android.os.Handler.sendMessageDelayed (Handler.java:673)
  at android.os.Handler.sendMessage (Handler.java:611)
  at android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate.sendDisplayEvent (DisplayManagerGlobal.java:1403)
  at android.hardware.display.DisplayManagerGlobal.handleDisplayEvent (DisplayManagerGlobal.java:408)
- locked <0x038dbdd7> (a java.lang.Object)
  at android.hardware.display.DisplayManagerGlobal.access$100 (DisplayManagerGlobal.java:70)
  at android.hardware.display.DisplayManagerGlobal$DisplayManagerCallback.onDisplayEvent (DisplayManagerGlobal.java:1354)
  at android.hardware.display.IDisplayManagerCallback$Stub.onTransact (IDisplayManagerCallback.java:119)
  at android.os.Binder.execTransactInternal (Binder.java:1021)
  at android.os.Binder.execTransact (Binder.java:994)

Я не совсем уверен, что является причиной этого, так как нет следов стека в Само приложение, в любых темах. И я вижу, что основной поток заблокирован из-за waiting to lock <0x038dbdd7>, так как поток связующего уже заблокировал его: locked <0x038dbdd7>, но не освободил его.

Есть какие-либо мнения по этому вопросу? Я ценю любую помощь, большое спасибо.

...