【问题标题】:Android TargetSDK 30 package visibility restrictions don't apply to "com.google.android.gms"?Android TargetSDK 30 包可见性限制不适用于“com.google.android.gms”?
【发布时间】:2021-11-17 12:23:49
【问题描述】:

我正在将我的 Android 应用迁移为兼容 TargetSDK 30。 对此的限制\更改之一是包可见性限制: 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

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

但是我看到为 gms packageId 调用这个函数:即

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

我不需要在 &lt;queries&gt; 中声明它作为清单的一部分!!尽管应用程序已迁移到 targetSdk = 30 并在 Android-11/Android-12 设备上运行,但这些函数仍返回正确的值。

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

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

【问题讨论】:

    标签: android android-12 target-sdk google.android.gms


    【解决方案1】:

    包可见性过滤将包可见性降至最低,但并没有完全消除它。大多数应用程序都需要显式声明,但有些包已经可用,无需任何声明。

    您可以使用以下工具找到设备上可用软件包的完整列表

    adb shell dumpsys package queries
    

    摘自官方文档

    有些包仍然是visible automatically。您的应用程序始终可以在其对其他已安装应用程序的查询中看到这些包。要查看其他包,请使用 &lt;queries&gt; 元素声明您的应用需要增加包的可见性。

    自动可见的应用类型

    以下类型的应用始终对您的应用可见,即使您的应用面向 Android 11(API 级别 30)或更高版本:

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

    【讨论】:

      猜你喜欢
      • 2021-07-10
      • 2022-09-27
      • 1970-01-01
      • 2012-05-30
      • 2016-06-18
      • 1970-01-01
      • 2015-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多