Android应用集成MSAL频繁触发Input dispatching timedout ANR问题求助
针对你遇到的主线程因锁阻塞导致的Input dispatching timedout ANR问题,结合堆栈信息和Android 13的特性,给出以下具体解决方向:
强制MSAL核心逻辑移至后台线程
即使登录流程已在子线程执行,AzureActiveDirectory.setEnvironment这类核心配置操作可能仍被触发到主线程。直接将该方法调用包裹在IO线程中执行,避免主线程参与锁竞争:// Kotlin示例:用Coroutine IO线程执行环境配置 CoroutineScope(Dispatchers.IO).launch { AzureActiveDirectory.setEnvironment(yourEnvironmentConfig) }// Java示例:用后台线程执行环境配置 new Thread(() -> AzureActiveDirectory.setEnvironment(yourEnvironmentConfig)) .setPriority(Process.THREAD_PRIORITY_BACKGROUND) .start();禁用不必要的ADAL自动迁移
如果应用已完成ADAL到MSAL的迁移,无遗留ADAL用户数据,可在MSAL的auth_config.json中添加配置禁用自动迁移,减少锁持有时间:{ "client_id": "your_client_id", "enable_adal_migration": false }提前预加载MSAL环境配置
在应用启动阶段(如Application.onCreate())用后台线程完成云发现、环境初始化等操作,避免登录时才触发这些耗时逻辑。这样登录流程执行时,锁资源已释放,不会阻塞主线程。适配Android 13线程调度规则
Android 13对主线程超时检测更严格,且后台线程优先级调度有变化。为MSAL相关后台线程设置THREAD_PRIORITY_BACKGROUND优先级,避免系统限制导致网络IO线程执行过慢、锁持有时间过长。统一MSAL初始化入口
检查是否存在多处同时调用MSAL环境配置方法的情况,通过单例模式封装MSAL初始化逻辑,确保同一时间只有一个线程执行环境配置操作,从根源减少锁竞争。尝试升级MSAL至更高版本
尽管当前使用4.9.0版本,后续MSAL版本可能已修复锁竞争相关的bug。可查看MSAL发布日志,验证4.10.0及之后版本是否有针对Android 13和锁阻塞的修复内容。
内容的提问来源于stack exchange,提问作者BitCloud27

