Android Q 适配指南

简介: 在Android 10开始版本中,官方的改动较大,相应的开发者适配成本还是很高的。这里按照`2019.11.11 google android q workshop`流程,大概说明一下Android Q适配需要注意的内容。虽然是大概介绍,但应该是目前最全的适配攻略了...

在Android 10开始版本中,官方的改动较大,相应的开发者适配成本还是很高的。
这里按照2019.11.11 google android q workshop流程,大概说明一下Android Q适配需要注意的内容。虽然是大概介绍,但应该是目前最全的适配攻略了...

  • 非SDK 接口
  • 设备ID
  • 外部存储
  • 权限
  • 新功能——夜间模式

官方适配文档:
https://developer.android.com/about/versions/10

一、非SDK接口

官方文档:针对非 SDK 接口的限制

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

1.1、非SDK接口检测工具

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

veridex使用方法:

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

在这里插入图片描述

1.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接口

如果觉得我没有说清楚,可以看以下 2019.11.11 google android q workshop PPT 截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3、Android Q 加固 与 热修复

关于加固与热修复,官方也提供了相应的API

  • 加固

在这里插入图片描述

  • 热修复

在这里插入图片描述

注:
未适配Android Q的应用,若使用了blacklist 相关接口,在Android Q系统上打开时,会直接Crash!
未适配Android Q的应用,若使用了blacklist 相关接口,在Android Q系统上打开时,会直接Crash!
未适配Android Q的应用,若使用了blacklist 相关接口,在Android Q系统上打开时,会直接Crash!

二、设备ID

从Android 10 开始 普通应用 已无法完全标识一个设备,曾经用mac地址、IMEI等设备信息标识设备的方法,从Android 10开始统统失效。而且无论你的APP是否是配过Android 10。

2.1、IMEI等设备信息

从Android10开始普通应用不再允许请求权限android.permission.READ_PHONE_STATE
而且,无论你的App是否适配过Android Q(既targetSdkVersion是否大于等于29),均无法再获取到设备IMEI等设备信息。

受影响的API如下:

Build.getSerial();
TelephonyManager.getImei();
TelephonyManager.getMeid()
TelephonyManager.getDeviceId();
TelephonyManager.getSubscriberId();
TelephonyManager.getSimSerialNumber();

在这里插入图片描述

targetSdkVersion<29 的应用,其在获取设备ID时,会直接返回null
targetSdkVersion>=29 的应用,其在获取设备ID时,会直接跑出异常SecurityException

在这里插入图片描述

如果您的App希望在Android 10以下的设备中仍然获取设备IMEI等信息,可按以下方式进行适配:

在这里插入图片描述

谁能访问设备ID?

从Android 10开始,哪些应用还能访问设备ID?

Google官方的描述如下:
https://source.android.com/devices/tech/config/immutable-device-ids?hl=zh-cn

  • 默认的短信应用。
  • 具有 READ_PRIVILEGED_PHONE_STATE 权限,并且在 privapp-permission.xml 文件中列入白名单的应用。

这些应用还必须加载到 system/priv-app 目录中。

  • 具有 UICC 运营商权限中定义的运营商权限的应用。
  • 具有 READ_PHONE_STATE 权限的设备所有者或资料所有者(无需列入白名单)。

在这里插入图片描述

2.2、Mac地址随机分配

从Android10开始,默认情况下,在搭载 Android 10 或更高版本的设备上,系统会传输随机分配的 MAC 地址。(既从Android 10开始,普通应用已经无法获取设备的真正mac地址,标识设备已经无法使用mac地址)

2.3、如何标识设备唯一性?

在这里插入图片描述
在这里插入图片描述

Google给出的解决方案是:如果您的应用有 追踪非登录用户重装 的需求,可用ANDROID_ID来标识设备。

  • ANDROID_ID的生成规则为:签名+设备信息+设备用户
  • ANDROID_ID重置规则:设备恢复出厂设置时,ANDROID_ID将被重置
String androidId = Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID);

也就是从Android 10开始已经无法完全标识一个设备,曾经用mac地址、IMEI等设备信息标识设备的方法,从Android 10开始统统失效。而且无论你的APP是否是配过Android 10。

求高手留言解答:
在Android 10系统上,目前本人尚未找到标识设备唯一性的办法,如果大家有办法希望留言告知!!!

三、分区存储

官方文档:

外部存储访问权限范围限定为应用文件和媒体
Manage scoped external storage access

在这里插入图片描述

为解决截图中的问题,从Android Q开始,官方对外部存储进行了一定的限制。

To give users more control over their files and to limit file clutter, apps targeting Android 10 (API level 29) and higher are given scoped access into an external storage device, or scoped storage, by default. Such apps can see only their app-specific directory—accessed using Context.getExternalFilesDir()—and specific types of media. It's a best practice to use scoped storage unless your app needs access to a file that doesn't reside in either the app-specific directory or the MediaStore.

为了使用户更改的管理Sdcard中的文件,解决文件混乱的问题。从Android 10开始(API level 29),Android将对外部存储进行一定的限制。
默认情况下,对于外部存储,App只能通过Context.getExternalFilesDir()访问自己的特定文件目录;
以及系统特定的文件类型目录(例:照片、屏幕快照、视频 等)。
在这里插入图片描述

3.1、APP专属路径

对于App专属 内部存储路径外部存储路径的访问,将不再需要 READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE 权限:

  • 内部存储路径 /data/data/<包名>/
  • 外部存储路径 /storage/Android/data/<包名>/

Android Q 存储目录的获取,可参考以下文档:Android Sdcard存储目录
Android Q 存储目录的获取,可参考以下文档:Android Sdcard存储目录
Android Q 存储目录的获取,可参考以下文档:Android Sdcard存储目录

3.2、手机共享路径

读取其他APP创建的共享文件,例:相册、屏幕快照 等,则需要申请READ_EXTERNAL_STORAGE权限:

3.3、Downloads文件夹

读取手机的Downloads文件夹,不需要任何权限,需要使用API Storage Access Framework

3.4、停用Andorid 10的分区存储

对于适配难度较大的应用,Android提供了一种方式可以暂时停用分区存储功能
在androidmanifest配置文件中将requestLegacyExternalStorage设置为true,可以停用分区存储
requestLegacyExternalStorage设置为true,可以迅速适配Android 10;但Android11及以上版本,还需进行分区存储适配

<manifest ... >
  <application android:requestLegacyExternalStorage="true"  >
  </application>
</manifest>

官方描述如下:
https://developer.android.google.cn/training/data-storage/use-cases

在这里插入图片描述

四、权限相关

主要包括:

  • 在后台运行时访问设备位置信息
  • 从后台启动 Activity 的限制
  • 屏幕录制
  • 摄像头和麦克风
  • 剪切板隐私限制

4.1、在后台运行时访问设备位置信息

Android 10 引入了 ACCESS_BACKGROUND_LOCATION 权限。
若应用在后台运行时,访问手机位置,需要动态申请该权限,用户则可以选择拒绝。

官方给出的数据,大部分用户对位置信息是比较敏感的。而且大部分用户是不允许应用在后台使用位置信息的。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.2、从后台启动 Activity 的限制

具体内容请查看官方文档

4.3、屏幕录制

不需要手动申请权限,但官方 API内部会向用户弹窗申请权限

在这里插入图片描述

4.4、摄像头和麦克风

Android 9 摄像头和麦克风 后台权限已经移除了

4.5、活动探知——新增权限

在这里插入图片描述

4.6、剪切板隐私限制

从Android P开始,除非你的应用是默认输入法,否则它无法访问用户的剪贴板数据;但向剪切板写入数据不影响。

五、新功能——夜间模式

关于夜间模式,感兴趣的同学,可以查看我的另一篇文档:

Android Q 深色主题

六、参考文章

Android 10 Scoped Storage

= THE END =

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

目录
相关文章
|
6月前
|
Web App开发 移动开发 小程序
"项目中mpaas升级到10.2.3 适配Android 14之后 app中的H5以及小程序都访问不了,
"项目中mpaas升级到10.2.3 适配Android 14之后 app中的H5以及小程序都访问不了,显示“网络不给力,请稍后再试”,预发内网版本不能使用,线上版本可以正常使用,这个是什么原因啊,是某些参数没有配置吗,还是说是一些参数改错了?
108 2
|
Android开发
Android 全屏适配刘海机型
Android 全屏适配刘海机型
183 0
|
2月前
|
调度 Android开发 UED
Android经典实战之Android 14前台服务适配
本文介绍了在Android 14中适配前台服务的关键步骤与最佳实践,包括指定服务类型、请求权限、优化用户体验及使用WorkManager等。通过遵循这些指南,确保应用在新系统上顺畅运行并提升用户体验。
199 6
|
4月前
|
IDE API Android开发
安卓与iOS开发环境的差异及适配策略
在移动应用开发的广阔舞台上,Android和iOS两大操作系统各据一方,各自拥有独特的开发环境和工具集。本文旨在深入探讨这两个平台在开发环境上的关键差异,并提供有效的适配策略,帮助开发者优化跨平台开发流程。通过比较Android的Java/Kotlin和iOS的Swift/Objective-C语言特性、IDE的选择、以及API和系统服务的访问方式,本文揭示了两个操作系统在开发实践中的主要分歧点,并提出了一套实用的适配方法,以期为移动开发者提供指导和启示。
|
3月前
|
安全 Java Android开发
Android 14适配Google play截止时间临近,适配注意点和经验
本文介绍了Android 14带来的关键更新,包括性能优化、定制化体验、多语言支持、多媒体与图形增强等功能。此外,还强调了适配时的重要事项,如targetSdkVersion升级、前台服务类型声明、蓝牙权限变更等,以及安全性与用户体验方面的改进。开发者需按官方指南更新应用,以充分利用新特性并确保兼容性和安全性。
272 0
|
6月前
|
编解码 人工智能 测试技术
安卓适配性策略:确保应用在不同设备上的兼容性
【4月更文挑战第13天】本文探讨了提升安卓应用兼容性的策略,包括理解平台碎片化、设计响应式UI(使用dp单位,考虑横竖屏)、利用Android SDK的兼容工具(支持库、资源限定符)、编写兼容性代码(运行时权限、设备特性检查)以及优化性能以适应低端设备。适配性是安卓开发的关键,通过这些方法可确保应用在多样化设备上提供一致体验。未来,自动化测试和AI将助力应对设备碎片化挑战。
686 4
|
存储 5G API
Android 11 来袭,一起来看看怎么适配(三)
Android 11 来袭,一起来看看怎么适配
|
安全 Shell 测试技术
Android 11 来袭,一起来看看怎么适配(二)
Android 11 来袭,一起来看看怎么适配
|
安全 API 开发工具
Android14 适配之——targetSdkVersion 升级到 34 需要注意些什么?(下)
Android14 适配之——targetSdkVersion 升级到 34 需要注意些什么?(下)
1310 0
|
存储 缓存 安全
Android14 适配之——现有 App 安装到 Android14 手机上需要注意些什么?
Android14 适配之——现有 App 安装到 Android14 手机上需要注意些什么?
518 0
下一篇
无影云桌面