Android 10.0 行为变更(二)针对 Android 10.0 的应用

注意:

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

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

官方明确指出:目标是在限制使用非 SDK 接口之前确保有可用的公开替代方案。
反射或JNI必须要有替代方案!

如果您不打算以 Android Q 为目标平台,那么其中一些变更可能不会立即对您产生影响。虽然您目前可以使用灰名单中的一些非 SDK 接口(取决于您应用的目标 API 级别),但如果您使用任何非 SDK 方法或字段,则应用无法运行的风险终归较高。
要了解详情,请参阅非 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 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 清单属性的行为也发生了变化。
如果某个应用在 Android Q 中设置 resizeableActivity=false,则当可用屏幕尺寸发生变化或者该应用从一个屏幕移到另一屏幕时,它可能处于兼容模式下。

应用可以使用新的 android:minAspectRatio 属性来指示应用是否支持新的屏幕宽高比

从版本 3.5 开始,Android Studio 的模拟器工具将包含 7.3" 和 8" 的虚拟设备,以便您使用 Android Q 系统映像测试代码。

如需了解详情,请参阅打造适用于可折叠设备的应用。

java.io.FileChannel.map() 更改

非标准文件(例如 /dev/zero)已不再支持 FileChannel.map(),其大小无法使用 truncate() 进行更改。

  • 之前的 Android 版本会生吞掉 truncate() 返回的错误,
  • 但 Android Q 会抛出 IOException。如果您需要旧行为,则必须使用原生代码。

你可能感兴趣的:([android])