Android Q 平台做了一些行为变更,这些变更可能会影响您的应用。以下行为变更仅影响以 Android Q 或更高版本为目标平台的应用。如果您的应用将 targetSdkVersion
设为“android-Q”或更高版本,则应修改您的应用以适当地支持这些行为(如果适用)。
此外,请务必查看对在 Android Q 上运行的所有应用都有影响的行为变更列表。
注意:除了此页面所列的变更以外,Android Q 还引入了大量变更和限制以增强用户隐私保护。有关详情,请参阅Google隐私权页面。
为了帮助确保应用稳定性和兼容性,Android 平台开始限制您的应用可在 Android 9(API 级别 28)中使用哪些非 SDK 接口。Android Q 包含更新后的受限非 SDK 接口列表(基于与 Android 开发者之间的协作以及最新的内部测试)。我们的目标是在限制使用非 SDK 接口之前确保有可用的公开替代方案。
如果您不打算以 Android Q 为目标平台,那么其中一些变更可能不会立即对您产生影响。虽然您目前可以使用灰名单中的一些非 SDK 接口(取决于您应用的目标 API 级别),但如果您使用任何非 SDK 方法或字段,则应用无法运行的风险终归较高。
如果您不确定自己的应用是否使用了非 SDK 接口,则可以测试该应用进行确认。如果您的应用依赖于非 SDK 接口,则应该开始计划迁移到 SDK 替代方案。不过,我们知道某些应用具有使用非 SDK 接口的有效用例。如果您无法为应用中的某项功能找到使用非 SDK 接口的替代方案,则应该请求新的公共 API。
有关详情,请参阅非 SDK 接口在 Android Q 中的受限情况出现变化以及对非 SDK 接口的限制。
Ashmem 更改了 /proc/
以 Android Q 为目标平台的应用无法再直接使用 ashmem (/dev/ashmem),而必须通过 NDK 的 ASharedMemory 类访问共享内存。此外,应用无法直接对现有 ashmem 文件描述符进行 IOCTL,而必须改为使用 NDK 的 ASharedMemory 类或 Android Java API 创建共享内存区域。这项变更可以提高使用共享内存时的安全性和稳健性,从而提高 Android 的整体性能和安全性。
Android 运行时 (ART) 不再从应用进程调用 dex2oat
。这项变更意味着 ART 将仅接受系统生成的 OAT 文件。
过去,如果编译时和运行时的类路径环境不同,则 Android 运行时 (ART) 执行的预先 (AOT) 编译可能会导致运行时崩溃。Android Q 现在始终要求这些环境上下文相同,因而导致出现了以下行为变更:
以 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 Q 包含支持可折叠设备和大屏设备的变更。
当应用在 Android Q 中运行时,onResume() 和 onPause() 方法的工作原理是不同的。当多个应用同时在多窗口模式或多显示屏模式下显示时,可见堆栈中的所有可设置为焦点的顶层 Activity 都处于“已恢复”状态,但实际上焦点仅位于其中一个 Activity 上,即“在最顶层处于已恢复状态”的 Activity。在 Android Q 之前的版本中运行时,一次只能恢复系统中的一个 Activity,而所有其他可见 Activity 都处于已暂停状态。
请不要将“焦点位于”的 Activity 与“在最顶层处于已恢复状态”的 Activity 混淆。系统会根据 Z-Order 来为 Activity 分配优先级,以便为用户最后进行互动的 Activity 提供更高的优先级。Activity 可能在顶层处于已恢复状态,但焦点却并不位于其上(例如,如果通知栏展开)。
在 Android Q 中,您可以订阅 onTopResumedActivityChanged() 回调,以便在 Activity 获取或失去在最顶层处于恢复状态的位置后收到通知。这相当于 Android Q 之前版本中的已恢复状态;如果您的应用使用的专用或单一资源可能需要与其他应用共享,则这可以作为相应提示使用。
resizeableActivity 清单属性的行为也发生了变化。如果应用设置了 resizeableActivity=false,但没有设置固定的屏幕方向或宽高比,则显示屏尺寸、屏幕方向或屏幕密度的变化会导致此应用调整大小以占满整个屏幕。如果应用设置了 resizeableActivity=false,也设置了固定的屏幕方向或宽高比,那么在显示屏发生变化后,此应用会显示黑边并调整大小以保持相应宽高比。如果 resizableActivity 设为 true(或根本未设置),则此应用的行为会保持原样,并调整大小。
应用可以声明 1:1 的宽高比,并且可以使用新属性 android:minAspectRatio。
从版本 3.5 Canary 9 开始,Android Studio 将添加相应功能以支持可折叠设备。模拟器工具将包含 7.3" 和 8" 的虚拟设备,以用于使用 Android Q 系统镜像来测试您的代码。