[Android] Android 13 新特性及适配指南

  • A+
所属分类:其他教程
摘要

DSC0000.jpg 下载附件 2022-10-25 10:45 上传DSC0001.jpg 下载附件 2022-10-25 10:45 上传DSC0002.jpg

[Android] Android 13 新特性及适配指南

DSC0000.jpg

2022-10-25 10:45 上传

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

DSC0001.jpg

2022-10-25 10:45 上传

截止到笔者撰写这篇文章时,国内部分应用软件开发厂商已逐步接到手机厂商(华米OV等)的新版本适配要求。当前,对于Android应用开发者来说,Android 13 的软件兼容适配已需提上工作日程。
为了贴合这篇文章的标题,本篇文章结合Android Developer官方文档,围绕Android13适配点与Android13新特性两个方面进行详细说明。
适配点:

  • 细分媒体权限:
    将 READ_EXTERNAL_STORAGE 细分为IAMGES、VIDEO、AUDIO权限
    (若设置 targetSdk>=33 则此项必需适配!)
  • WebView调整:
    废弃setAppCacheEnabled与setForceDark方法;
    (若设置 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_IAMGES、READ_MEDIA_VIDEO、READ_MEDIA_AUDIO 替代原有的READ_EXTERNAL_STORAGE权限。
[tr]权限权限说明[/tr]

READ_MEDIA_IAMGES 图片权限
READ_MEDIA_VIDEO 视频权限
READ_MEDIA_AUDIO 音频权限
[Android] Android 13 新特性及适配指南

DSC0002.jpg

2022-10-25 10:45 上传

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

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

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

  • 如果同时请求 READ_MEDIA_IMAGES 和 READ_MEDIA_VIDEO 权限,系统将会提示如下权限弹窗:
    [Android] Android 13 新特性及适配指南

    DSC0003.jpg

    2022-10-25 10:45 上传

  • 如果请求 READ_MEDIA_AUDIO 权限,系统将提示如下弹窗:
    [Android] Android 13 新特性及适配指南

    DSC0004.jpg

    2022-10-25 10:45 上传

官方参考:
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
[Android] Android 13 新特性及适配指南

DSC0005.jpg

2022-10-25 10:45 上传

Chrome 85+版本不再支持AppCache
[Android] Android 13 新特性及适配指南

DSC0006.jpg

2022-10-25 10:45 上传

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 开发者使用该权限时需动态申请,等待用户主动授权:
[Android] Android 13 新特性及适配指南

DSC0007.jpg

2022-10-25 10:45 上传

  • 对于以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 动态授权申请弹窗如下图所示:
[Android] Android 13 新特性及适配指南

DSC0008.jpg

2022-10-25 10:45 上传

  • 对于以Android12(API 32-)为目标平台的应用:
    对于以API 32-为目标平台的应用,运行在Android13及以上设备中时,当应用第一次显示通知时,系统会自动弹出以下提示框,要求用户动态授权。
[Android] Android 13 新特性及适配指南

DSC0009.jpg

2022-10-25 10:45 上传

官方参考:
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] Android 13 新特性及适配指南

DSC00010.jpg

2022-10-25 10:45 上传

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

[Android] Android 13 新特性及适配指南

DSC00011.jpg

2022-10-25 10:45 上传

官方参考:
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] Android 13 新特性及适配指南

DSC00012.jpg

2022-10-25 10:45 上传

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

[Android] Android 13 新特性及适配指南

DSC00013.jpg

2022-10-25 10:45 上传

官方参考:
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
[Android] Android 13 新特性及适配指南

DSC00014.jpg

2022-10-25 10:45 上传

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] Android 13 新特性及适配指南

DSC00015.jpg

2022-10-25 10:45 上传

参考
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技术小馆“,如果文章对您有帮助,欢迎关注我的公众号。

  • 我的微信公众号
  • 扫一扫关注
  • weinxin
  • 我的新浪微博号
  • 扫一扫关注
  • weinxin
小辉博客

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: