Android应用使用MSAL库多设备出现Service not registered崩溃
MSAL Android CustomTabs服务未注册崩溃修复方案
问题说明
触发崩溃的核心原因是MSAL内部CustomTabsManager在执行解绑服务操作时,对应的CustomTabs服务已经被浏览器进程/系统回收,此时调用unbindService就会抛出IllegalArgumentException,这是MSAL旧版本公共依赖库的已知缺陷。你所列出的多为预装定制浏览器、系统资源管控严格的机型,更容易触发CustomTabs服务提前销毁的场景,加上你指定了用户代理为BROWSER,无法切换WEBVIEW规避,所以会集中出现该崩溃。
修复方案
- 优先升级MSAL依赖到最新稳定版本,该异常在
com.microsoft.identity:common库3.6.0及以上版本已经官方修复,内部解绑逻辑增加了服务绑定状态的校验,不会重复调用解绑接口触发崩溃。如果当前项目无法直接升级大版本,可以通过反射拦截CustomTabsManager的unbind方法,手动捕获IllegalArgumentException异常直接吞掉即可,该异常不影响授权流程的正常结束,也不会带来功能副作用。 - 补充完善MSAL配置中的浏览器安全名单,你当前仅配置了小米国际版浏览器,建议将Chrome、Edge、三星内置浏览器、OPPO/VIVO内置浏览器等主流支持CustomTabs的浏览器包名和签名哈希全部加入白名单,避免MSAL调用不兼容CustomTabs的浏览器导致服务绑定异常。
- 检查授权页Activity的启动模式,不要配置为
singleInstance,该启动模式会导致LocalBroadcast接收时序异常,提前触发授权完成逻辑,在CustomTabs服务还未完成绑定时就调用解绑操作,也会触发该崩溃。
附错误日志&配置参考
崩溃日志
Fatal Exception: java.lang.IllegalArgumentException: Service not registered: com.microsoft.identity.common.internal.ui.browser.CustomTabsManager$1@4af7a6e at android.app.LoadedApk.forgetServiceDispatcher(LoadedApk.java:1160) at android.app.ContextImpl.unbindService(ContextImpl.java:1475) at android.content.ContextWrapper.unbindService(ContextWrapper.java:644) at com.microsoft.identity.common.internal.ui.browser.CustomTabsManager.unbind(CustomTabsManager.java:164) at com.microsoft.identity.common.internal.ui.browser.BrowserAuthorizationStrategy.dispose(BrowserAuthorizationStrategy.java:182) at com.microsoft.identity.common.internal.ui.browser.BrowserAuthorizationStrategy.completeAuthorization(BrowserAuthorizationStrategy.java:157) at com.microsoft.identity.common.internal.controllers.LocalMSALController.completeAcquireToken(LocalMSALController.java:258) at com.microsoft.identity.common.internal.commands.InteractiveTokenCommand.notify(InteractiveTokenCommand.java:77) at com.microsoft.identity.common.internal.controllers.CommandDispatcher.completeInteractive(CommandDispatcher.java:608) at com.microsoft.identity.common.internal.controllers.CommandDispatcher.access$1100(CommandDispatcher.java:83) at com.microsoft.identity.common.internal.controllers.CommandDispatcher$4$1.onReceive(CommandDispatcher.java:565) at androidx.localbroadcastmanager.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:313) at androidx.localbroadcastmanager.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:121) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:7325) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
原有配置文件
{ "client_id": "client_id", "authorization_user_agent": "BROWSER", "account_mode": "MULTIPLE", "redirect_uri": "redirect_uri", "authorities": [ { "type": "B2C", "authority_url": "authority_url", "default": true }, { "type": "B2C", "authority_url": "authority_url" } ], "browser_safelist": [ { "browser_package_name": "com.mi.globalbrowser", "browser_signature_hashes": [ "g7zGEnZipieE6ZyBA4Bz00kxU8h0F9QTwPLL-dnRVwngI0FJWJiD3rCEJsIQ_VK064SNdxzqggnnnAqT8LI89A==" ] } ] }
内容的提问来源于stack exchange,提问作者Marcelo Esser
相关产品推荐
相关产品推荐

