android - Android TargetSDK 30 包可见性限制不适用于“com.google.android.gms”?
问题描述
我正在迁移我的 Android 应用程序以符合 TargetSDK 30。对此的限制\更改之一是包可见性限制: https ://developer.android.com/about/versions/11/privacy/package-visibility
谷歌要求应用程序在清单中声明查询元素,如下所示:
<queries>
<!-- Specific apps you interact with, eg: -->
<package android:name="packageid" />
没有这个条目,函数调用就像
context.getPackageManager.getApplicationInfo("packageid",0);
将导致一个NameNotFouncException
.
我已经验证这对于我明确查询的大多数应用程序都是正确的,包括谷歌地图应用程序,并将这些应用程序的包 ID 添加到清单可以解决问题。
但是我看到为 gms packageId 调用此函数:即
context.getPackageManager.getApplicationInfo("com.google.android.gms",0)
我不需要<queries>
在清单中声明它!尽管应用程序已迁移到 targetSdk = 30 并在 Android-11/Android-12 设备上运行,但这些函数仍返回正确的值。
我认为一些android库通过清单合并自动注入<queries>
for ,但是反编译清单显示没有这样的条目。com.google.android.gms
我很想知道为什么这个包从 tarsget30 SDK 包可见性限制中被跳过,以及是否还有其他这样的包。这是错误还是未记录的功能?
解决方案
包可见性过滤将包可见性最小化,它并没有完全消除它。大多数应用程序都需要显式声明,但有些包已经可用,无需任何声明。
您可以使用以下方式找到设备上可用软件包的完整列表
adb shell dumpsys package queries
摘自官方文档
有些包仍然是自动可见的。您的应用程序始终可以在其对其他已安装应用程序的查询中看到这些包。要查看其他包,请声明您的应用需要使用该
<queries>
元素来增加包的可见性。
自动可见的应用类型
即使您的应用面向 Android 11(API 级别 30)或更高版本,以下类型的应用始终对您的应用可见:
- 您自己的应用程序。
- 实现核心 Android 功能的某些系统包,例如媒体提供程序。
- 安装您的应用的应用。
- 任何使用该方法在您的应用中启动 Activity 的应用
startActivityForResult()
,如指南中有关如何从 Activity 获取结果中所述。 - 在您的应用中启动或绑定到服务的任何应用。
- 在您的应用程序中访问内容提供程序的任何应用程序。
- 任何具有内容提供者的应用,您的应用已被授予访问该内容提供者的 URI 权限。
- 从您的应用接收输入的任何应用。这种情况仅适用于您的应用作为输入法编辑器提供输入的情况。
推荐阅读
- java - 用 3 种颜色为三角形着色
- python - Django rest 框架,作为选项或文本的字段
- docker-compose - Azure Pipelines 的任务 DockerCompose 中的锁定服务实际上是做什么的?
- python - 使用 Pynput 构建键盘记录器(将其保存到记事本)
- php - followbutton Vue 按钮在网站上不可见
- html - 表格可滚动时无法修复标题
- android - 我访问了下载文件夹,但我无法访问 android 上下载文件夹中的文件
- php - 带有数据库下拉菜单的 PHP 开关
- sql - 如何将基于行的上一个和下一个记录数据插入到 MS Access 时间序列数据中?
- android - 为什么Android强制使用screenOrientation fullSensor?