解决SharedUserId导致的SecurityException
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决SharedUserId导致的SecurityException相关的知识,希望对你有一定的参考价值。
参考技术A 解决SharedUserId导致的SecurityException收到一个谷歌报的异常:
是在显示notification的时候报错的。看意思是当前的包不属于当前的packageId,就很有意思。
因为我们是在原来的包的基础上搞了一个马甲包出来,而我们原来的包使用了SharedUserId,这个玩意儿就很坑,当初不知道为什么引进来的。
关于SharedUserId
具android developer官网的说法,这玩意会导致不确定性的行为,强烈建议不要使用它。
来追一下这个原因,按照调用栈来看,这种没有头绪的报错可以直接去找报错位置,然后反推出来
Package com.xxx.xxx does not belong to 10326 这个在 AppOpsManager.checkPackage ,调用者是 NotificationManagerService#isCallerInstantApp() ,我们在这里能发现一丝端倪:
这里使用了getPackagesForUid返回的package[]数组的第0个package,比较这两个是否相同,如果 mAppOps.checkPackage(callingUid, pkg) 传入的这两个参数不匹配的话就直接报错。
所以原因可能是 mPackageManager.getPackagesForUid(callingUid) 返回的包名有多个并且第1个不是自己的包名
所以尝试自己获取比较,如果第0个返回的不是自己的包名,而是其他的包名的话则不去显示Notification。
使用 shareduserid 的安全性
【中文标题】使用 shareduserid 的安全性【英文标题】:security in using shareduserid 【发布时间】:2016-04-20 05:55:22 【问题描述】:这听起来像是一个模糊的问题,但我不得不问。
我是一名初级 android 开发人员,刚刚了解了 android 中进程间通信的工作原理。 如果在 2 个应用程序中使用相同的 shareduserid,则它们有权访问彼此的数据,这意味着我可以反编译任何 apk,从清单中找出它的 shareduserid 并创建具有相同 shareduserid 的应用程序来访问其数据。
我错过了什么吗?
如果我想在未来创建 2 个应用程序(它们一起工作从而暴露 shareduserid),我应该如何保证我的数据安全?
【问题讨论】:
【参考方案1】:共享用户 ID 由证书签名强制执行。仅当应用程序使用相同的证书签名时,平台才会授予/分配相同的用户 ID。 Ref.:
android:sharedUserId
将与其他应用程序共享的 Linux 用户 ID 的名称。默认情况下,Android 会为每个应用程序分配其自己的唯一用户 ID。但是,如果此属性为两个或多个应用程序设置为相同的值,它们将共享相同的 ID — 只要它们也由相同的证书签名。具有相同用户 ID 的应用程序可以访问彼此的数据,并且如果需要,可以在同一进程中运行。
【讨论】:
以上是关于解决SharedUserId导致的SecurityException的主要内容,如果未能解决你的问题,请参考以下文章
SharedUserId 访问 SharedPreferences
如何在清单中分配 android:sharedUserId?