Android Q (十七) Android Q 行为变更:以 Android Q 为目标平台的应用

Android Q 行为变更:以 Android Q 为目标平台的应用

Android Q 平台做了一些行为变更,这些变更可能会影响您的应用。以下行为变更仅影响以 Android Q 或更高版本为目标平台的应用。如果您的应用将 targetSdkVersion 设为“android-Q”或更高版本,则应修改您的应用以适当地支持这些行为(如果适用)。

此外,请务必查看对在 Android Q 上运行的所有应用都有影响的行为变更列表。

注意:除了此页面所列的变更以外,Android Q 还引入了大量变更和限制以增强用户隐私保护。有关详情,请参阅隐私权页面。

SDK 接口的受限情况出现变化

为了确保应用稳定性和兼容性,Android 平台开始限制您的应用可在 Android 9(API 级别 28)中使用哪些非 SDK 接口。Android Q 包含更新后的受限非 SDK 接口列表(基于与 Android 开发者之间的协作以及最新的内部测试)。

如果您不打算以 Android Q 为目标平台,那么其中一些变更可能不会立即对您产生影响。虽然您目前可以使用灰名单中的一些非 SDK 接口(取决于您应用的目标 API 级别),但如果您使用任何非 SDK 方法或字段,则应用无法运行的风险终归较高。

如果您不确定自己的应用是否使用了非 SDK 接口,则可以测试该应用进行确认。如果您的应用依赖于非 SDK 接口,则应该开始计划迁移到 SDK 替代方案。如果您无法为应用中的某项功能找到使用非 SDK 接口的替代方案,则应该请求新的公共 API。

有关详情,请参阅非 SDK 接口在 Android Q 中的受限情况出现变化以及对非 SDK 接口的限制。

共享内存

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

你可能感兴趣的:(android,版本更新)