Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Mobile and Embedded
  4. Android ANR Deadlock in QtAccessibilityDelegate

Android ANR Deadlock in QtAccessibilityDelegate

Scheduled Pinned Locked Moved Unsolved Mobile and Embedded
7 Posts 4 Posters 1.4k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • B Offline
    B Offline
    bee65
    wrote on last edited by
    #1

    I'm getting an ANR reported in Google play in a Qt 6.4.1 Qt Quick app. I am not able to reproduce it, but it is causing an ANR rate of about 1% of daily sessions, which is above Google's bad behavior threshold.

    The stacktrace on the main Android thread always looks like this:

      #00  pc 0x000000000004dc5c  /apex/com.android.runtime/lib64/bionic/libc.so (syscall+28)
      #01  pc 0x000000000042fb24  /data/app/~~VgtqCgcr-t5Si4wwd3VLQw==/com.memorymap.mmfa-5dkeqI6_jo1Ied7dRGlw2A==/lib/arm64/libQt6Core_arm64-v8a.so
      #02  pc 0x0000000000431250  /data/app/~~VgtqCgcr-t5Si4wwd3VLQw==/com.memorymap.mmfa-5dkeqI6_jo1Ied7dRGlw2A==/lib/arm64/libQt6Core_arm64-v8a.so
      #03  pc 0x0000000000430f50  /data/app/~~VgtqCgcr-t5Si4wwd3VLQw==/com.memorymap.mmfa-5dkeqI6_jo1Ied7dRGlw2A==/lib/arm64/libQt6Core_arm64-v8a.so
      #04  pc 0x0000000000340ad4  /data/app/~~VgtqCgcr-t5Si4wwd3VLQw==/com.memorymap.mmfa-5dkeqI6_jo1Ied7dRGlw2A==/lib/arm64/libQt6Core_arm64-v8a.so (QMetaObject::invokeMethodImpl(QObject*, QtPrivate::QSlotObjectBase*, Qt::ConnectionType, void*)+276)
      #05  pc 0x000000000003bca8  /data/app/~~VgtqCgcr-t5Si4wwd3VLQw==/com.memorymap.mmfa-5dkeqI6_jo1Ied7dRGlw2A==/lib/arm64/libplugins_platforms_qtforandroid_arm64-v8a.so
      at org.qtproject.qt.android.accessibility.QtNativeAccessibility.populateNode (Native method)
      at org.qtproject.qt.android.accessibility.QtAccessibilityDelegate.getNodeForVirtualViewId (QtAccessibilityDelegate.java:385)
      at org.qtproject.qt.android.accessibility.QtAccessibilityDelegate.access$800 (QtAccessibilityDelegate.java:31)
      at org.qtproject.qt.android.accessibility.QtAccessibilityDelegate$1.createAccessibilityNodeInfo (QtAccessibilityDelegate.java:440)
      at android.view.ViewRootImpl.requestSendAccessibilityEvent (ViewRootImpl.java:9153)
      at android.view.ViewGroup.requestSendAccessibilityEvent (ViewGroup.java:1099)
      at android.view.ViewGroup.requestSendAccessibilityEvent (ViewGroup.java:1099)
      at android.view.ViewGroup.requestSendAccessibilityEvent (ViewGroup.java:1099)
      at org.qtproject.qt.android.accessibility.QtAccessibilityDelegate.sendAccessibilityEvent (QtAccessibilityDelegate.java:255)
      at org.qtproject.qt.android.accessibility.QtAccessibilityDelegate.sendEventForVirtualViewId (QtAccessibilityDelegate.java:241)
      at org.qtproject.qt.android.accessibility.QtAccessibilityDelegate.notifyObjectFocus (QtAccessibilityDelegate.java:199)
      at org.qtproject.qt.android.QtActivityDelegate.notifyObjectFocus (QtActivityDelegate.java:936)
      at org.qtproject.qt.android.QtNative$17.run (QtNative.java:970)
      at android.os.Handler.handleCallback (Handler.java:938)
      at android.os.Handler.dispatchMessage (Handler.java:99)
      at android.os.Looper.loopOnce (Looper.java:346)
      at android.os.Looper.loop (Looper.java:475)
      at android.app.ActivityThread.main (ActivityThread.java:7889)
      at java.lang.reflect.Method.invoke (Native method)
      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:548)
      at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1009)
    

    The qtMainLoopThread has various different stacktraces in different instances of the ANR. Here's a typical one.

      #00  pc 0x000000000004e1dc  /apex/com.android.runtime/lib64/bionic/libc.so (syscall+28)
      #01  pc 0x00000000000529b8  /apex/com.android.runtime/lib64/bionic/libc.so (__futex_wait_ex(void volatile*, bool, int, bool, timespec const*)+144)
      #02  pc 0x00000000000b5ac4  /apex/com.android.runtime/lib64/bionic/libc.so (pthread_cond_wait+76)
      #03  pc 0x0000000000436690  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libQt6Core_arm64-v8a.so
      #04  pc 0x000000000043662c  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libQt6Core_arm64-v8a.so (QWaitCondition::wait(QMutex*, QDeadlineTimer)+52)
      #05  pc 0x00000000005133a8  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libQt6Quick_arm64-v8a.so
      #06  pc 0x0000000000512e40  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libQt6Quick_arm64-v8a.so
      #07  pc 0x0000000000512b68  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libQt6Quick_arm64-v8a.so
      #08  pc 0x000000000038baf8  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libQt6Gui_arm64-v8a.so (QWindow::event(QEvent*)+720)
      #09  pc 0x00000000003cee7c  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libQt6Quick_arm64-v8a.so (QQuickWindow::event(QEvent*)+2504)
      #10  pc 0x0000000000335bd0  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libQt6Core_arm64-v8a.so
      #11  pc 0x0000000000335b4c  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libQt6Core_arm64-v8a.so (QCoreApplication::notifyInternal2(QObject*, QEvent*)+176)
      #12  pc 0x000000000034f918  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libQt6Gui_arm64-v8a.so (QGuiApplicationPrivate::processExposeEvent(QWindowSystemInterfacePrivate::ExposeEvent*)+308)
      #13  pc 0x000000000034d348  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libQt6Gui_arm64-v8a.so (QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent*)+152)
      #14  pc 0x00000000003903f8  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libQt6Gui_arm64-v8a.so (QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>)+120)
      #15  pc 0x0000000000390250  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libQt6Gui_arm64-v8a.so (QWindowSystemInterface::flushWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>)+172)
      #16  pc 0x0000000000067808  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libplugins_platforms_qtforandroid_arm64-v8a.so
      #17  pc 0x000000000005e87c  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libplugins_platforms_qtforandroid_arm64-v8a.so
      #18  pc 0x000000000005f05c  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libplugins_platforms_qtforandroid_arm64-v8a.so
      #19  pc 0x000000000036aa88  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libQt6Core_arm64-v8a.so
      #20  pc 0x00000000003516a8  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libQt6Gui_arm64-v8a.so (QGuiApplication::applicationStateChanged(Qt::ApplicationState)+36)
      #21  pc 0x000000000034f2e0  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libQt6Gui_arm64-v8a.so (QGuiApplicationPrivate::setApplicationState(Qt::ApplicationState, bool)+140)
      #22  pc 0x000000000034d3b8  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libQt6Gui_arm64-v8a.so (QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent*)+264)
      #23  pc 0x00000000003903f8  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libQt6Gui_arm64-v8a.so (QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>)+120)
      #24  pc 0x00000000005debe4  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libQt6Gui_arm64-v8a.so (QUnixEventDispatcherQPA::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)+32)
      #25  pc 0x000000000004e428  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libplugins_platforms_qtforandroid_arm64-v8a.so
      #26  pc 0x000000000033ca8c  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libQt6Core_arm64-v8a.so (QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>)+332)
      #27  pc 0x00000000003360c4  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libQt6Core_arm64-v8a.so (QCoreApplication::exec()+136)
      #28  pc 0x0000000000426660  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libMMfA_arm64-v8a.so (main+1764)
      #29  pc 0x00000000000444a0  /data/app/~~ABusX6UujVHgfORfwFkH8A==/com.memorymap.mmfa-XU5ReIfOgsoQipxAgj_9MQ==/lib/arm64/libplugins_platforms_qtforandroid_arm64-v8a.so
      at org.qtproject.qt.android.QtNative.startQtApplication (Native method)
      at org.qtproject.qt.android.QtNative$7.run (QtNative.java:622)
      at org.qtproject.qt.android.QtThread$1.run (QtThread.java:25)
      at java.lang.Thread.run (Thread.java:1012)
    

    Other threads seem to be in the normal "ready" state. None the threads are executing my code (linked into libMMfA_arm64-v8a.so) except for main calling QCoreApplication::exec(). That doesn't exonerate my code, but it makes it hard to debug!

    I wonder if anyone else is seeing this ANR? Any hints on how to fix it or avoid it?

    What is org.qtproject.qt.android.accessibility.QtAccessibilityDelegate? Is this only invoked if the user has selected a screen reader or something like that, or is it run all the time? Any insight would be greatly appreciated.

    1 Reply Last reply
    0
    • B Offline
      B Offline
      bee65
      wrote on last edited by
      #2

      Looking at the Qt source code, the problem is in plugins/platforms/android/androidjniaccessibility.cpp,

          template <typename Func, typename Ret>
          void runInObjectContext(QObject *context, Func &&func, Ret *retVal)
          {
              if (!QtAndroid::blockEventLoopsWhenSuspended()
                  || QGuiApplication::applicationState() != Qt::ApplicationSuspended) {
                  QMetaObject::invokeMethod(context, func, Qt::BlockingQueuedConnection, retVal);
              } else {
                  __android_log_print(ANDROID_LOG_WARN, m_qtTag,
                                      "Could not run accessibility call in object context, event loop suspended.");
              }
          }
      

      There could also be a race condition in the applicationState tests. But in my app I have <meta-data android:name="android.app.background_running" android:value="true"/> so I don't think the applicationState matters in my case.

      In any case, it is blocking the Android main thread to run code on a QObject's thread. There must be other places where the Qt threads block waiting for the Android main thread, causing deadlock.

      I will submit this as a bug report.

      1 Reply Last reply
      0
      • D Offline
        D Offline
        Dmitriano
        wrote on last edited by Dmitriano
        #3

        I also have an ANR in my app at QMetaObject::invokeMethodImpl with the following stack trace:

        Thread "main" tid=1 Native
        
          #00  pc 0x000000000001edac  /system/lib64/libc.so (syscall+28)
          #01  pc 0x0000000000429318  /data/app/net.geographx.LinesGame-go3lICl-TceQVuAnsbM5xw==/lib/arm64/libQt6Core_arm64-v8a.so
          #02  pc 0x000000000042aa24  /data/app/net.geographx.LinesGame-go3lICl-TceQVuAnsbM5xw==/lib/arm64/libQt6Core_arm64-v8a.so
          #03  pc 0x000000000042a710  /data/app/net.geographx.LinesGame-go3lICl-TceQVuAnsbM5xw==/lib/arm64/libQt6Core_arm64-v8a.so
          #04  pc 0x000000000033abcc  /data/app/net.geographx.LinesGame-go3lICl-TceQVuAnsbM5xw==/lib/arm64/libQt6Core_arm64-v8a.so (QMetaObject::invokeMethodImpl(QObject*, QtPrivate::QSlotObjectBase*, Qt::ConnectionType, void*)+296)
          #05  pc 0x000000000003b8a4  /data/app/net.geographx.LinesGame-go3lICl-TceQVuAnsbM5xw==/lib/arm64/libplugins_platforms_qtforandroid_arm64-v8a.so
          at org.qtproject.qt.android.accessibility.QtNativeAccessibility.childIdListForAccessibleObject (Native method)
          at org.qtproject.qt.android.accessibility.QtAccessibilityDelegate.getNodeForView (QtAccessibilityDelegate.java:354)
          at org.qtproject.qt.android.accessibility.QtAccessibilityDelegate.access$700 (QtAccessibilityDelegate.java:31)
          at org.qtproject.qt.android.accessibility.QtAccessibilityDelegate$1.createAccessibilityNodeInfo (QtAccessibilityDelegate.java:438)
          at android.view.ViewRootImpl.handleWindowContentChangedEvent (ViewRootImpl.java:8686)
          at android.view.ViewRootImpl.requestSendAccessibilityEvent (ViewRootImpl.java:8616)
          at android.view.ViewGroup.requestSendAccessibilityEvent (ViewGroup.java:1060)
          at android.view.ViewGroup.requestSendAccessibilityEvent (ViewGroup.java:1060)
          at android.view.ViewGroup.requestSendAccessibilityEvent (ViewGroup.java:1060)
          at android.view.View.sendAccessibilityEventUncheckedInternal (View.java:7574)
          at android.view.View.sendAccessibilityEventUnchecked (View.java:7546)
          at android.view.ViewRootImpl$SendWindowContentChangedAccessibilityEvent.run (ViewRootImpl.java:9528)
          at android.view.ViewRootImpl$SendWindowContentChangedAccessibilityEvent.removeCallbacksAndRun (ViewRootImpl.java:9583)
          at android.view.ViewRootImpl.requestSendAccessibilityEvent (ViewRootImpl.java:8578)
          at android.view.View.sendAccessibilityEventUncheckedInternal (View.java:7574)
          at android.view.View.sendAccessibilityEventUnchecked (View.java:7546)
          at android.view.View.sendAccessibilityEventInternal (View.java:7523)
          at android.view.View.sendAccessibilityEvent (View.java:7490)
          at com.android.internal.policy.DecorView.sendAccessibilityEvent (DecorView.java:679)
          at android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:2971)
          at android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1804)
          at android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:8218)
          at android.view.Choreographer$CallbackRecord.run (Choreographer.java:1047)
          at android.view.Choreographer.doCallbacks (Choreographer.java:859)
          at android.view.Choreographer.doFrame (Choreographer.java:791)
          at android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:1033)
          at android.os.Handler.handleCallback (Handler.java:873)
          at android.os.Handler.dispatchMessage (Handler.java:99)
          at android.os.Looper.loop (Looper.java:233)
          at android.app.ActivityThread.main (ActivityThread.java:7212)
          at java.lang.reflect.Method.invoke (Native method)
          at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:499)
          at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:965)
        
        1 Reply Last reply
        0
        • B Offline
          B Offline
          bee65
          wrote on last edited by
          #4

          Looks like the same issue.

          I am rolling out an update that adds
          qputenv("QT_ANDROID_DISABLE_ACCESSIBILITY", "1");
          in my app's main function before the construction of the QGuiApplication. I will know in a month or so whether this avoids the problem.

          See https://bugreports.qt.io/browse/QTBUG-102168

          1 Reply Last reply
          1
          • B Offline
            B Offline
            bee65
            wrote on last edited by
            #5

            @bee65 said in Android ANR Deadlock in QtAccessibilityDelegate:

            Looks like the same issue.

            I am rolling out an update that adds
            qputenv("QT_ANDROID_DISABLE_ACCESSIBILITY", "1");
            in my app's main function before the construction of the QGuiApplication. I will know in a month or so whether this avoids the problem.

            See https://bugreports.qt.io/browse/QTBUG-102168

            So far, I have had zero ANRs in the new update with this change, rolled out to about 3000 users.

            A 1 Reply Last reply
            1
            • B bee65

              @bee65 said in Android ANR Deadlock in QtAccessibilityDelegate:

              Looks like the same issue.

              I am rolling out an update that adds
              qputenv("QT_ANDROID_DISABLE_ACCESSIBILITY", "1");
              in my app's main function before the construction of the QGuiApplication. I will know in a month or so whether this avoids the problem.

              See https://bugreports.qt.io/browse/QTBUG-102168

              So far, I have had zero ANRs in the new update with this change, rolled out to about 3000 users.

              A Offline
              A Offline
              albertoromero
              wrote on last edited by
              #6

              I can confirm this issue.
              Will try @beamide solution and post back in some weeks.

              1 Reply Last reply
              0
              • T Offline
                T Offline
                thomaso
                wrote on last edited by
                #7

                Hi guys, did the environment variable help you to get rid of these ANRs? Didn't it backfire somewhere else?

                1 Reply Last reply
                0

                • Login

                • Login or register to search.
                • First post
                  Last post
                0
                • Categories
                • Recent
                • Tags
                • Popular
                • Users
                • Groups
                • Search
                • Get Qt Extensions
                • Unsolved