关于android:重要变更-Android-11-中的软件包可见性

3次阅读

共计 2780 个字符,预计需要花费 7 分钟才能阅读完成。

在 Android 10 及之前的版本中,利用能够通过 queryIntentActivities() 这样的办法获取到设施中所有已装置的利用列表。在大多数状况下,这种拜访权限远超出了利用理论所须要的权限范畴。随着咱们不断加强对隐衷爱护的关注,咱们将在 Android 11 上引入一些新的变动,从而扭转利用查问用户已装置利用并与之交互的形式。为了达到这一目标,咱们为特定设施上所装置的利用列表带来了更好的访问控制。

为了更好地 “ 问责 ” 拜访已装置利用的行为,默认状况下,以 Android 11 为指标平台 (指标 API level 为 30) 的利用默认将只能检测到局部过滤后的已装置利用。如果想获取更多别的已装置利用列表信息,则须要在利用内的 Android manifest 中增加 <queries> 元素,从而拓宽拜访范畴。

在 大部分常见场景 下,包含任何以 startActivity() 启动的 intents,您不须要做任何改变。而 其余场景,比方从您利用的界面中间接关上某个特定的第三方利用,则须要开发者们显式地申明利用的包名或者 intent filter 签名,如下所示:

<manifest package="com.example.game">
  <queries>
   <!-- 申明所要进行交互的利用名 -->
    <package android:name="com.example.store" />
    <package android:name="com.example.service" />

    <!--
        申明要查问的 intents

        例如下列标签申明了一个自定义的分享视图的 intent
    -->

    <intent>
      <action android:name="android.intent.action.SEND" />
      <data android:mimeType="image/jpeg" />
    </intent>

  </queries>

  ...
  
</manifest>

如果您应用 Custom Tab 来关上 URL 链接,您兴许会调用 resolveActivity() 和 queryIntentActivities() 来启动一个非浏览器利用 (前提是您装置了解决该 URL 的利用)。在 Android 11 中,则有 更好的方法 来对此进行解决: 应用 intent 的 FLAG_ACTIVITY_REQUIRE_NON_BROWSER 标记,而不是去查问其余的利用。如果在您应用此标记调用 startActivity() 时启动了浏览器,则会抛出一个 ActivityNotFoundException 异样,此时您的利用能够对此异样进行解决,转而应用 Custom Tab 来关上 URL 链接。

try {val intent = Intent(ACTION_VIEW, Uri.parse(url)).apply {

    // 非浏览器利用会间接解决该 URL(默认状况下)// 用户也能够在打消歧义对话框中抉择非浏览器利用

    addCategory(CATEGORY_BROWSABLE)
    flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_REQUIRE_NON_BROWSER
  }
  startActivity(intent)
} catch (e: ActivityNotFoundException) {// 只能应用浏览器利用,或者默认应用浏览器解决该 intent。}

在极少数状况下,您的利用可能须要查问设施上所有已装置的利用或与之进行交互,不论这些利用蕴含哪些组件。为了容许您的利用看到其余所有已装置利用,Android 11 引入了 QUERY_ALL_PACKAGES 权限。在行将公布的政策更新中,Google Play 会为须要 QUERY_ALL_PACKAGES 权限的利用提供相干指南。

您能够将 API Level 设为 30,并应用 Android Studio 3.2 以上和最新公布的相应 Android Gradle 插件,即可在利用中增加 <queries> 元素。您能够在 开发者文档 — Android 11 中的软件包可见性 中找到更多无关软件包可用性的应用信息和用例。

Android Studio 和 Gradle 对该性能的反对

如果您应用的 Android Gradle 插件版本是 4.1 和以上版本的话,就能够失常应用新的 <queries> 元素,因为旧版本的 Gradle 插件并不兼容此元素。如果您应用了 <queries>,或者是依赖了反对 Android 11 的库或 SDK,则可能会引起 manifest 抵触从而呈现合并 manifest 的谬误。例如,在构建利用时,在 Build Output Window 中可能会看到以下谬误:

Android resource linking failed 

/Users/sample/AndroidStudioProjects/MyApp/app/build/intermediates/merged_manifests/debug/AndroidManifest.xml:18: error: unexpected element <queries> found in <manifest>

在 Build Output Window 中可能还会呈现这样一条错误信息,疏导您去查看 Manifest 合并日志 (Manifest merger logs):

Manifest merger failed with multiple errors, see logs

开展 Merged Manifest 视图后,会呈现一条附加的报错信息:

Error: Missing 'package' key attribute on element package

修复 Android Gradle 插件的问题

解决以上谬误的最好方法就是将 Android Gradle 插件降级到 4.1 Beta 版本。

然而,并不是所有开发者都可能应用最新的版本,一些我的项目中可能会依赖老版本的 Gradle 或者代码库,而它们与 4.1 版本的 Android Gradle 插件有兼容性问题。

因而,近期咱们为 Android Gradle 插件公布了一个 小版本 (dot releases) 的降级,以便兼容 <queries> 元素:

举个例子,如果您正在应用 4.0.0 版本的 Android Gradle 插件,就能够在我的项目级别的 build.gradle 文件中将相干依赖降级到上图中对应的版本。

buildscript {
    repositories {google()
        jcenter()}

    dependencies {
        // classpath 'com.android.tools.build:gradle:4.0.0'
        classpath 'com.android.tools.build:gradle:4.0.1'
    }
}

理解更多 Android 11 相干信息,请查阅以下资源:

  • Android 11 中的软件包可见性文档
  • Android Gradle 插件版本阐明
正文完
 0