>最近我看到Firebase Crashlytic报告的错误增加,
如下所示Caused by java.lang.SecurityException: uid 10172 cannot explicitly add accounts of type: com.mypackage.account
at android.os.Parcel.createException(Parcel.java:2087)
at android.os.Parcel.readException(Parcel.java:2055)
at android.os.Parcel.readException(Parcel.java:2003)
at android.accounts.IAccountManager$Stub$Proxy.addAccountExplicitly(IAccountManager.java:1660)
at android.accounts.AccountManager.addAccountExplicitly(AccountManager.java:889)
它被触发自
accountManager.addAccountExplicitly(defaultAccount, null, null)
根据Firebase Crashlytic报告,它只发生在Android 9和10以及三星,Realme和OPPO设备上。
就我而言,我尝试在Android P和Android 10设备上复制,并且代码被触发没有问题。
我通过StackOverflow进行了搜索,例如
Android应用程序在 addAccountExplicit (account, password, null( 上崩溃;, Android SecurityException: uid xxxxx 无法显式添加帐户、https://stackoverflow.com/a/58591203/3286489、https://stackoverflow.com/a/37348909/3286489、https://stackoverflow.com/a/16972048/3286489 和 Android 使用帐户管理器添加帐户。
它们是针对可复制的问题,因此对我来说没有用。
我检查也发现像
https://github.com/signalapp/Signal-Android/issues/9311 (安卓 10( https://github.com/signalapp/Signal-Android/issues/9296 (安卓 9 - 派? https://github.com/signalapp/Signal-Android/issues/9349(另一个Android 10,在One Plus上(
要么从 Android P 开始,我们需要更改代码的更多安全更新,要么 Android P 和 10 有一些与此问题相关的错误?最近有人遇到过这个问题吗?
我敢打赌你在错误的地方打电话给addAccountExplicitly
。
根据Google文档的AccountManager.addAccountExplicitly:
将帐户直接添加到客户管理器。通常由与身份验证器关联的注册向导使用,而不是直接由应用程序使用。
和
此方法要求调用方与拥有指定帐户的身份验证器具有签名匹配项。
当你的应用调用AccountManager.addAccount
时,你会要求身份验证器及其关联的活动向设备上的帐户添加条目。 帐户管理器调用身份验证器来处理此请求。 身份验证器/活动对用户进行身份验证后,它将调用addAccountExplictly
来完成请求的任务。 意义。
请记住,调用帐户管理器的活动和身份验证器/活动位于不同的进程中。
再看一下措辞:"通常使用...不是直接通过应用程序"。
听起来谷歌允许一些关于身份验证器是否可以调用addAccountExplicitly
的应用程序组件的回旋余地,并表示只要存在签名匹配,该组件就可以调用该方法。
我认为三星在最新版本中为加强安全性所做的是仅将签名应用于具有身份验证器组件的进程,而不是应用于具有应用程序活动的进程。
我得出结论的原因是,我们的应用程序在身份验证器活动和非身份验证器活动(即"LoginActivity"(中调用addAccountExplicitly
,具体取决于应用程序启动流程;我们仅从非身份验证器活动收到像您这样的崩溃报告。 此后,我重新设计了该应用程序,使其仅从身份验证器活动中调用addAccountExplicitly
。
您的应用程序应始终要求 AccountManager 使用您的身份验证器来添加使用addAccount
的帐户,并遵从身份验证器以调用addAccountExplicitly
。
有关更多信息,请参阅我对有关客户经理的一般问题的回答:https://stackoverflow.com/a/37348909/4504191
附言因为我对服务、绑定、Android 中的 IPC、进程边界的使用等内容了解不完全。我可能没有准确解释签名匹配。 随意在评论中编辑或建议编辑。 每天我都会学到一些关于这项技术的新知识。