手机厂商的应用列表权限管控真的起效了吗 - Wesley’s Blog
昨天使用做你的图标包制作图标包的时候发现我并没有授予它获取应用列表的权限,但是依然可以获取到我安装的应用列表。
然后发现它的 targetSDK 是 33 并申请了<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>权限和使用了如下代码:
PackageManager packageManager = context2.getPackageManager();
Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
List<ResolveInfo> queryIntentActivities = packageManager.queryIntentActivities(intent, 0);
正常拿到了我手机上的设备应用安装列表并且权限监控里面没有看到记录。这是怎么回事?
实验
通过下面的代码进行实验
private fun getInstalledPackages(context: Context): List<String> {
val installedPackageList: MutableList<String> = ArrayList()
val installedPackageInfoList = context.packageManager.getInstalledPackages(PackageManager.MATCH_UNINSTALLED_PACKAGES)
for (packageInfo in installedPackageInfoList) {
installedPackageList.add(packageInfo.packageName)
}
Log.e(TAG, "getInstalledPackages: size:${installedPackageList.size} pkg:$installedPackageList")
return installedPackageList
}
//获取所有带有桌面属性的APK
private fun getAllLauncherIconPackages(context: Context): List<String> {
val launcherIconPackageList: MutableList<String> = ArrayList()
val intent = Intent()
intent.setAction(Intent.ACTION_MAIN)
intent.addCategory(Intent.CATEGORY_LAUNCHER)
val resolveInfos = context.packageManager.queryIntentActivities(intent, PackageManager.MATCH_ALL)
for (info in resolveInfos) {
launcherIconPackageList.add(info.activityInfo.packageName)
}
Log.e(TAG, "getAllLauncherIconPackages: size:${launcherIconPackageList.size} pkg:$launcherIconPackageList")
return launcherIconPackageList
}
在禁止应用列表权限情况下测试
Oppo find8u Xiaomi13 都是安卓 15
情况1 不申请QUERY_ALL_PACKAGES
oppo
PermissionInjector: Permission denied: uid: 10445 or pid: 14074 have no permission: com.android.permission.GET_INSTALLED_APPS to access: get_installed
ApplicationPackageManagerExtImpl: com.example.myapplication in userId=0 doesn’t have GET_INSTALLED_APPS perm, return self!
getInstalledPackages: size:1 pkg:[com.example.myapplication]
getAllLauncherIconPackages: size:8 pkg:[com.android.settings, com.android.vending, com.coloros.gallery3d, com.oplus.camera, com.android.documentsui, com.android.stk, com.android.stk, com.example.myapplication]
xiaomi
MIUILOG- Permission Denied getInstalledPackages. pkg : com.example.myapplication uid : 10236
getInstalledPackages: size:1 pkg:[com.example.myapplication]
getAllLauncherIconPackages: size:13 pkg:[com.android.browser, com.android.camera, com.android.fileexplorer, com.android.settings, com.android.thememanager, com.android.vending, com.miui.miservice, com.xiaomi.market, com.miui.notes, com.miui.securitycenter, com.miui.voiceassist, com.example.myapplication, com.miui.huanji]
getInstalledPackages 只能获取到自己的应用,且会被权限监控记录,queryIntentActivities 可以获取部分系统应用
情况2 申请QUERY_ALL_PACKAGES
oppo
getInstalledPackages: size:1 pkg:[com.example.myapplication]
getAllLauncherIconPackages: size:155 pkg:[com.android.contacts…
xiaomi
getInstalledPackages: size:1 pkg:[com.example.myapplication]
getAllLauncherIconPackages: size:279 pkg:[com.android.browser, com.android.camera, com.android.contacts…
getInstalledPackages 只能获取到自己的应用,且会被权限监控记录,queryIntentActivities 可以获取所有带有桌面属性的应用
情况3 不申请QUERY_ALL_PACKAGES但声明queries
<queries>
<intent>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent>
</queries>
oppo
getInstalledPackages: size:1 pkg:[com.example.myapplication]
getAllLauncherIconPackages: size:155 pkg:[com.android.contacts,…
xiaomi
getInstalledPackages: size:1 pkg:[com.example.myapplication]
getAllLauncherIconPackages: size:279 pkg:[com.android.browser…
getInstalledPackages 只能获取到自己的应用,且会被权限监控记录,queryIntentActivities 可以获取所有带有桌面属性的应用
现状
还是很多应用申请了QUERY_ALL_PACKAGES 权限的,意味着很容易收集手机里面的安装列表。或者不申请QUERY_ALL_PACKAGES,直接声明queries,比如微信就是这么干的。所以厂商的这个应用列表管控能起到的作用可能不大。
<intent>
<action
android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent>
原因
一般来说,这些权限都是通过 AppOps管控的,当初安卓 6 加入运行时权限时,对于那些没有适配运行时权限的应用,就是通过AppOps管控的。
oppo
OP5DD3L1:/ $ appops get com.example.myapplication
GET_INSTALLED_APPS: ignore
xiaomi
fuxi:/ $ appops get com.example.myapplication
MIUIOP(10022): ignore; time=+7h1m54s781ms ago; rejectTime=+32m9s128ms ago
public static final int OP_GET_INSTALLED_APPS = 10022;
他们都是只针对getInstalledPackages 权限做管控。有兴趣的可以 pull 手机里面的 framework 和 service jar 包来看一下他们的源代码。
包可见性
背景
Google官网特性介绍:
https://developer.android.google.cn/preview/privacy/package-visibility
Android 11 更改了应用查询用户已在设备上安装的其他应用以及与之交互的方式。使用 元素,应用可以定义一组自身可访问的其他软件包。通过告知系统应向您的应用显示哪些其他软件包,此元素有助于鼓励最小权限原则。此外,此元素还可帮助 Google Play 等应用商店评估应用为用户提供的隐私权和安全性。
如果您的应用以 Android 11 或更高版本为目标平台,您可能需要在应用的清单文件中添加 元素。在 元素中,您可以按软件包名称、intent 签名或提供程序授权指定软件包。
兼容性影响
- SDK接口行为变更
app默认不再能通过SDK接口获取其他app的信息,例如:
getPackageInfo(getPackageName(), 0) 仍能正常返回应用自身的PackageInfo,但getPackageInfo(“com.another.app”,0)将抛出NameNotFoundException,即使com.another.app已经被安装到设备上。getInstalledPackages(0),只能返回应用自身,以及少数的核心AOSP应用的信息。
- 其他变更
app不能感知/data/data/com.another.app等目录的存在。即使com.another.app已经被安装到设备上,app尝试访问/data/data/com.another.app也将提示“File not found”,而不是“Permission denied”。
类似的目录还有/data/misc/profiles/cur/${userId}/com.another.app。此变更,可以防止app通过访问目录文件返回的错误不同,来判断特定app是否已被安装。
参考
Android 上的软件包可见性过滤 | App architecture | Android Developers
了解自动可见的软件包 | App architecture | Android Developers
声明软件包可见性需求 | App architecture | Android Developers
测试软件包可见性行为 | App architecture | Android Developers
应用TargetSdkVersion 30升级适配指南 | 小米澎湃OS开发者平台
Android 11 适配 软件包可见性 | Gddhy’s Blog
绕过 Android11新特性之 “包的可见性“-Android安全-看雪-安全社区|安全招聘|kanxue.com
Android11“包可见性”—动态修改queries方案Android 11引入了“包可见性”限制,默认情况下应用 - 掘金
292

被折叠的 条评论
为什么被折叠?



