1、Google 2019年 Andnroid Q版本发布计划
根据谷歌的计划,Android Q版本最终会在下半年9月发布。8月现在已经发布了beta5版本,基本上API不会有太大的改动。
具体明细请查看官方链接:https://developer.android.google.cn/preview/overview.html
2、需要适配的明细
2.1 标识符获取(必须适配)
a、Q版本上,应用必须具有 系统级应用 的特许权限(READ_PRIVILEGED_PHONE_STATE),才能访问设备的不可重置标识符(包含 IMEI 和序列号),
影响在 Q 上运行的所有应用,即使这些应用以 Android 9(API 为 28)或更低版本为 targetSdkVersion。
对应用依赖设备ID的功能产生影响:调用TelephonyManager.getDeviceId,会报 SecurityException
适配建议:
官方建议使用 AndroidId 或者 UUID
风险:AndroidId 有没有可能出现重复,重复的几率多大?
b、Q版本默认 MAC地址随机,影响在 Q 上运行的所有应用。
适配建议:
(1) 获取实际的mac地址,可以使用 设备管理器DevicePolicyManager,需要申请设备管理权限。
(2) level 24(7.0)以上,可以 遍历循环所有的网络接口(NetworkInterface.getNetworkInterfaces()),找到接口是wlan0的,经pixel xl (Q版本)测试,可行 :
需要适配代码:
(2) IMEI获取:
TelephonyManager tm = (TelephonyManager)context.getSystemService("phone");
tm.getDeviceId();
替换为:
QAdaptManager..getImei(context)
(2)MAC地址获取:
WifiManager wifi = (WifiManager)context.getSystemService("wifi");
WifiInfo info = wifi.getConnectionInfo();
String mac = info.getMacAddress();
替换为:
QAdaptManager.getMac(context)
(3)还有 ContextUtil.invokeTelephonyManagerMethod 这个反射调用方法,基本上都会报错。
而且会抛出异常,可以修改为 不抛出异常,有异常是直接返回null
2.2 非SDK接口限制(必须适配)
Android 平台开始限制您的应用在 Android 9(28)中使用非 SDK 接口,灰名单和黑名单的非 SDK 接口已有更新。
适配建议:
依赖非SDK接口的应用应尽快迁移到 SDK 替代方案,如部分非SDK接口无替代方案,则请求新的公共API。
谷歌提供了检查工具: veridex,有mac,linux版本,检查后的结果中,会有4类限制接口:
(1)blacklist:黑名单,调用就会报错。也是我们项目中必须解决的非SDK接口
(2)greylist:灰名单,即当前版本仍能使用的非SDK接口,但在下一版本中可能变成被限制的非SDK接口
(3)greylist-max-o:在targetSDK<=O中能使用,但是在targetSDK>=P中被限制的非SDK接口
(4)greylist-max-p:在targetSDK<=P中能使用,但是在targetSDK>=Q中被限制的非SDK接口,例如 在Q版本中调用就会报错
报错举例:Accessing hidden field Landroid/widget/ImageView;->mMaxHeight:I (greylist-max-p, reflection, denied)
veridex 工具mac版本下载: veridex-mac.zip
黑名单,greylist-max-o,greylist-max-p的非SDK接口,必须要替换或去掉。灰名单的接口可以后续替换或去掉。
veridex工具的缺陷:只能检测到通过反射实现的调用,无法检测到通过 JNI 实现的调用。
注意:黑名单和灰名单在具有相同Android版本的不同OEM设备上是否相同?
OEM可以将自己的接口添加到黑名单,但是它们无法从AOSP黑色或灰名单中删除接口。
2.3 外部存储沙箱限制(必须适配)
以 Android Q (29)为targetSdkVersion的应用,Q 更改了应用对设备外部存储设备中的文件(存储在sdcard 下的文件)的访问方式,只有满足相关条件,应用才能访问其他应用创建的文件。
适配建议:
a、如果App以 29 为 targetSdkVersion,则在访问外部存储设备中的文件时会有沙箱限制,应用对其专有目录下的文件始终拥有读/写权限。
只有在满足以下两个条件时,您的应用才能访问其他应用创建的文件:
(1)您的应用已获得 READ_EXTERNAL_STORAGE 权限。
(2)这些文件位于以下其中一个明确定义的媒体集合中:
照片:存储在 MediaStore.Images 中。
视频:存储在 MediaStore.Video 中。
音频:存储在 MediaStore.Audio 中,对应目录 Picture。
如何访问:
文件位置 | 需要权限 | 访问方法(*) | 卸载时是否删除 |
---|---|---|---|
应用缓存目录 | 没有 |
| 是 |
多媒体(照片、视频、音频) | READ_EXTERNAL_STORAGE 访问其他应用程序的文件 | MediaStore | 否 |
下载(文件) 目录:Downloads | 没有 | 存储访问框架(调用系统的文件选择器) | 否 |
有权限的情况下,如果直接用 Environment.getExternalStorageDirectory() 方式访问, 会报 FileNotFoundException 的错误。
建议:使用 缓存目录 的方式,保存和访问文件。
警告:明年所有应用程序的主要平台版本都需要执行存储空间沙箱限制,与 targetSdkVersion 级别无关。
b、暂时豁免 Q 的外部存储沙箱限制,有2种方法:
(1) targetSdkVersion 为 Android 9(28)或更低。
(2)targetSdkVersion 为 29,manifest 配置,application 中 android:requestLegacyExternalStorage="true"
这种情况下,用 Environment.getExternalStorageDirectory() 方式访问,可以正常访问。
c、FileProvider方式
需要适配代码:
文件路径获取:
Environment.getExternalStorageDirectory() + File.separator + "文件目录"
替换为:
QAdaptManager.getFilePath(context, "文件目录")
注意:安装调试APP时,如果targetSdkVersion是由 29 以下升级至 29,(即如果APP是更新安装,旧版本targetSdkVersion是29以下,新版本为29) 则不会受这个限制。
2.4 默认为所有TLS连接启用TLS 1.3
默认情况下为所有TLS连接启用 TLS 1.3。您可以SSLContext通过调用获取禁用TLS 1.3的 SSLContext.getInstance("TLSv1.2")。
还可以通过调用setEnabledProtocols() 适当的对象在每个连接的基础上启用或禁用协议版本
适配建议:
影响 https 协议,需要测试 https,查看是否需要适配。
2.5 targetSdkVersion 低于23时警告
以低于23的API级别(或更早版本)为目标的应用程序,将导致操作系统在安装是,请求敏感权限时,向用户显示警告。
适配建议:
targetSdkVersion 升级到23以上。
2.6 剪贴板限制
任何不在前台或设置为默认输入法的应用程序,都无法以任何方式读取剪贴板。
2.7 后台应用启动
对应用可启动 Activity 的时间施加了限制,只有在满足相关条件时才能启动 Activity。此项行为变更适用于在 Android Q 上运行的所有应用。
2.8 获取位置信息
Q 引入了新的位置权限,区分应用前台和后台获取位置信息。如果您的应用在后台时请求访问设备位置信息,则会影响您的应用。
如果用户只授权前台获取位置信息权限, 应用在返回后台后则不能再获取位置信息。
2.9 待定
申请全屏 需要权限
官方描述:需要界面全屏,必须在manifest文件中声明 USE_FULL_SCREEN_INTENT 权限,该权限是一个普通权限,系统会自动授权。
实际测试: Q设备,没有这个权限,也能全屏。 Q 和 Q以下设备不会报错。
3、第三方的适配
3.1 加固版本兼容
Android每个大版本升级,加固方案商都会对android大版本适配和兼容。依赖加固固件的应用需要及时更新最新的加固固件来适配Android新版本。
3.2 第三方SDK兼容
应用会依赖第三方的SDK Jar或Native so库等第三方SDK,Android大版本升级第三方SDK会存在不兼容的问题,需要推动以及更新依赖的第三方SDK适配 Q。
4、大厂提供的适配文档
vivo适配文档 链接:https://dev.vivo.com.cn/documentCenter/doc/235
5、Android Studio 开发环境 升级
(1) Android Studio 升级到 3.4.1 以上的 稳定版本,不建议使用 不稳定的CANARY 和 RC 版本。
(2) Android SDK level 升级到 29。
(3) Android SDK Build-Tools 升级到 28 以上。
(4)gradle 配置:
compileSdkVersion 29
buildToolsVersion '28.0.3' 或 28.0.3以上
targetSdkVersion 29
(5) Android Q 开发测试设备:
Pixel 或者 国内适配了Q的机型: 华为Mate 20 Pro,一加6T,OPPO Reno,Realme 3 Pro,vivo X27,vivo NEX S,vivo NEX A,小米9,小米MIX 3 5G