热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

史上最全的Android11迁移

Android10迁移Android11官方地址:https:developer.android.comdistributebest-practicesdeveloptarget-

Android 10 迁移 Android 11
官方地址:https://developer.android.com/distribute/best-practices/develop/target-sdk?hl=zh-cn#prepie
《史上最全的Android 11 迁移》

主要是2个部分 隐私权和安全性

隐私权

从 Android 11 开始,使用分区存储模型的app只能访问自身的应用专用缓存文件。
从 Android 11 开始,应用无法在外部存储设备上创建自己的应用专用目录。如需访问系统为您的应用提供的目录,请调用 getExternalFilesDirs()。

强制执行分区存储:

对外部存储目录的访问仅限于应用专属目录,以及应用已创建的特定类型的媒体。

**什么是应用专属存储空间?**

存储仅供应用使用的文件,可以存储到内部存储卷中的专属目录或外部存储空间中的其他专属目录。使用内部存储空间中的目录保存其他应用不应访问的敏感信息。(只有应用自己可以访问)
从内部存储空间访问,可以使用 getFilesDir() 或 getCacheDir() 方法;从内部存储空间访问不需要任何权限 其他应用不能访问 app卸载后文件将移除
从外部存储空间访问,可以使用 getExternalFilesDir() 或 getExternalCacheDir() 方法 如果应用在搭载 Android 4.4(API 级别 19)或更高版本的设备上运行,从外部存储空间访问不需要任何权限 其他应用可以访问 app卸载后文件不会被移除

app使用分区存储模式,将应用专有的文件、媒体文件以及其他类型的文件保存到其专属的位置,并通过这些位置访问这些文件。

Android 10的应用仍可请求 requestLegacyExternalStorage 属性。应用更新为以 Android 11 为目标平台后,系统会忽略 requestLegacyExternalStorage 标记)

自动重置权限

如果用户几个月未与应用互动,系统会自动重置应用的敏感权限。此设置不会影响大多数应用。如果您的应用主要在后台运行,无需用户与之互动,您可以考虑请求用户停用自动重置功能

**什么是自动重置?**

≥android11的系统数月未使用,系统会通过自动重置用户已授予应用的运行时敏感权限来保护用户数据。此操作与用户在系统设置中查看权限并将应用的访问权限级别更改为拒绝的做法效果一样。可考虑,每次在使用的时候申请。

后台位置信息访问权限

≥30API(≥Android11)
针对前台位置信息获取权限和后台位置信息获取权限,应用必须分开进行请求。后台位置信息权限只能在应用设置中授予,而不是通过运行时权限对话框授予该权限。

软件包可见性

当应用查询设备上已安装应用和服务的列表时,系统会过滤返回的列表。 如果您使用文字转语音或语音识别服务,则需在清单文件中为这些服务添加
元素
也就是说,Android11中,如果你想去获取其他应用的信息,比如包名,名称等等,不能直接获取了,必须在清单文件中添加元素,告知系统你要获取哪些应用信息或者哪一类应用

安全性

压缩的 resource.arsc 文件不再受支持

如果以 Android 11(API 级别 30)或更高版本为目标平台的应用包含压缩的 resources.arsc
文件或者如果此文件未按 4 字节边界对齐,应用将无法安装。
https://developer.android.com/about/versions/11/behavior-changes-11?hl=zh-cn#change-details_3

现在需要使用 APK 签名方案 v2

Android 11(API 级别 30)必须使用 APK 签名方案 v2 或更高版本进行签名。用户无法在搭载 Android 11 的设备上安装或更新仅通过 APK 签名方案 v1 签名的应用 注意:为支持运行旧版 Android 的设备,除了使用 APK 签名方案 v2 或更高版本为您的 APK 签名之外,您还应继续使用 APK 签名方案 v1 进行签名。

Firebase

≥Android11(API 级别 30),在搭载 Android 6.0(API 级别 23)或更高版本的设备上会停用 Firebase
JobDispatcher 和 GcmNetworkManager API 调用。如需了解迁移,请参阅从 官方文档,下面是地址
Firebase JobDispatcher 迁移到 WorkManager
(https://developer.android.com/topic/libraries/architecture/workmanager/migrating-fb?hl=zh-cn)
从 GCMNetworkManager 迁移到 WorkManager
(https://developer.android.com/topic/libraries/architecture/workmanager/migrating-gcm?hl=zh-cn)

这两个api国内都用不了,主要用于后台任务。官方给出的替代意见是WorkManager,这个国内是可以用的,属于jetpack组件,主要用于调度和执行可延期的后台工作。

设备到设备文件传输

如果您的应用≥Android11(API 级别 30),您将无法使用 allowBackup
属性停用应用文件的设备到设备迁移。系统会自动启用此功能。
不过,即使您的应用≥Android11(API 级别 30),您也可以通过将 allowBackup 属性设为 false 来停用应用文件的云端备份和恢复 ## OnSharedPreferenceChangeListener 的回调变更
如果您的应用≥Android11(API 级别 30),现在每次调用 Editor.clear 时,都会使用 null 键回调 OnSharedPreferenceChangeListener.onSharedPreferenceChanged。

限制非 SDK 接口。

对于以 API 级别 30 为目标平台的应用,建议不要使用非 SDK 接口,因为其中一些接口现已被屏蔽。如需查看已屏蔽的非 SDK
接口的完整列表,请参阅目前在 Android 11 中被屏蔽的非 SDK 接口。

非 SDK 接口限制

Android 11 包含更新后的受限制非 SDK 接口列表(基于与 Android 开发者之间的协作以及最新的内部测试)。在限制使用非
SDK 接口之前,我们会尽可能确保有可用的公开替代方案。
如果您不确定自己的应用是否使用了非 SDK 接口,则可以测试该应用,进行确认。如果您的应用依赖于非 SDK 接口,您应该开始计划迁移到 SDK 替代方案。然而,我们知道某些应用具有使用非 SDK
接口的有效用例。如果您无法为应用中的功能找到无需使用非 SDK 接口的替代方案,则应请求添加新的公共 API。
如需详细了解此 Android 版本中的变更,请参阅 Android 11 中有关限制非 SDK 接口的更新。如需全面了解有关非 SDK 接口的详细信息,请参阅对非 SDK 接口的限制。

堆指针标记

堆指针在最高有效字节 (MSB) 中有一个非零标记。错误地使用指针的应用(包括修改 MSB
的应用)现在会崩溃或遇到其他问题。这是支持未来启用了 ARM 内存标记扩展 (MTE)
的硬件所必需的变更。如需了解详情,请参阅已加标记的指针

(https://source.android.com/devices/tech/debug/tagged-pointers?hl=zh-cn)
如需停用此功能,请参阅 allowNativeHeapPointerTagging (https://developer.android.com/guide/topics/manifest/application-element?hl=zh-cn#allowNativeHeapPointerTagging)清单文档

消息框的更新

来自后台的自定义消息框被屏蔽,出于安全方面的考虑,同时也为了保持良好的用户体验,如果包含自定义视图的消息框是以 Android 11
或更高版本为目标平台的应用从后台发送的,系统会屏蔽这些消息框。

注意:后台无法弹出自定义Toast(注意限定条件:后台、自定义)
如果位于后台,只能弹出原生 Toast。如果不位于后台,可以弹出自定义Toast。Toast.getView() Toast.setView() 方法废弃,现在会返回空值

//下面是自定义Toast 显示文本+图片的Toast,已测试过

public static void showImageToas(Context context,String message){
View toastview= LayoutInflater.from(context).inflate(R.layout.toast_image_layout,null);
TextView text = (TextView) toastview.findViewById(R.id.tv_message);
text.setText(message); //要提示的文本
Toast toast=new Toast(context); //上下文
toast.setGravity(Gravity.CENTER,0,0); //位置居中
toast.setDuration(Toast.LENGTH_SHORT); //设置短暂提示
toast.setView(toastview); //把定义好的View布局设置到Toast里面
toast.show();
}

消息框回调
如果您希望在消息框(文本消息框或自定义消息框)出现或消失时收到通知,请使用 Android 11 中添加的 addCallback() 方法。

Toast消息框 API 变更

以 Android 11 或更高版本为目标平台的应用 会发现Toast框受到以下负面影响:

getView() 方法返回 null。
以下方法的返回值并不反映实际值,因此您不应在应用中依赖于它们:
getHorizontalMargin()
getVerticalMargin()
getGravity()
getXOffset()
getYOffset()
以下方法是空操作,因此您的应用不应使用它们:
setMargin()
setGravity()

连接

以 Android 11 为目标平台的应用现在必须具备 Manifest.permission.WRITE_APN_SETTINGS 特权,才能读取或访问电话提供程序 APN 数据库。如果在不具备此权限的情况下尝试访问 APN 数据库,会生成安全异常。

那么问题来了,APN是啥?
指一种网络接入技术,是通过手机上网时必须配置的一个参数,APN配置参数包括名字,运营商编号,APN接入点等等。

无障碍服务

**在清单文件中声明与 TTS 引擎的交互**

由于软件包可见性发生了变更,因此以 Android 11 为目标平台且与文字转语音 (TTS) 引擎交互的应用需要将以下
元素添加到其清单文件中:



android:name="android.intent.action.TTS_SERVICE" />


**在元数据文件中声明“无障碍”按钮使用情况 **

从 Android 11 开始,您的无障碍服务无法在运行时声明与系统的“无障碍”按钮相关联。如果您将 AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON 附加到
AccessibilityServiceInfo 对象的 flags 属性,框架就不会将“无障碍”按钮回调事件传递给您的服务。

如需在无障碍服务中收到无障碍回调事件,请使用无障碍服务元数据文件声明您的服务与“无障碍”按钮的关联。在 accessibilityFlags 属性的定义中添加 flagRequestAccessibilityButton 值。无障碍服务元数据文件的常用位置为 res/raw/accessibilityservice.xml。

相机

媒体 intent 操作需要系统默认相机

从 Android 11 开始,只有预装的系统相机应用可以响应以下 intent 操作:
android.media.action.VIDEO_CAPTURE
android.media.action.IMAGE_CAPTURE
android.media.action.IMAGE_CAPTURE_SECURE
如果有多个预装的系统相机应用可用,系统会显示一个对话框,供用户选择应用。如果您希望自己的应用使用特定的第三方相机应用来代表其捕获图片或视频,可以通过为
intent 设置软件包名称或组件来使这些 intent 变得明确


推荐阅读
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
author-avatar
yvli心语
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有