首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >重要变更 | Android 11 中的软件包可见性

重要变更 | Android 11 中的软件包可见性

作者头像
Android 开发者
发布于 2022-09-23 02:19:46
发布于 2022-09-23 02:19:46
1.8K00
代码可运行
举报
文章被收录于专栏:Android 开发者Android 开发者
运行总次数:0
代码可运行

Android 10 及之前的版本中,应用可以通过 queryIntentActivities() 这样的方法获取到设备中所有已安装的应用列表。在大多数情况下,这种访问权限远超出了应用实际所需要的权限范围。随着我们不断加强对隐私保护的关注,我们将在 Android 11 上引入一些新的变化,从而改变应用查询用户已安装应用并与之交互的方式。为了达到这一目的,我们为特定设备上所安装的应用列表带来了更好的访问控制。

为了更好地 "问责" 访问已安装应用的行为,默认情况下,以 Android 11 为目标平台 (目标 API level 为 30) 的应用默认将只能检测到部分过滤后的已安装应用。如果想获取更多别的已安装应用列表信息,则需要在应用内的 Android manifest 中添加 元素,从而拓宽访问范围。

大部分常见场景 下,包括任何以 startActivity() 启动的 intents,您不需要做任何改动。而 其他场景,比如从您应用的界面中直接打开某个特定的第三方应用,则需要开发者们显式地声明应用的包名或者 intent filter 签名,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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 链接。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 插件,即可在应用中添加 元素。您可以在 开发者文档 — Android 11 中的软件包可见性 中找到更多有关软件包可用性的使用信息和用例。

Android Studio 和 Gradle 对该功能的支持

如果您使用的 Android Gradle 插件版本是 4.1 和以上版本的话,就可以正常使用新的 元素,因为旧版本的 Gradle 插件并不兼容此元素。如果您使用了 ,或者是依赖了支持 Android 11 的库或 SDK,则可能会引起 manifest 冲突从而出现合并 manifest 的错误。例如,在构建应用时,在 Build Output Window 中可能会看到以下错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Manifest merger failed with multiple errors, see logs

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Error: Missing 'package' key attribute on element package

修复 Android Gradle 插件的问题

解决以上错误的最好办法就是将 Android Gradle 插件升级到 4.1 Beta 版本

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

因此,近期我们为 Android Gradle 插件发布了一个 小版本 (dot releases) 的升级,以便兼容 元素:

举个例子,如果您正在使用 4.0.0 版本的 Android Gradle 插件,就可以在项目级别的 build.gradle 文件中将相关依赖升级到上图中对应的版本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 相关信息,请查阅以下资源:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
政策更新 | 开发者如何处理软件包可见性
我们正在 Android 平台上进行多项变更来增强用户隐私和平台安全性,旨在为用户提供更安全的体验。以 Android 11 (API 级别 30) 或更高版本为目标的应用默认将只能获取 过滤后的已安装应用列表。如需访问过滤后列表以外的应用,则需要在应用内的 Android manifest 中使用 元素声明需要与之交互的应用。本文将介绍适应此特性的最佳实践。
Android 开发者
2022/03/09
5520
政策更新 | 开发者如何处理软件包可见性
Android 11适配攻略
首语 分享一个Github小技巧。不用下载任何软件,也不需要装任何的浏览器插件,你只用在Github的网址中,gitHub后面添加1s,回车就可以在Vscode界面访问项目代码了。来个例子。 原始地址:https://github.com/hujuny/CommunityLibrary Vscode界面地址:https://github1s.com/hujuny/CommunityLibrary 接下来进入今天的主题👉 Android 11。 Android 12预览版从2021年2月开始启动,目前
八归少年
2022/06/29
4.3K0
Android 11适配攻略
Android 12 适配升级小结
Android 12 发布已经有好几个月了,而且随着各大市场对应用适配的要求逐渐提高,和尚也尝试将一个历史的应用简单升级适配 Android 12;
阿策小和尚
2022/08/30
3K0
Android 12 适配升级小结
【胖虎的逆向之路】如何绕过 Android11新特性之 “包的可见性“
距离Android11 发布已经过去了,当初我有大概了解过一些Android 11上的行为变更,总体变化虽然不少,但是要求我们必须去适配的地方并不算多。对于我而言可能需要注意的是文件相关权限,譬如从访问文件到访问媒体文件再到访问全部文件,Android 日益收缩的权限,对于普通用户而言更为安全、高效,从眼光放到开发者身上则不为然,一个APP不仅仅是运行在一部手机上,所以适配要做好,比如接下来我们要讲的 “包的可见性”
胖虎哥
2023/05/10
7820
【胖虎的逆向之路】如何绕过 Android11新特性之 “包的可见性“
R与ACTION_IMAGE_CAPTURE
说到ACTION_IMAGE_CAPTURE,大家肯定不陌生,如果我们只想简简单单拍个照片,然后在应用中使用,那它肯定是最快的方式。只需:
写代码的阿宗
2020/08/24
6720
【Android笔记】apk嵌套
主要思想:把b.apk放到assets目录下,由于有大小限制(1M),所以改名成b.mp3(因为mp3,jpg,png,mp4等不会检查,不会限制大小),然后在用的时候再改回来
程序员小何SS
2021/12/13
6710
AndroidR兼容性适配指南
Android 11 基于 Android 早期版本构建,增加了多种功能和更新,以保障用户安全并提高透明度和可控性。所有开发者都应查看隐私功能并测试他们的应用。具体影响可能会因每个应用的核心功能、目标平台和其他因素而异。
静默加载
2022/12/27
2.5K0
AndroidR兼容性适配指南
[译]Android Instant Apps简介
MelonTeam
2018/01/04
4K0
[译]Android Instant Apps简介
拖不得了,Android11真的来了,最全适配实践指南奉上
前言 没错!Android 11(version 30,Andorid R) 正式发布了!看到这个新闻我知道我不能再拖了,再不好好准备好迎接Android11的到来,到时候迎接我的就是客户的指责,甚至
码上积木
2020/09/27
7.5K0
Android 12 适配攻略
2022年2月11日,谷歌发布了首个 Android 13 开发者预览版。2022年7月,发布了Beta 4版本,接下来就是Final Relase版本了。是时候适配一波Android12了,为后面项目适配铺平道路。
八归少年
2022/09/28
3.6K0
Android 12 适配攻略
Deeplink实践原理分析
目录介绍 01.先看一个场景 02.什么是DeepLink 03.什么是Deferred DeepLink 04.什么是AppLink 05.DeepLink和AppLink核心技术 06.DeepLink实践方案 07.AppLink实践方案 08.部分问题思考总结 09.DeepLink原理分析 10.AppLink原理分析 01.先看一个场景 假设一个场景: 小明告诉小杨,一鹿有车APP上有一个很有创意的抽奖活动,小新想要参与这个活动 如果小杨已经安装了APP,他需要找到且打开APP,然后找到相应的活
杨充
2019/12/09
3.2K0
React Native android 常见错误和解决方法
这个 BUG 是 Xcode.11 引起的, 可以查看这个问题的提交记录,链接为:https://github.com/facebook/react-native/issues/25138 我们只需要找到 RCTModuleMethod.mm 这个文件 修改
chuchur
2022/10/25
3.1K0
Android-读写权限变更记录
因为Android应用市场要求是最低要求API 30以上,我准备就直接从API 28升到API 33了,其中遇到了一些读写存储空间的问题,这里做一些记录总结~
TieJun
2023/11/02
2.5K0
Android Training Note
google为了让广大Android开发者能够高效地创建优质的app,专门针对开发者提供了Training板块,这个板块的学习资料是最一手的,来自google android工程师之手的。这个资料是每一个Android开发者都应该学习的手册,并且它是不断更新的。链接:  https://developer.android.com/training/index.html 中文版: http://hukai.me/android-training-course-in-chinese/index.html 版
六月的雨
2018/05/14
7710
隐私策略更新 | Android 11 应用兼容性适配
Android 11 的最终版本已正式发布!该版本延续了之前发行版本里不断改进的隐私策略,为用户提供更加完善的控制机制和透明度,并帮助应用更好地处理自身的数据。
Android 开发者
2020/10/16
1.8K0
隐私策略更新 | Android 11 应用兼容性适配
Android插件化-RePlugin项目集成与使用
本文介绍了插件化开发过程中,如何通过 RePlugin 框架实现从一个库的插件化,并基于该插件化实现一个具体的功能,最终通过一个实例展示了整个插件化的流程。
codingblock
2017/12/27
1.8K0
Android app自动更新总结(已适配9.0)
接下来是工具类,来自github,参考,https://github.com/vondear/RxTool
Android技术干货分享
2019/05/13
2K0
写了一个适配 Android12-exported 的小插件
从 Android12 开始,如果我们的 tagSdk >=31, 即以 Android 12 或更高版本为目标平台时,且包含使用 intent 过滤器的 activity、服务或广播接收器,则必须为这些应用组件显式声明 android:exported 属性。
Petterp
2022/06/30
9330
写了一个适配 Android12-exported 的小插件
Android 必知必会 - 使用 Intent 打开第三方应用及验证可用性
一个普通的应用默认会有一个入口 Activity,它在 AndroidManifest.xml 中一般这样写:
他叫自己MR.张
2019/07/01
4.7K0
相关推荐
政策更新 | 开发者如何处理软件包可见性
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验