Android Q 适配指南

Android Q 适配指南

官方文档:
developer.android.com/about/versi…css

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

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

1、非SDK接口

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

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

1.一、非SDK接口检测工具

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

veridex使用方法:app

appcompat.sh --dex-file=apk.apk
复制代码
在这里插入图片描述
在这里插入图片描述

1.二、blacklist、greylist、greylist-max-o、greylist-max-p含义

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

  • 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 截图ide

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

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

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

1.三、Android Q 加固 与 热修复

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

  • 加固
    ui

    在这里插入图片描述
    在这里插入图片描述
  • 热修复

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

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

2、设备ID

从Android 10开始已经没法彻底标识一个设备,曾经用mac地址、IMEI等设备信息标识设备的方法,从Android 10开始通通失效。并且不管你的APP是不是配过Android 10。

2.一、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等信息,可按如下方式进行适配:

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

2.二、Mac地址随机分配

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

2.三、如何标识设备惟一性?

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

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

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系统上,目前本人还没有找到标识设备惟一性的办法,若是你们有办法但愿留言告知!!!

3、外部存储

官方文档:

外部存储访问权限范围限定为应用文件和媒体
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.一、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.二、手机共享路径

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

3.二、手机共享路径

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

3.三、Downloads文件夹

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

4、权限相关

主要包括:

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

4.一、在后台运行时访问设备位置信息

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

官方给出的数据,大部分用户对位置信息是比较敏感的。并且大部分用户是不容许应用在后台使用位置信息的。

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

4.二、从后台启动 Activity 的限制

具体内容请查看官方文档

4.三、屏幕录制

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

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

4.四、摄像头和麦克风

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

4.五、活动探知——新增权限

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

5、新功能——夜间模式

关于夜间模式,感兴趣的同窗,能够查看个人另外一篇文档:

Android Q 深色主题

6、参考文章

Android 10 Scoped Storage

相关文章
相关标签/搜索