行为变更:以 API 29 及更高级别为目标平台的应用

Android 10 包含更新后的系统行为变更,这些变更可能会影响您的应用。 本页列出的变更仅适用于 API 29 或更高版本。如果您的应用将 targetSdkVersion 设置为“29”或 您应修改自己的应用以适当地支持这些行为, 。

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

注意 :除了本页列出的变更外,Android 10 引入了大量基于隐私的更改和限制,包括 以下:

  • 分区存储
  • 获取 USB 设备序列号
  • 能够启用、停用和配置 Wi-Fi
  • 连接 API 的位置信息权限

这些变更会影响以 API 级别 29 或更高级别为目标平台的应用, 加强对用户隐私的保护。如需详细了解如何支持这些变更,请参阅隐私权变更页面。

有关限制非 SDK 接口的更新

为了确保应用稳定性和兼容性,Android 平台开始限制 哪些非 SDK 接口 。Android 10 包含经过更新的列表 受限的非 SDK 接口(基于与 Android 开发者的协作) 以及最新的内部测试我们的目标是 在限制使用非 SDK 接口之前,可能会提供替代方案。

如果您不以 Android 10(API 级别 29)为目标平台,那么其中一些变更 可能不会立即对您产生影响。然而,虽然您目前仍可以使用一些非 SDK 接口(具体取决于应用的目标 API 级别),但只要您使用任何非 SDK 方法或字段,终归存在导致应用出问题的显著风险。

如果您不确定自己的应用是否使用了非 SDK 接口,可以 测试你的应用 一探究竟。如果您的应用依赖于非 SDK 接口,您应开始规划 迁移到 SDK 替代方案。然而,我们知道某些应用具有使用非 SDK 接口的有效用例。如果你找不到替代项 为应用中的功能使用非 SDK 接口,您应该 请求新的公共 API

如需了解详情,请参阅 Android 10 中有关限制非 SDK 接口的更新以及针对非 SDK 接口的限制

共享内存

Ashmem 更改了 /proc/<pid>/maps 中 dalvik 映射的格式, 直接解析地图文件的应用的影响。应用开发者应 在运行 Android 10 或更高版本,如果应用依赖于 dalvik 映射格式。

以 Android 10 为目标平台的应用无法直接使用 ashmem (/dev/ashmem),而必须通过 NDK 的 ASharedMemory访问共享内存。此外,应用无法直接对现有 ashmem 文件描述符进行 IOCTL 必须改用 NDK 的 ASharedMemory 类或 Android Java 用于创建共享内存区域的 API。这项变更可提高安全性 在使用共享内存时的稳健性,提高性能和安全性 整体表现

移除了应用主目录的执行权限

从可写的应用主目录执行文件的步骤如下: 违反 W^X 政策。 应用应仅加载嵌入到应用 APK 文件中的二进制代码。

以 Android 10 为目标平台的不可信应用无法调用 execve() 直接放在应用主目录中的文件上。

此外,以 Android 10 为目标平台的应用也无法进行内存中修改 通过 dlopen() 打开并预期的文件中的可执行代码 以便将这些更改写入磁盘 已通过可写文件描述符映射 PROT_EXEC。这包括 包含文本重定位的共享对象 (.so) 文件。

Android 运行时只接受系统生成的 OAT 文件

Android 运行时 (ART) 不再从应用中调用 dex2oat 过程。这项变更意味着,ART 将仅接受 生成内容

在 ART 中强制要求 AOT 正确性

过去,Android 应用执行的预先 (AOT) 编译 如果未使用类路径环境,运行时 (ART) 可能会导致运行时崩溃 与编译时和运行时相同Android 10 及更高版本 始终要求这些环境上下文相同,从而导致 行为上的以下变化:

  • 自定义类加载器,即由应用编写的类加载器,与类加载器不同 dalvik.system 软件包中的加载器(并非 AOT 编译)。这是因为 ART 无法在运行时了解自定义类查找实现。
  • 辅助 dex 文件,即由不在 主 APK - 在后台 AOT 编译。这是因为 编译可能代价过高,导致在加载前出现不必要的延迟 执行。请注意,对于应用,采用分块并弃用辅助组件 建议使用 dex 文件。
  • Android 中的共享库(<library> 和 <uses-library>Android 清单中)是使用不同的 类加载器层次结构。

针对全屏 Intent 的权限变更

以 Android 10 或更高版本为目标平台且通过 全屏 意图USE_FULL_SCREEN_INTENT 权限。这属于正常情况 权限,因此系统会 并自动将其授予发出请求的应用。

如果以 Android 10 或更高版本为目标平台的应用尝试创建 使用全屏 intent 通知,而不请求必要的 权限,系统将忽略全屏 intent,并输出以下内容 日志消息:

Package your-package-name: Use of fullScreenIntent requires the USE_FULL_SCREEN_INTENT permission

支持可折叠设备

Android 10 包含支持可折叠设备和大屏设备的变更。

当应用在 Android 10 上运行时, onResume()onPause() 方法有效 。当多个应用同时在多窗口模式或 多显示屏模式,可见堆栈中所有可聚焦的顶层 activity 处于已恢复状态,但只有一个,即“在最顶层处于已恢复状态”活动 在 Android 10 之前的版本上运行时,只有一个 一次可以恢复系统中的一个 activity,而所有其他可见的 activity 活动已暂停。

请不要将“焦点位于”的 Activity 与“在最顶层处于已恢复状态”的 Activity 混淆。系统会根据 Z-Order 来为 activity 分配优先级,以便为用户最后进行互动的 activity 提供更高的优先级。activity 可能在顶层处于已恢复状态,但焦点却并不位于其上(例如,如果通知栏展开)。

在 Android 10(API 级别 29)及更高版本中,您可以订阅 onTopResumedActivityChanged() 回调 在 activity 获取或失去最顶层处于已恢复状态时接收通知 排名。这相当于 Android 10 之前版本中的已恢复状态;如果您的应用使用的专用或单一资源可能需要与其他应用共享,这可以作为有用的提示。

行为 resizeableActivity 也已更改。如果应用设置了 resizeableActivity=false(API 级别 29)或更高版本,它可能会处于兼容模式 当可用屏幕尺寸发生变化时,或者当应用从一个屏幕切换到 另一个。

应用可以使用 android:minAspectRatio 属性来指示屏幕 宽高比

从版本 3.5 开始,Android Studio 的模拟器工具 包括 7.3 英寸和 8 英寸虚拟设备测试您的代码。

如需了解详情,请参阅针对可折叠设备设计应用