Android 13(API 33)2022年8月15日 正式发布(发布时间较往年早了一些),正式版Release源代码也于当日被推送到AOSP Android开源项目。



截止到笔者撰写这篇文章时,国内部分应用软件开发厂商已逐步接到手机厂商(华米OV等)的新版本适配要求。当前,对于Android应用开发者来说,Android 13 的软件兼容适配已需提上工作日程。

为了贴合这篇文章的标题,本篇文章结合Android Developer官方文档,围绕Android13适配点Android13新特性两个方面进行详细说明。

适配点:

  • 细分媒体权限:

    READ_EXTERNAL_STORAGE 细分为IAMGES、VIDEO、AUDIO权限

    若设置 targetSdk>=33 则此项必需适配!
  • WebView调整:

    废弃setAppCacheEnabledsetForceDark方法;

    若设置 targetSdk>=33 则此项必需适配!
  • 静态广播注册:

    注册静态广播时,需设置对其他应用的可见性

    若设置 targetSdk>=33 则此项必需适配!
  • 通知权限:

    新增运行时通知权限:POST_NOTIFICATIONS

    若设置 targetSdk>=33 则此项必需适配!
  • Wi-Fi :

    新增 NEARBY_WIFI_DEVICES 运行时权限

    若设置 targetSdk>=33 则此项必需适配!
  • 身体传感器后台权限:

    新增 BODY_SENSORS_BACKGROUND 运行时权限

    若设置 targetSdk>=33 则此项必需适配!
  • 剪切板内容隐藏:

    新增内容隐藏API

    根据业务需求,选择性适配!
  • 非 SDK 接口的限制

    若设置 targetSdk>=33 则此项必需适配!

新特性:

  • 前台服务管理器:

    系统新增前台服务管理器

    系统新特性无需适配!

一、细分媒体权限

从Android 13开始,以Android13(API 33+)为目标平台的应用,系统新增运行时权限READ_MEDIA_IAMGESREAD_MEDIA_VIDEOREAD_MEDIA_AUDIO 替代原有的READ_EXTERNAL_STORAGE权限。

权限 权限说明
READ_MEDIA_IAMGES 图片权限
READ_MEDIA_VIDEO 视频权限
READ_MEDIA_AUDIO 音频权限

当应用升级到targetSdk>=33时:

  • 已授权READ_EXTERNAL_STORAGE权限的应用:系统将自动赋予对应的细化权限。
  • 未授权仍请求READ_EXTERNAL_STORAGE权限:亲测系统将不会授予任何权限。

细分媒体权限动态申请弹窗样式:

  • 如果同时请求 READ_MEDIA_IMAGESREAD_MEDIA_VIDEO 权限,系统将会提示如下权限弹窗:

  • 如果请求 READ_MEDIA_AUDIO 权限,系统将提示如下弹窗:

官方参考:

Android Developer 细分媒体权限:

https://developer.android.google.cn/about/versions/13/behavior-changes-13

二、WebView

从Android 13开始,以Android13(API 33+)为目标平台的应用,WebView存在以下方法与API调整:

  • WebSettings.setAppCacheEnabled() 方法废弃
  • WebSettings.setForceDark() 方法废弃

2.1 setAppCacheEnabled 废弃

WebView 95+版本不再支持 setAppCacheEnabled

Chrome 85+版本不再支持AppCache

2.2 setForceDark 废弃

从Android 13开始以Android13(API 33+)为目标平台的应用,系统会根据应用的主题属性isLightTheme,自动设置WebView的浅色或深色主题样式(系统会根据 isLightTheme 来设置 prefers-color-scheme)。同时,开发者Webview设置主题样式相关API WebSettings.setForceDark() 方法将被废弃。

基于以上更改:

  • 若开发者仍需自定义Webview主题颜色,可以使用:

    WebSettings.setAlgorithmicDarkeningAllowed()WebSettingsCompat.setAlgorithmicDarkeningAllowed()方法。
  • 若开发者仍然使用WebSettings.setForceDark()系统将提示错误:
W/cr_WebSettings: setForceDark() is a no-op in an app with targetSdkVersion>=T

官方参考:

Android Developer 静态广播注册官方介绍:

https://developer.android.google.cn/about/versions/13/behavior-changes-13

三、静态广播注册

从Android 13开始,以Android13(API 33+)为目标平台的应用,注册静态广播时,需设置对其他应用的可见性

  • 若对其他应用可见,广播注册时设置:Context.RECEIVER_EXPORTED
  • 若仅应用内使用,广播注册时设置:Context.RECEIVER_NOT_EXPORTED
private void registerTestReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction("com.xiaxl.test.action");
// api >= 33
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
// 跨应用间使用
MainActivity.this.registerReceiver(mTestReceiver, filter, Context.RECEIVER_EXPORTED);
// 应用内使用
//MainActivity.this.registerReceiver(mTestReceiver, filter, Context.RECEIVER_EXPORTED);
}
// api <= 32
else {
MainActivity.this.registerReceiver(mTestReceiver, filter);
}
}

官方参考:

Android Developer 静态广播注册官方介绍:

https://developer.android.google.cn/about/versions/13/features#java

四、通知权限

Android 13 引入了一种新的运行时通知权限:POST_NOTIFICATIONS

POST_NOTIFICATIONS 权限级别被定义为dangerous 开发者使用该权限时需动态申请,等待用户主动授权:

  • 对于以Android13(API 33+)为目标平台的应用

    在显示Android通知栏时,一方面需要在AndroidManifest中声明 android.permission.POST_NOTIFICATION,另一方面代码中需动态申请该通知栏权限。
<!-- AndroidManifest权限声明 -->
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xiaxl.test"> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
</manifest> // Java代码动态申请POST_NOTIFICATIONS权限
if (Build.VERSION.SDK_INT >= 33) {
int checkPermission =
ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.POST_NOTIFICATIONS);
if (checkPermission != PackageManager.PERMISSION_GRANTED) {
//动态申请
ActivityCompat.requestPermissions(MainActivity.this, new String[]{
Manifest.permission.POST_NOTIFICATIONS}, PERMISSION_REQUEST_CODE);
} else {
//showRecordNotification();
}
} else {
//showRecordNotification();
}

POST_NOTIFICATIONS 动态授权申请弹窗如下图所示:

  • 对于以Android12(API 32-)为目标平台的应用

    对于以API 32-为目标平台的应用,运行在Android13及以上设备中时,当应用第一次显示通知时,系统会自动弹出以下提示框,要求用户动态授权

官方参考:

Android Developer 通知运行时权限官方介绍:

https://developer.android.google.cn/guide/topics/ui/notifiers/notification-permission

五、Wi-Fi 权限

从Android 13开始,Android系统新增了NEARBY_WIFI_DEVICES权限,将原有的ACCESS_FINE_LOCATION权限 与 Wi-Fi能力使用进行了区分(避免早先开发者使用Wi-Fi能力时,需要请求用户位置权限,从而引起用户的歧义)。

从Android 13开始,开发者只要不通过Wi-Fi推导用户的物理位置将无需再请求 ACCESS_FINE_LOCATION 权限,同时官方总结了新增权限NEARBY_WIFI_DEVICES的如下使用场景:

官方参考:

Android Developer NEARBY_WIFI_DEVICES:

https://developer.android.google.cn/reference/android/Manifest.permission#NEARBY_WIFI_DEVICES

六、剪切板内容隐藏

从Android 13(API 33)开始,Android剪切板新增了一项新API

Android 13(API 33)开始,用户可以选择使用API PersistableBundle#(ClipDescription.EXTRA_IS_SENSITIVE, true)隐藏要复制到剪切板的用户账户、密码登敏感信息。

相关API使用举例如下:

private void addData2Clipboard() {
ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clipData = ClipData.newPlainText("111111", "我是密码");
ClipDescription description = clipData.getDescription();
// 隐私内容:剪切板加密
PersistableBundle persistableBundle = new PersistableBundle();
if (Build.VERSION.SDK_INT >= 33) {
persistableBundle.putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true);
} else {
persistableBundle.putBoolean("android.content.extra.IS_SENSITIVE", true);
}
description.setExtras(persistableBundle);
// 剪切板添加加密内容
clipboardManager.setPrimaryClip(clipData);
}

不使用新API使用新API隐藏敏感信息,剪切板前后对比如下所示:

七、身体传感器后台权限

从Android 13开始,以Android13(API 33+)为目标平台的应用,在后台访问身体传感器(例如心率、体温和血氧饱和度)时,除了需要请求现有的 BODY_SENSORS 权限外,还需要请求 BODY_SENSORS_BACKGROUND 权限。

官方参考:

Android Developer BODY_SENSORS_BACKGROUND:

https://developer.android.google.cn/reference/android/Manifest.permission#BODY_SENSORS_BACKGROUND

八、非 SDK 接口限制

官方从 Android 9(API 级别 28)开始,逐步开始对应用使用的非 SDK 接口实施了限制。

如果你的APP通过引用非 SDK 接口或尝试使用反射或 JNI 来获取句柄,这些限制就会起作用。官方给出的解释是为了提升用户体验、降低应用崩溃风险

8.1、非SDK接口检测工具

官方给出了一个检测工具,下载地址:veridex

https://android.googlesource.com/platform/prebuilts/runtime/+archive/master/appcompat.tar.gz

veridex使用方法:

appcompat.sh --dex-file=apk.apk

8.2、blacklist、greylist、greylist-max-o、greylist-max-p含义

以上截图中,blacklist、greylist、greylist-max-o、greylist-max-p含义如下:

  • blacklist 黑名单:禁止使用的非SDK接口,运行时直接Crash(因此必须解决)
  • greylist 灰名单:即当前版本仍能使用的非SDK接口,但在下一版本中可能变成被限制的非SDK接口
  • greylist-max-o: 在targetSDK<=O中能使用,但是在targetSDK>=P中被禁止使用的非SDK接口
  • greylist-max-p: 在targetSDK<=P中能使用,但是在targetSDK>=Q中被禁止使用的非SDK接口

官方参考:

Android Developer 非SDK接口限制:

https://developer.android.google.cn/guide/app-compatibility/restrictions-non-sdk-interfaces#test-for-non-sdk

九、前台服务管理器

从Android 13(API 33)开始,Android通知栏中新增了一项新特性

用户可以选择在通知栏中通过“前台服务管理器”,对“正在运行的前台服务”进行停止操作。

参考

Android Developer:Andoid13

https://developer.android.google.cn/about/versions/13

AOSP:Android13版本说明

https://source.android.google.cn/docs/setup/start/android-13-release

GoogleSource:Android13_r3

https://android.googlesource.com/platform/build/+/refs/tags/android-13.0.0_r4

= THE END =

文章首发于公众号”CODING技术小馆“,如果文章对您有帮助,欢迎关注我的公众号。

Android 13 新特性及适配指南的更多相关文章

  1. Android12 新特性及适配指南

    Android 12(API 31)于2021年10月4日正式发布,正式版源代码也于当日被推送到AOSP Android开源项目.截止到笔者撰写这篇文章时,国内各终端厂商的在售Android设备,已经 ...

  2. 腾讯云安全:开发者必看|Android 8.0 新特性及开发指南

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 背景介绍 谷歌2017 I/O开发者大会今年将于5月17-19日在美国加州举办.大会将跟往年一样发布最新的 A ...

  3. 开发者必看|Android 8.0 新特性及开发指南

    背景介绍 谷歌2017 I/O开发者大会今年将于5月17-19日在美国加州举办.大会将跟往年一样发布最新的 Android 系统,今年为 Android 8.0.谷歌在今年3 月21日发布 Andro ...

  4. Android O新特性和行为变更总结zz

    https://mp.weixin.qq.com/s/Ezfm-Xaz3fzsaSm0TU5LMw Android O 行为变更https://developer.android.google.cn/ ...

  5. Android N 新特性

    2016年5月19日,谷歌在美国加州的山景城举办了 Google I/O 开发者大会中发布.2016年6月,Android N正式命名为“牛轧糖” 本届I/O开发者大会上,Google重点介绍了And ...

  6. Angular4.0.0正式发布,附新特性及升级指南

    本文首发地址:Angular4.0.0正式发布,附新特性及升级指南 作者|孙薇 编辑|尾尾 经历了6个RC版本之后,Angular项目组终于发布了新版,即正式版 Angular 4.0.0.新版的 A ...

  7. 可能是最早的学习Android N新特性的文章

    可能是最早的学习Android N新特性的文章 Google在今天放出了Android N开发者预览版.Android N支持Nexus6及以上的设备.5太子Nexus5不再得到更新. Android ...

  8. 转:iOS9的新特性以及适配方案

    2015年9月8日,苹果宣布iOS 9操作系统的正式版在太平洋时间9月16日正式推出,北京时间9月17日凌晨1点推送. 新的iOS 9系统比iOS8更稳定,功能更全面,而且还更加开放.iOS 9加入了 ...

  9. iOS9的新特性以及适配方案-----转载

    2015年9月8日,苹果宣布iOS 9操作系统的正式版在太平洋时间9月16日正式推出,北京时间9月17日凌晨1点推送. 新的iOS 9系统比iOS8更稳定,功能更全面,而且还更加开放.iOS 9加入了 ...

随机推荐

  1. 基于C++17的泛型函数容器实现方法研究

  2. 057_末晨曦Vue技术_处理边界情况之强制更新($forceUpdate)与通过 v-once 创建低开销的静态组件

    强制更新($forceUpdate) 点击打开视频讲解更加详细 在vue中,如果data中有基本数据类型变量:age,修改他,页面会自动更新. 但如果data中的变量为数组或对象(引用数据类型),我们 ...

  3. MapReduce计算流程

    MapReduce的计算流程 1.1 原始数据File The books chronicle the adventures of the adolescent wizard Harry Potter ...

  4. [开源精品] C#.NET im 聊天通讯架构设计 -- FreeIM 支持集群、职责分明、高性能

    FreeIM 是什么? FreeIM 使用 websocket 协议实现简易.高性能(单机支持5万+连接).集群即时通讯组件,支持点对点通讯.群聊通讯.上线下线事件消息等众多实用性功能. ImCore ...

  5. python字典键或值去重

    from fuzzywuzzy import fuzz, process a = {'嫦娥四号探测器是用哪个型号的火箭发射的?': ['长征3B'], '嫦娥四号探测器是在我国[]发射成功的.': [ ...

  6. VS Code 之KoroFileHeader插件

    设置 在vscode左下角点击设置按钮,选择"设置",然后输入"fileheader", 文件头部注释:Fileheader:custom Made 函数注释: ...

  7. Linux命令之find、grep、echo、tar、whoami、uname

    1. whoami--查看当前登录的用户名 book@100ask:~/linux$ whoami book 2. echo--打印命令,配合'>'或者'>>'使用 echo 打印信 ...

  8. C#,启动exe程序并传参(参数间带&符号)方法

    入参格式例如:C:\\Users\\Administrator\\Desktop\\测试\\测试\\bin\\Debug\\测试.exe type=1^&card_no=123 public ...

  9. 【Java面试】面试遇到宽泛的问题,这么回答就稳了,谈谈你对Redis的理解

    "谈谈你对Redis的理解"! 面试的时候遇到这类比较宽泛的问题,是不是很抓狂? 是不是不知道从何开始说起? 没关系,今天我用3分钟教你怎么回答. 大家好,我是Mic,一个工作了1 ...

  10. KMP&Z函数详解

    KMP 一些简单的定义: 真前缀:不是整个字符串的前缀 真后缀:不是整个字符串的后缀 当然不可能这么简单的,来个重要的定义 前缀函数: 给定一个长度为\(n\)的字符串\(s\),其 \(前缀函数\) ...