Android TargetSDK 30 包可见性限制不适用于 "com.google.android.gms"?

Android TargetSDK 30 package visibility restrictions don't apply to "com.google.android.gms"?

我正在迁移我的 Android 应用程序以兼容 TargetSDK 30。 limitations\changes 之一是包可见性限制: https://developer.android.com/about/versions/11/privacy/package-visibility

和 google 要求应用程序在清单中声明查询元素,如下所示:

<queries>
<!-- Specific apps you interact with, eg: -->
<package android:name="packageid" />

没有这个条目,函数调用就像

context.getPackageManager.getApplicationInfo("packageid",0);

将导致 NameNotFouncException

我已经验证对于我明确查询的大多数应用程序都是如此,包括 google 地图应用程序并将这些应用程序的包 ID 添加到清单中解决了问题。

但是我看到为 gms packageId 调用此函数:viz

context.getPackageManager.getApplicationInfo("com.google.android.gms",0)

我不需要在 <queries> 中将其声明为清单的一部分!!尽管应用程序已迁移到 Android-11/Android-12 设备上的 targetSdk = 30 和 运行,但函数返回了正确的值。

我认为某些 android 库会通过清单合并为 com.google.android.gms 自动注入 <queries>,但反编译清单显示没有此类条目。

我很想知道为什么这个包从 tarsget30 SDK 包可见性限制中被跳过,以及是否还有其他此类包。这是错误还是未记录的功能?

包可见性过滤最小化包可见性,它并没有完全消除它。大多数应用程序都需要显式声明,但有些软件包无需任何声明即可使用。

您可以使用

找到设备上可用软件包的完整列表
adb shell dumpsys package queries

官方文档摘录

Some packages are still visible automatically. Your app can always see these packages in its queries for other installed apps. To view other packages, declare your app's need for increased package visibility using the <queries> element.

自动可见的应用类型

您的应用始终可以看到以下类型的应用,即使您的应用面向 Android11(API 级别 30)或更高:

  • 您自己的应用程序。
  • 实现核心 Android 功能的某些系统包,例如媒体提供程序。
  • 安装您应用的应用。
  • 任何使用 startActivityForResult() 方法在您的应用中启动 activity 的应用,如有关如何从 activity.[=33= 获取结果的指南中所述]
  • 在您的应用中启动或绑定服务的任何应用。
  • 在您的应用中访问内容提供程序的任何应用。
  • 具有内容提供者的任何应用程序,您的应用程序已被授予访问该内容提供者的 URI 权限。
  • 从您的应用程序接收输入的任何应用程序。这种情况仅适用于您的应用将输入作为输入法编辑器提供的情况。