I currently have an app in the Play Store which integrates with the Microsoft Identity Platform to accept education account logins. It should be noted that, to implement authentication, the application uses the Microsoft Authentication Library for Android (MSAL).
Taking into account the above, the application works correctly on most Android devices, however, within the Google Play Console, in the ANR Bugs and Errors section, there is an ANR error that is repeated very frequently and is detailed next:
ANR details:
com.microsoft.identity.common.java.net.UrlConnectionHttpClient.executeHttpSend
Input dispatching timed out
Provided by:
Android vitals
Problem:
The main thread was blocked while trying to acquire a lock that was held by another thread
Recommendation:
Try to minimize the use of locks on the main thread and make sure that whatever holds these locks does not hold them for too long. Avoid costly and unpredictable operations, such as I/O or Binder calls, while retaining a lock.
Stack trace:
"main" tid=1 Blocked
at com.microsoft.identity.common.java.providers.microsoft.azureactivedirectory.AzureActiveDirectory.setEnvironment (AzureActiveDirectory.java)
at com.microsoft.identity.client.PublicClientApplication.initializeApplication (PublicClientApplication.java:1071)
at com.microsoft.identity.client.PublicClientApplication.<init> (PublicClientApplication.java:1062)
at com.microsoft.identity.client.SingleAccountPublicClientApplication.<init> (SingleAccountPublicClientApplication.java:104)
at com.microsoft.identity.client.PublicClientApplication$9.onTaskCompleted (PublicClientApplication.java:942)
at com.microsoft.identity.client.PublicClientApplication$9.onTaskCompleted (PublicClientApplication.java:930)
at com.microsoft.identity.common.java.controllers.CommandDispatcher.commandCallbackOnTaskCompleted (CommandDispatcher.java:649)
at com.microsoft.identity.common.java.controllers.CommandDispatcher.access$1000 (CommandDispatcher.java:99)
at com.microsoft.identity.common.java.controllers.CommandDispatcher$4.run (CommandDispatcher.java:625)
at android.os.Handler.handleCallback (Handler.java:938)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loop (Looper.java:237)
at android.app.ActivityThread.main (ActivityThread.java:8163)
at java.lang.reflect.Method.invoke (Native method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:656)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:972)
"pool-9-thread-1" tid=6 Native
#00 pc 0x00000000000d7b58 /apex/com.android.runtime/lib64/bionic/libc.so (__ppoll+8)
#01 pc 0x0000000000095b64 /apex/com.android.runtime/lib64/bionic/libc.so (poll+92)
#02 pc 0x0000000000029e6c /apex/com.android.art/lib64/libjavacore.so (Linux_poll(_JNIEnv*, _jobject*, _jobjectArray*, int)+552)
at libcore.io.Linux.poll (Native method)
at libcore.io.ForwardingOs.poll (ForwardingOs.java:168)
at libcore.io.BlockGuardOs.poll (BlockGuardOs.java:263)
at libcore.io.ForwardingOs.poll (ForwardingOs.java:168)
at libcore.io.IoBridge.isConnected (IoBridge.java:266)
at libcore.io.IoBridge.connectErrno (IoBridge.java:192)
at libcore.io.IoBridge.connect (IoBridge.java:134)
at java.net.PlainSocketImpl.socketConnect (PlainSocketImpl.java:142)
at java.net.AbstractPlainSocketImpl.doConnect (AbstractPlainSocketImpl.java:390)
at java.net.AbstractPlainSocketImpl.connectToAddress (AbstractPlainSocketImpl.java:230)
at java.net.AbstractPlainSocketImpl.connect (AbstractPlainSocketImpl.java:212)
at java.net.SocksSocketImpl.connect (SocksSocketImpl.java:436)
at java.net.Socket.connect (Socket.java:621)
at com.android.okhttp.internal.Platform.connectSocket (Platform.java:182)
at com.android.okhttp.internal.io.RealConnection.connectSocket (RealConnection.java:145)
at com.android.okhttp.internal.io.RealConnection.connect (RealConnection.java:116)
at com.android.okhttp.internal.http.StreamAllocation.findConnection (StreamAllocation.java:186)
at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection (StreamAllocation.java:128)
at com.android.okhttp.internal.http.StreamAllocation.newStream (StreamAllocation.java:97)
at com.android.okhttp.internal.http.HttpEngine.connect (HttpEngine.java:289)
at com.android.okhttp.internal.http.HttpEngine.sendRequest (HttpEngine.java:232)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute (HttpURLConnectionImpl.java:465)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse (HttpURLConnectionImpl.java:411)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream (HttpURLConnectionImpl.java:248)
at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream (DelegatingHttpsURLConnection.java:211)
at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream (HttpsURLConnectionImpl.java:30)
at com.microsoft.identity.common.java.net.UrlConnectionHttpClient.executeHttpSend (UrlConnectionHttpClient.java:342)
at com.microsoft.identity.common.java.net.UrlConnectionHttpClient.access$100 (UrlConnectionHttpClient.java:84)
at com.microsoft.identity.common.java.net.UrlConnectionHttpClient$4.call (UrlConnectionHttpClient.java:254)
at com.microsoft.identity.common.java.net.UrlConnectionHttpClient$4.call (UrlConnectionHttpClient.java:252)
at com.microsoft.identity.common.java.net.StatusCodeAndExceptionRetry.attempt (StatusCodeAndExceptionRetry.java:80)
at com.microsoft.identity.common.java.net.StatusCodeAndExceptionRetry.attempt (StatusCodeAndExceptionRetry.java:41)
at com.microsoft.identity.common.java.net.UrlConnectionHttpClient.method (UrlConnectionHttpClient.java:252)
at com.microsoft.identity.common.java.net.AbstractHttpClient.get (AbstractHttpClient.java:91)
at com.microsoft.identity.common.java.providers.microsoft.azureactivedirectory.AzureActiveDirectory.performCloudDiscovery (AzureActiveDirectory.java:193)
at com.microsoft.identity.common.internal.migration.AdalMigrationAdapter.loadCloudDiscoveryMetadata (AdalMigrationAdapter.java:241)
at com.microsoft.identity.common.internal.migration.AdalMigrationAdapter.adapt (AdalMigrationAdapter.java:120)
at com.microsoft.identity.common.internal.migration.TokenMigrationUtility$1.run (TokenMigrationUtility.java:66)
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:641)
at java.lang.Thread.run (Thread.java:923)
1.- I have carefully reviewed my source code and I use threads when logging in users, to prevent the main Android thread from having a lot of work.
2.- I am using the latest version of the Microsoft Authentication Library for Android.
Which is the following:
'com.microsoft.identity.client:msal:4.9.0'
As an extra piece of information, I have noticed that the ANR error occurs more frequently in Android 13, as shown in the following image:
I haven't been able to resolve this ANR error for quite some time now, so any advice or suggestions would be greatly appreciated.
Thank you so much.