Android(安卓)Q 带来哪些变化
Android 新版本Q已经发布,相关文档也已经更新到官方网站,这里对变更做一些总结,希望能帮助大家理解。
这次更新的思路,依然是用更严格的控制,提高稳定性,降低功耗等等
1. 适用于所有应用的变更
- 访问non-SDK接口的限制
从9.0开始,谷爷开始加强非sdk api的管理,逐步限制开发者访问未开放的api,Q版本会比9.0更加严格,什么是non-SDK Interface,大家可以简单理解,没有在sdk文档里面出现的接口,google给出的官方理由,help improve the user and developer experience and reduce the risks of crashes for users and emergency rollouts for developers;non-SDK interfaces are subject to change without notice,总而言之,照着sdk文档写就没问题了
这些api会有三个级别:
- Blacklist
严格限制访问的接口,app的target api不同,会有差异,如果访问这些API, 系统会跑出error
Means of access | Result |
---|---|
Dalvik instruction referencing a field | NoSuchFieldError thrown |
Dalvik instruction referencing a method | NoSuchMethodError thrown |
Reflection via Class.getDeclaredField() or Class.getField() | NoSuchFieldException thrown,Non-SDK members not in results |
Reflection via Class.getDeclaredMethod(), Class.getMethod() | NoSuchMethodException thrown,Non-SDK members not in results |
JNI via env->GetFieldID() | NULL returned, NoSuchFieldError thrown |
JNI via env->GetMethodID() | NULL returned, NoSuchMethodError thrown |
- Greylist
这个是个相对概念,比如Android 9 (API level 28)上面限制使用的api,而你的target api是小于28的,这部分api就属于greylist,使用这些api,不会引起崩溃,在9.0手机上面运行,会打印如下的log:
Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)
- Whitelist
这些api可以放心使用
- Wi-Fi直连相关的广播不再发送
WIFI_P2P_STATE_CHANGED_ACTIONIndicates whether Wi-Fi P2P is enabledWIFI_P2P_PEERS_CHANGED_ACTIONIndicates that the available peer list has changed.WIFI_P2P_CONNECTION_CHANGED_ACTIONIndicates the state of Wi-Fi P2P connectivity has changed.WIFI_P2P_THIS_DEVICE_CHANGED_ACTIONIndicates this device's configuration details have changed.
需要调用相应的get()方法获取状态
-权限警告
适配过6.0的同学,应该有印象,在6.0之后的系统,如果targetSdkVersion大于23的话,申请权限,会弹出权限的提示框。对于targetSdkVersion小于23的情况,不会受影响。这次升级,补充了后者。当用户首次运行以 Android 6.0(API 级别 23)以下的版本为目标平台的任何应用时,Android 平台会向用户发出警告。如果此应用要求用户授予权限,则系统会先向用户提供调整应用权限的机会,然后才会允许此应用首次运行。
值得一提的,google对应用上架play store的targetSdkVersion做了如下规定:
API级别要求 | 开始日期 |
---|---|
Android 8.0(API 级别 26) | 2018 年 8 月 1 日:新应用必须符合/2018 年 11 月 1 日:应用更新必须符合 |
Android 9(API 级别 28) | 2019 年 8 月 1 日:新应用必须符合/2019 年 11 月 1 日:应用更新必须符合 |
国内比较大的应用商店(比如华为)也开始沿用google的这一政策,日期上面较google稍微宽松,所以大家不要心存侥幸了,老老实实开始适配吧
-应用使用情况
从Android 9开始,google在pixel手机上面推了一款数字健康(Digital Wellbeing)的应用,在设置里面可以打开,可以了解自己在 Pixel 手机上花费时间的方式,Q上面做了如下的一些优化,感兴趣的朋友,可以升级系统体验一下。
- UsageStats 应用使用情况的改进
当在分屏或画中画模式下使用应用时,Android Q 现在能够使用 UsageStats 准确地跟踪应用使用情况。
此外,Android Q 现在可以跟踪免安装应用的使用情况。 - 按应用开启灰度模式
Android Q 现在可以将应用设为灰度显示模式 - 暂停方面的改进
在 Android Q 中,暂停的应用无法再播放音频。
- 外部存储空间变更
Android Q 在外部存储设备中为每个应用提供了一个“隔离存储沙盒”,任何其他应用都无法直接访问自己应用的沙盒文件(注意:通常应用卸载后,沙盒中的文件会消失)。以下变更对所有targetSdkVersion>=Q的应用及新安装的应用有效,对于低版本应用,和跟随P以下系统升级上来的情况,会运行一个兼容模式,直到应用被卸载重装,各位童鞋乖乖适配吧,谁都难保证自己的应用不被卸载重装。
- 访问自己的文件
不需要任何权限,在外部存储设备中存储文件的最佳位置是 Context.getExternalFilesDir() 返回的位置,例如,要访问或保存应用私有图片,请调用 Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)。如果想在卸载后保留文件,需要将文件保存到MediaStore:
a. 至少应为 DISPLAY_NAME 和 MIME_TYPE 列提供值。
b. (可选)您可以使用 PRIMARY_DIRECTORY 和 SECONDARY_DIRECTORY 列来影响文件在磁盘上的存储位置。
c. 保留 DATA 列不定义。这样一来,平台便可以灵活地将文件保留在沙盒之外 - 访问其他应用的文件
Android Q 用更精细的媒体特定权限替换了 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限
路径 | 说明 |
---|---|
照片 | 需要 READ_MEDIA_IMAGES权限,使用 MediaStore.Images访问 |
视频 | 需要 READ_MEDIA_VIDEO 权限,使用MediaStore.Video访问 |
音乐 | 需要 READ_MEDIA_AUDIO 权限,使用MediaStore.Audio访问 |
下载 | 不需要权限,使用MediaStore.Downloads访问 |
- 例外
a. 存储访问框架不受权限限制
b. 默认照片管理器应用可以修改其他应用保存到照片和视频共享集合中的图片文件
c. 默认音乐应用,可以修改其他应用保存到音乐共享集合中的音频文件
d.访问照片中的位置信息,需要额外ACCESS_MEDIA_LOCATION权限,在 MediaStore 对象中,调用 setRequireOriginal() 并传入照片的 URI
- 针对后台 Activity 启动的限制
Android Q 对应用可启动 Activity 的时间施加了限制。此项行为变更有助于最大限度地减少对用户造成的中断,并且可以让用户更好地控制其屏幕上显示的内容,只有下面的四种情况能启动应用的Activity:
a.该应用具有可见窗口,例如在前台运行的 Activity
b.在前台运行的另一个应用发送属于该应用的 PendingIntent
c.系统发送属于该应用的 PendingIntent,一般是用户点了通知
d.系统向应用发送广播,这样的广播越来越少了
那开发者如何让一个后台的事件被用户看到呢?发个通知吧!!!
-用户可控制应用对设备位置信息的访问权限
Android Q 可让用户更好地控制应用何时能够访问设备位置信息,应用请求位置信息访问权限时,用户会看到
Android Q 引入了新的位置权限 ACCESS_BACKGROUND_LOCATION。与现有的 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION 权限不同,新权限仅会影响应用在后台运行时对位置信息的访问权。除非应用的某个 Activity 可见或应用正在运行前台服务,否则应用将被视为在后台运行。
a. targeSdkVersion >= Q
b. targetSdkVersion < Q
- 如果您的应用为 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 声明了 标签,则系统会在安装期间自动为 ACCESS_BACKGROUND_LOCATION 添加 标签。
- 如果您的应用请求了 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION,系统会自动将 ACCESS_BACKGROUND_LOCATION 添加到请求中。
-数据和标识符变更
- 联系人亲密程度
从 Android Q 开始,平台不再跟踪联系人亲密程度信息。因此,如果您的应用对用户的联系人进行搜索,则系统将不再按互动频率对搜索结果排序。
联系人提供程序指南包含一项描述特定字段和方法的声明(从 Android Q 开始,这些字段和方法在所有设备上已作废)。 - 随机选择的 MAC 地址
默认情况下,搭载 Android Q 的设备会传输随机选择的 MAC 地址。如果您的应用处理企业用例,平台会提供几个新的 API:
a. 获取随机选择的 MAC 地址:设备所有者应用和个人资料所有者应用可以通过调用 WifiConfiguration.getRandomizedMacAddress() 检索分配给特定网络的随机选择 MAC 地址。
b. 获取实际的出厂 MAC 地址:设备所有者应用可以通过调用 WifiInfo.getFactoryMacAddress() 检索设备的实际硬件 MAC 地址。此方法对于跟踪设备队列非常有用。 - 访问 /proc/net 文件系统
Android Q 撤消了 /proc/net 访问权限,其中包含有关设备网络状态的信息。需要访问此信息的应用(如 VPN)应引用 NetworkStatsManager 和 ConnectivityManager 类。 - 不可重置的设备标识符
从 Android Q 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 签名权限才能访问设备的不可重置标识符(包含 IMEI 和序列号)。如果您的应用没有该权限,但您仍尝试查询标识符的相关信息,则平台的响应会因目标 SDK 版本而异:
a. 如果应用以 Android Q 为目标平台,则会发生 SecurityException。
b. 如果应用以 Android 9(API 级别 28)或更低版本为目标平台,则相应方法会返回 null 或占位符数据(如果应用具有 READ_PHONE_STATE 权限)。否则,会发生 SecurityException。 - 访问剪贴板数据
除非您的应用是默认输入法 (IME) 或是目前处于焦点的应用,否则应用无法访问剪贴板数据
- 访问相机的所有信息,都需要CAMERA权限
涉及的内容包括:
ANDROID_LENS_POSE_ROTATION
ANDROID_LENS_POSE_TRANSLATION
ANDROID_LENS_INTRINSIC_CALIBRATION
ANDROID_LENS_RADIAL_DISTORTION
ANDROID_LENS_POSE_REFERENCE
ANDROID_LENS_DISTORTION
ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE
ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE
ANDROID_SENSOR_REFERENCE_ILLUMINANT1
ANDROID_SENSOR_REFERENCE_ILLUMINANT2
ANDROID_SENSOR_CALIBRATION_TRANSFORM1
ANDROID_SENSOR_CALIBRATION_TRANSFORM2
ANDROID_SENSOR_COLOR_TRANSFORM1
ANDROID_SENSOR_COLOR_TRANSFORM2
ANDROID_SENSOR_FORWARD_MATRIX1
ANDROID_SENSOR_FORWARD_MATRIX2
- 限制开关Wifi
在Android Q上面,应用不再具有开关Wifi的能力,WifiManager.setWifiEnabled()接口总会返回false,唯一入口,在设置里面的Wifi开关
-限制对屏幕内容的访问
为了保护用户的屏幕内容,Android Q 更改了 READ_FRAME_BUFFER、CAPTURE_VIDEO_OUTPUT 和 CAPTURE_SECURE_VIDEO_OUTPUT 权限的范围,使其只能访问签名,从而禁止以静默方式访问设备的屏幕内容。需要访问设备屏幕内容的应用应使用 MediaProjection API,会显示提示,要求用户同意声明。
-从界面中移除了权限组
从 Android Q 开始,应用无法查询权限在界面中的分组方式。
2. 以 Android Q 为目标平台(targetSdkVersion>=Q)的应用
-共享内存
Ashmem 更改了 /proc//maps 中的 dalvik 映射的格式,这会影响那些直接解析映射文件的应用。如果应用依赖于 dalvik 映射格式,则应用开发者应该在设备上测试新的 /proc//maps 格式并相应地进行解析。
以 Android Q 为目标平台的应用无法再直接使用 ashmem (/dev/ashmem),而必须通过 NDK 的 ASharedMemory 类访问共享内存。此外,应用无法直接对现有 ashmem 文件描述符进行 IOCTL,而必须改为使用 NDK 的 ASharedMemory 类或 Android Java API 创建共享内存区域。这项变更可以提高使用共享内存时的安全性和稳健性,从而提高 Android 的整体性能和安全性。
-Android 运行时只接受系统生成的 OAT 文件
Android 运行时 (ART) 不再从应用进程调用 dex2oat。这项变更意味着 ART 将仅接受系统生成的 OAT 文件。
-在 ART 中强制要求 AOT 正确性
过去,如果编译时和运行时的类路径环境不同,则 Android 运行时 (ART) 执行的预先 (AOT) 编译可能会导致运行时崩溃。Android Q 现在始终要求这些环境上下文相同,因而导致出现了以下行为变更:
- 自定义类加载器(即应用编写的类加载器,与 dalvik.system 软件包中的类加载器不同)并非由 AOT 编译。这是因为 ART 无法在运行时了解自定义的类查找实现。
- 辅助 dex 文件(即由主 APK 外的应用手动加载的 dex 文件)现在由 AOT 在后台进行编译,由于首次使用编译可能代价过高,因此会导致在执行前出现意外的延迟。请注意,对于应用,建议您采用拆分方法,并弃用辅助 dex 文件。
- Android 中的共享库(Android 清单中的 和 条目)现在具有新的类加载器层次结构。
-针对全屏 Intent 的权限变更
以 Android Q 或更高版本为目标平台并使用涉及全屏 Intent 的通知的应用必须在其应用的清单文件中请求 USE_FULL_SCREEN_INTENT 权限。这是普通权限,因此,系统会自动为请求权限的应用授予此权限。
如果以 Android Q 或更高版本为目标平台的应用试图创建使用全屏 Intent 的通知,而不请求 USE_FULL_SCREEN_INTENT 权限,则系统会忽略此全屏 Intent 并输出以下日志消息:Package [pkg]: Use of fullScreenIntent requires the USE_FULL_SCREEN_INTENT permission
- 访问 USB 串行设备需要用户授予权限
如果您的应用以 Android Q 为目标平台,则该应用只能在用户授予其访问 USB 设备或配件的权限后才能读取序列号
-telephony, Wi-Fi, Bluetooth APIs 需要ACCESS_FINE_LOCATION 权限
很多api,目前都需要ACCESS_FINE_LOCATION 权限
- WIFI配置信息限制
只有系统应用,能够配置Wifi 网络信息,以下接口使用会有问题:
- getConfiguredNetworks() 返回空list
- 返回integer的api,目前只会返回-1 ,比如addNetwork() 或 updateNetwork()
- 返回boolean的api,目前只会返回false,比如removeNetwork(), reassociate(), enableNetwork(), disableNetwork(), reconnect(), disconnect()等
-身体活动识别
Android Q 针对需要检测用户动作(例如步行、骑车或坐车)的应用引入了一个新的 ACTIVITY_RECOGNITION 运行时权限。此项权限旨在让用户了解设备传感器数据在“设置”中的使用方式。
更多相关文章
- Android持久化技术之文件的读取与写入实例详解
- android MultiDex multidex原理下超出方法数的限制问题(三)
- 第一次尝试翻译本书
- 在android中开发快速地搜索手机文件引擎实例
- Android/Java 压缩/解压/加密文件/zip
- Android原生和React Native 混合旧项目的开发环境搭建及打包
- (续)Android热更新:Tinker热修复与Walle多渠道打包
- android程序---->android多线程下载(一)
- 2011.8.17---2011.8.18 续(android的classloader)