手机厂商的应用列表权限管控真的起效了吗
本文最后更新于:2025年5月11日 晚上
昨天使用做你的图标包制作图标包的时候发现我并没有授予它获取应用列表的权限,但是依然可以获取到我安装的应用列表。

然后发现它的 targetSDK 是 33 并申请了<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
权限和使用了如下代码:
1 |
|

正常拿到了我手机上的设备应用安装列表并且权限监控里面没有看到记录。这是怎么回事?
实验
通过下面的代码进行实验
1 |
|
在禁止应用列表权限情况下测试
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
1 |
|
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,比如微信就是这么干的。所以厂商的这个应用列表管控能起到的作用可能不大。
1 |
|

原因
一般来说,这些权限都是通过 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 更改了应用查询用户已在设备上安装的其他应用以及与之交互的方式。使用
如果您的应用以 Android 11 或更高版本为目标平台,您可能需要在应用的清单文件中添加
兼容性影响
- 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引入了“包可见性”限制,默认情况下应用 - 掘金