史上最全的Android 11 迁移

Android 10 迁移 Android 11
官方地址:https://developer.android.com/distribute/best-practices/develop/target-sdk?hl=zh-cn#prepie
在这里插入图片描述

主要是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) 引擎交互的应用需要将以下
元素添加到其清单文件中:

    <queries>
       <intent>
         <action
            android:name="android.intent.action.TTS_SERVICE" />
      </intent>
    </queries>
**在元数据文件中声明“无障碍”按钮使用情况 **

从 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 变得明确

猜你喜欢

转载自blog.csdn.net/u010207898/article/details/118417677