Android 10 功能和 API

Android 10 为用户和开发者引入了强大的功能。本文重点介绍面向开发者的功能。

要了解 API,请阅读 API 差异报告或访问 Android API 参考文档 - 查找 API 级别 29”。此外,请务必查看 Android 10 行为 (针对以 API 级别 29 为目标平台的应用所有应用)以及隐私设置 变更,了解平台变更可能涉及的方面 影响您的应用。

安全增强功能

Android 10 引入了若干安全功能, 总结。

改进了生物识别身份验证对话框

Android 10 引入了以下改进: 生物识别身份验证支持:

  • 添加了针对生物识别身份验证功能的检查。
  • 一种回退机制,可让用户使用其设备进行身份验证 PIN 码、图案或密码(如果他们无法使用生物识别技术进行身份验证) 输入。
  • 告知系统在用户之后不要求用户确认的提示 已使用隐式生物识别模态进行身份验证。例如,你可以 告知系统,在用户完成相应操作后无需进一步确认。 使用人脸身份验证进行身份验证。

直接从 APK 运行嵌入式 DEX 代码

从 Android 10 开始,您可以告知平台运行嵌入式 DEX 直接从您应用的 APK 文件中添加代码。此选项有助于防止 如果攻击者曾设法篡改了服务器上本地编译的代码, 设备。

如需了解详情,请参阅 直接从 APK 运行嵌入式 DEX 代码

TLS 1.3 支持

Android 10 增加了对 TLS 1.3。TLS 1.3 是 具有性能优势和增强安全性的 TLS 标准。我们的 基准数据表明,在某个时间段内可以建立高达 40% 的安全连接, 与 TLS 1.2 相比,使用 TLS 1.3 的速度更快。

要详细了解我们的 TLS 1.3 实施,请参阅 TLS 部分 在所有应用的行为变更中 页面

公共 Conscrypt API

从 Android 10 开始,Conscrypt 安全提供程序包含 用于传输层安全协议 (TLS) 功能的公共 API。

下面列出了 android.net.ssl 包含静态值 方法,用于访问泛型中没有的功能 javax.net.ssl API。这些类的名称可以推断为相应 javax.net.ssl 类的复数。例如,运行 javax.net.ssl.SSLSocket 的实例可以改用 SSLSockets

连接功能

Android 10 包含一些与网络和连接相关的改进。

WLAN 网络连接 API

Android 10 增加了对点对点连接的支持。借助此功能,应用可以使用 WifiNetworkSpecifier 描述所请求网络的属性,以此来提示用户更改设备连接到的接入点。点对点连接 用于非网络提供用途,例如 Chromecast 和 Google Home 硬件等辅助设备。

如需了解详情,请参阅适用于点对点的 Wi-Fi 网络请求 API 网络连接

WLAN 网络建议 API

Android 10 添加了对应用提示用户进行连接的支持 连接到 Wi-Fi 接入点。您可以提供关于要连接哪个网络的建议 目标。平台最终会根据来自您的应用和其他应用的输入来选择要接受的接入点。

如需详细了解此功能,请参阅 WLAN 建议

改进了 WLAN 高性能和低延迟模式

借助 Android 10,您可以为底层调制解调器提供提示,以最大限度地缩短延迟。

Android 10 扩展了 Wi-Fi Lock API,以有效地支持高性能 模式和低延迟模式。为了实现高性能和 低延迟模式,并且可以在低延迟模式下进一步优化延迟 模式,具体取决于调制解调器支持。

低延迟模式仅在获取锁的应用 在前台运行且屏幕处于开启状态低延迟模式 这对于实时移动游戏应用尤为有用。

DNS 解析器中的专用查找

Android 10 使用明文查找和“通过传输层安全协议 (TLS) 执行 DNS”模式,增加了对专用 DNS 查找的原生支持。之前,平台 DNS 解析器仅支持 A 和 AAAA 记录,这些记录仅允许查找与名称关联的 IP 地址,不支持任何其他记录类型。DnsResolver API 提供通用 异步解析,使您能够查询 SRVNAPTR 和 记录类型。请注意,解析响应由应用负责执行。

对于基于 NDK 的应用,请参阅 android_res_nsend

Wi-Fi Easy Connect

借助 Android 10,您可以使用 Easy Connect 配置 Wi-Fi 以替代已弃用的 WPS。 应用可以使用 该 ACTION_PROCESS_WIFI_EASY_CONNECT_URI intent。

有关此功能的详细信息,请参阅 Wi-Fi Easy Connect

Wi-Fi Direct connection API

Android 10 中的 WifiP2pConfigWifiP2pManager API 类有更新 支持快速建立到 Wi-Fi 直连的 预先确定的信息此信息通过边信道分享,例如 例如蓝牙或 NFC。

以下代码示例展示了如何使用预先确定的信息来创建群组:

Kotlin

val manager = getSystemService(Context.WIFI_P2P_SERVICE) as WifiP2pManager
val channel = manager.initialize(this, mainLooper, null)

// prefer 5G band for this group
val config = WifiP2pConfig.Builder()
    .setNetworkName("networkName")
    .setPassphrase("passphrase")
    .enablePersistentMode(false)
    .setGroupOperatingBand(WifiP2pConfig.GROUP_OWNER_BAND_5GHZ)
    .build()

// create a non-persistent group on 5GHz
manager.createGroup(channel, config, null)

Java

WifiP2pManager manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
Channel channel = manager.initialize(this, getMainLooper(), null);

// prefer 5G band for this group
WifiP2pConfig config = new WifiP2pConfig.Builder()
.setNetworkName("networkName")
.setPassphrase("passphrase")
.enablePersistentMode(false)
.setGroupOperatingBand(WifiP2pConfig.GROUP_OWNER_BAND_5GHZ)
.build();

// create a non-persistent group on 5GHz
manager.createGroup(channel, config, null);

要使用凭据加入群组,请将 manager.createGroup() 替换为 以下:

Kotlin

manager.connect(channel, config, null)

Java

manager.connect(channel, config, null);

蓝牙 LE 连接导向型频道 (CoC)

Android 10 可让您的应用使用 BLE CoC 连接来传输较大的数据 并在两个 BLE 设备之间传输音频流。此接口抽象化处理了蓝牙和 连接机制来简化实现。

电话功能

Android 10 包含一些与电话相关的改进。

通话质量方面的改进

Android 10 增加了收集有关实时 IP 多媒体子系统 (IMS) 通话,包括与网络之间的通话质量, 。

选接电话和来电显示

Android 10 为您的应用提供了一种方式来识别 疑似骚扰电话,以及接收骚扰电话 并代表用户静默拒绝。这些被屏蔽的来电的相关信息 会在通话记录中记录被屏蔽的来电,以便更清楚地了解 在用户错过通话时向其发出通知使用此 API 无需满足 从用户处获取 READ_CALL_LOG 权限,以便提供来电过滤功能 和来电显示功能

Call Redirection Service API

Android 10 更改了来电 intent 的处理方式。通过 NEW_OUTGOING_CALL 广播已废弃,取而代之的是 CallRedirectionService API。CallRedirectionService API 提供 接口,供您修改 Android 平台拨出的去电。对于 例如,第三方应用可能会取消呼叫并通过 VoIP 重新路由呼叫。

在外部存储设备中创建文件的相关改进

除了引入限定范围的 storage、 Android 10 增加了以下与外部 storage:

媒体和图形

Android 10 引入了以下媒体和图形方面的新功能和 API:

共享音频输入

Android 10 增加了两个应用同时共享音频输入的功能。 如需了解完整信息,请参阅共享音频输入

捕获播放的音频

Android 10 可让应用捕获其他应用播放的音频。 如需了解完整信息,请参阅捕获播放的音频

MediaStyle 通知中的拖动条

从 Android 10 开始,MediaStyle 通知会显示拖动条。进度条会显示 播放进度 PlaybackState.getPosition(), 并且在某些情况下,拖动条可用于跳转到播放内容中的某个位置 计划。拖动条的外观和行为受以下规则的控制:

  • 如果存在处于活动状态的 MediaSession,且其时长(由 MediaMetadata.METADATA_KEY_DURATION 指定)大于零,则会显示滑块。也就是说,对于不确定性流(如 直播和电台广播
  • 如果会话实现了 ACTION_SEEK_TO,则用户可以拖动拖动条 控制播放位置。

原生 MIDI API

借助 Android Native MIDI API (AMidi),应用开发者可以使用 使用 C/C++ 代码发送和接收 MIDI 数据, C/C++ 音频/控制逻辑,并最大限度地减少对 JNI 的需求。

有关详情,请参阅 Android Native MIDI API

MediaCodecInfo 方面的改进

Android 10 将方法 MediaCodecInfo显示更多信息 编解码器的相关信息。

如需了解详情,请参阅媒体编解码器

Thermal API

设备过热可能会限制 CPU 和/或 GPU,这可能导致 以意想不到的方式影响应用和游戏。使用复杂图形、大量图形的应用 或持续的网络活动更有可能出现问题,以及 基于芯片组和核心频率、 以及设备包装和外形规格。

在 Android 10 中,应用和游戏可以使用 Thermal API 来监控 并采取措施维持较低的耗电量以恢复正常 温度。应用注册监听器 PowerManager 中的工具,系统通过它 报告持续的热状态(从轻度、中度到严重不等), “重要”“紧急情况”和“关机”

当设备报告热应力时,各应用和游戏可以减少正在进行的活动,以此来帮助减少各个方面的耗电量。例如: 在线影音应用可能会降低分辨率/比特率或降低网络流量, 应用可能会停用 Flash 或密集的图片增强功能, 帧速率或多边形纹理,媒体应用可以降低扬声器音量, 地图应用可以关闭 GPS

Thermal API 需要新的设备 HAL 层,目前受支持 并且我们正在与设备制造商合作 以尽快为生态系统提供广泛支持。

摄像头和图片

Android 10 引入了以下与摄像头和图片相关的新功能:

单色摄像头支持

Android 9(API 级别 28)首次引入了单色摄像头功能。 Android 10 为单色摄像头支持增加了几项增强功能:

  • 增加了对 Y8 流格式的支持,以提高内存效率。
  • 支持单色原始 DNG 捕获。
  • 引入了 MONO 和 NIR CFA 枚举,以区分常规 单色摄像头和近红外摄像头。

您可以使用此功能来捕捉原生单色图片。逻辑 多摄像头设备可以使用单色摄像头作为物理子摄像头, 实现更好的弱光图像质量。

动态深度格式

从 Android 10 开始,相机可以将图片的深度数据存储在 使用名为“动态深度格式”(DDF) 的新架构创建单独的文件。应用可以 请求 JPG 图片及其深度元数据,并使用该信息 在后期处理中应用想要的模糊效果,无需修改原始照片 图片数据。

要了解此格式的规范,请参阅 动态深度格式

高效率图片文件格式

高效图片文件 (HEIF) 格式是一种标准的图片和视频格式 相较于 其他文件格式

如需详细了解文件格式,请参阅 HEIC

多摄像头方面的改进

Android 10 改进了将多个摄像头融合成单个逻辑摄像头的功能。 Android 9(API 级别 28)中引入的功能。Camera2 API 中添加了以下内容:

无障碍服务 API

Android 10 引入了以下新的无障碍服务 功能和 API:

AccessibilityNodeInfo 输入键标记

从 Android 10 开始,您可以调用 isTextEntryKey() 用于确定给定 AccessibilityNodeInfo 是否表示文本输入键 键盘或小键盘上。

无障碍对话框语音反馈

如果用户需要执行无障碍快捷方式才能启动 Android 10 允许对话框 随同文字转语音提示(如果服务请求)。

启用手势导航时的无障碍快捷方式

启用手势导航功能后 在 Android 10 中,无障碍功能 按钮不是 可见或可选。要访问无障碍服务菜单,用户必须满足以下条件 执行以下其中一项手势:

  • 双指向上滑动。
  • 双指向上滑动并按住。

物理键盘的无障碍快捷方式

在 Android 10 中,用户可以在 Ctrl+Alt+Z 来切换实体键盘。

软键盘控制器增强功能

在 Android 10 中,无障碍服务可以请求软 即使设备检测到连接了硬键盘,系统也仍会显示该键盘。 用户可以替换此行为。

用户定义的无障碍服务超时

Android 10 引入了 getRecommendedTimeoutMillis() API。此方法支持用户定义的超时, 非交互式界面元素返回值受两个用户的影响 偏好设置和无障碍服务 API。

自动填充方面的改进

Android 10 包含对自动填充服务的以下改进。

与兼容性相关的自动填充请求

您可以使用 FillRequest.FLAG_COMPATIBILITY_MODE_REQUEST 标志确定是否通过兼容性模式生成了自动填充请求。

同时保存用户名和密码

借助 SaveInfo.FLAG_DELAY_SAVE 标志,应用现在可以使用多个 activity 显示用户名、密码和其他字段。

用户与保存界面的互动

您可以通过设置操作,在保存对话框中显示或隐藏密码字段 监听器并更改相应密码的可见性 远程视图

支持更新数据集

自动填充可以更新现有的密码。例如,如果用户已经 并在用户保存了新密码后,自动填充功能会提示用户 更新现有密码,而不是保存新密码。

字段分类方面的改进

Android 10 包含对 Field Classification API 的以下改进。

UserData.Builder 构造函数

通过 UserData.Builder 构造函数已更改,以更好地与 Builder 模式保持一致。

允许将一个值映射到多种类别 ID

使用 UserData.Builder 英寸 在 Android 10 中,您现在可以将一个值映射到多种类型的类别 ID。在 如果多次添加同一个值,则会抛出异常。

改进了对信用卡号码的支持

字段分类现在可以将四位数检测为最后四位数 例如信用卡号

支持特定于应用的字段分类

Android 10 添加功能 FillResponse.setUserData(), 这允许您在会话期间设置特定于应用的用户数据。 这有助于自动填充服务检测包含特定于应用的字段的类型 内容。

界面和系统控件

Android 10 提供界面方面的以下改进:

支持 JVMTI PopFrame 功能

Android 10 增加了对 can_pop_frames 功能。调试时,此功能会 让您可以在断点处暂停并调整 局部变量、全局变量或函数的实现。如需了解详情,请参阅 Oracle 的 Pop Frame 参考页面

Surface Control API

Android 10 提供了 SurfaceControl API,用于对系统合成器 (SurfaceFlinger) 进行低级别访问。对于大多数用户而言,SurfaceView 是使用此合成器的正确方法。通过 SurfaceControl API 在某些情况下很有用,例如:

  • 同步多个表面
  • 跨进程的表面嵌入
  • 底层生命周期管理

SurfaceControl API 在 SDK 和 NDK 绑定中都可用。NDK 实现包含一个通过 API 手动交换缓冲区的 API, 合成器。这为遇到过 存在局限性 BufferQueue

WebView 挂起渲染程序检测

Android 10 引入了 WebViewRenderProcessClient 抽象类,应用可以使用该类来检测 WebView已无响应。如需使用此类,请执行以下操作:

  1. 定义您自己的子类并实现其 onRenderProcessResponsive()onRenderProcessUnresponsive() 方法。
  2. WebViewRenderProcessClient 的实例附加到一个或多个 WebView 对象。
  3. 如果 WebView 无响应,系统会调用 客户端的 onRenderProcessUnresponsive() 方法,传递 WebViewWebViewRenderProcess。(如果 WebView 是单进程,则 WebViewRenderProcess 参数为 null)。您的应用可以采取适当的操作,例如显示 对话框,询问用户是否要停止呈现过程。

如果 WebView 保持无响应状态,则系统会定期调用 onRenderProcessUnresponsive()(不超过每五秒钟一次),但不会执行任何其他操作。如果 WebView 变为响应状态 则系统只调用一次 onRenderProcessResponsive()

设置面板

Android 10 引入了设置面板,这是一个允许应用显示 和设置。这样可以防止用户 进入设置,更改设置中的 NFC移动数据 用户才能使用该应用

图 1. 用户尝试在设备打开网页时打开网页 没有连接到网络。Chrome 弹出互联网连接 设置面板...

图 2. 用户可以开启 WLAN 并选择网络 而无需离开 Chrome 应用。

例如,假设用户在设备处于打开状态时打开网络浏览器 飞行模式。在 Android 10 之前,应用只能显示常规消息 要求用户打开设置以恢复连接。对于 Android 10, 浏览器应用可以显示一个内联面板,其中显示关键连接设置 例如飞行模式、Wi-Fi(包括附近的网络)和移动数据。包含 此面板,用户无需离开应用即可恢复连接。

如需显示设置面板,请触发具有以下其中一项的 intent Settings.Panel 操作:

Kotlin

val panelIntent = Intent(Settings.Panel.settings_panel_type)
startActivityForResult(panelIntent)

Java

Intent panelIntent = new Intent(Settings.Panel.settings_panel_type);
startActivityForResult(panelIntent);

settings_panel_type 可以是以下项之一:

ACTION_INTERNET_CONNECTIVITY
显示与互联网连接相关的设置,例如飞行模式、WLAN 和移动流量。
ACTION_WIFI
显示 Wi-Fi 设置,但不显示其他连接设置。这是 对于需要通过 Wi-Fi 连接执行大型上传或 下载。
ACTION_NFC
显示与近距离无线通信(NFC) 相关的所有设置。
ACTION_VOLUME
显示所有音频流的音量设置。

共享功能方面的改进

Android 10 为共享功能提供了多项改进:

Sharing Shortcuts API

Sharing Shortcuts API 取代了直接共享 API

与被动地按需检索结果不同,Sharing Shortcuts API 不再是 允许应用提前发布直接共享目标。就是这样 ShortcutManager 可以正常工作。 由于这两个 API 类似,我们扩展了 ShortcutInfo API 来同时使用 功能。借助 Shared Shortcuts API,您可以直接将 共享目标对象。共享目标会保留在系统中 直到同一应用进行更新或卸载应用为止。

旧版“直接共享”机制仍有效,但使用该机制的应用的优先级低于使用 Sharing Shortcuts API 的应用。

ShortcutInfo.Builder 添加并增强了一些方法,以提供与共享目标有关的其他信息。

直接共享目标

您可以发布一个动态快捷方式作为直接共享目标。 请参阅发布直接共享目标

ShortcutManagerCompat 是一个新版 AndroidX API,它可以向后兼容旧版 DirectShare API。这个 是发布共享目标的首选方式。

预览文本

当应用分享文本内容时,可以选择显示 Sharesheet 界面中的内容。

请参阅添加富文本预览

了解详情

如需详细了解应用如何分享数据 请参阅将简单的数据发送到其他应用从其他应用接收简单的数据

深色主题

Android 10 提供适用于 Android 和 系统界面和设备上运行的应用。如需全面了解相关信息 请参阅深色主题

前台服务类型

Android 10 引入了 foregroundServiceType XML 清单属性,您可以将该属性包含在几个特定 服务。虽然很少适用, 前台服务类型。

下表显示了不同的前台服务类型,以及适合在其中声明特定类型的服务:

前台服务类型 应声明相应类型的服务的示例使用情形
connectedDevice 监控穿戴式设备健身跟踪器
dataSync 从网络下载文件
location 继续 用户发起的操作
mediaPlayback 播放有声读物、播客或音乐
mediaProjection 简短地录屏
phoneCall 处理正在进行的通话

Kotlin

Android 10 对 Kotlin 开发进行了以下更新。

libcore API 的可空性注释

Android 10 扩大了可为 null 性注解的覆盖范围 用于 libcore API 的 SDK。借助这些注解,使用 在 Android Studio 中进行 Kotlin 或 Java 可为 null 性分析,以获取 null 性 与这些 API 交互时提供的信息。

通常,Kotlin 中的可为 null 性合同违规行为会导致编译 错误。为了确保与现有代码兼容,只有 添加了 @RecentlyNullable@RecentlyNonNull 注解。这意味着 可为 null 性违规行为导致的是警告,而不是错误。

此外,之前被触发的所有 @RecentlyNullable@RecentlyNonNull 注解 已分别更改为 @Nullable@NonNull。 这意味着,在 Android 10 及更高版本中,可为 null 性违规行为 会导致错误,而不是警告。

如需详细了解注释更改,请参阅 Android Pie SDK 现已更适用于 Kotlin

NDK

Android 10 包含 NDK 方面的以下变更。

改进了文件描述符所有权的调试

Android 10 添加了 fdsan,它可以帮助您查找和修复文件描述符所有权 更轻松地解决问题

与错误处理文件描述符所有权相关的错误,这些错误往往会表现出来 use-after-closedouble-close,类似于内存分配 use-after-freeDouble-free bug,但往往更难处理 诊断和修复。fdsan 会尝试检测和/或阻止文件描述符 通过强制文件描述符所有权来不当管理。

如需详细了解与这些问题相关的崩溃,请参阅 fdsan 检测到的错误。 有关 fdsan 的更多信息,请参阅 关于 fdsan 的 Googlesource 页面

ELF TLS

使用 API 级别 29 及更高版本的 NDK 编译的应用可以使用 ELF TLS,而非 emutls。添加了对动态和静态链接器的支持, 这种处理线程局部变量的方法。

对于为 API 级别 28 及更低级别构建的应用,我们已实现一些改进 让 libgcc/compiler-rt 能够解决一些 emutls 问题。

如需了解详情,请参阅 面向 NDK 开发者的 Android 变更

运行时

Android 10 包含运行时方面的以下变更。

触发基于 Mallinfo 的垃圾回收

当小型平台 Java 对象引用 C++ 堆中的大型对象时, 通常只有在收集 Java 对象时才能回收 C++ 对象,并且 例如已敲定在之前的版本中,平台会预估 与 Java 对象关联的许多 C++ 对象的列表。此估算值并非总是 有时会导致内存使用量大幅度增加,因为 平台无法按预期进行垃圾回收。

在 Android 10 中,垃圾回收器 (GC) 会跟踪总大小 由系统 malloc() 分配的堆中,确保较大的 malloc() 分配始终包含在可触发 GC 的计算中。因此,与 Java 执行交错大量 C++ 分配的应用可能会出现垃圾回收频率提高的现象。其他应用的频率则可能会略有下降。

测试和调试

Android 10 包含测试和调试方面的以下改进。

改进了设备上系统跟踪功能

从 Android 10 开始,您可以指定 对跟踪记录的持续时间 设备端系统轨迹。如果您指定 系统执行长期跟踪,定期复制跟踪 缓冲区。跟踪记录完成 在达到您指定的尺寸或时长限制时触发。

请使用这些附加参数来测试除了您使用标准轨迹进行测试的用例之外的其他用例。例如,您可能正在诊断某个性能错误,而此错误仅在您的应用长时间运行后才会发生。在 在这种情况下,您可以记录一整天的长期轨迹,然后分析 CPU 调度程序、磁盘活动、应用线程和其他数据 可以帮助您确定错误的原因。

在 Android 10 及更高版本中,轨迹文件会以如下格式保存: Perfetto 可以打开 用于性能检测和跟踪的开源项目。您可以 将 Perfetto 跟踪文件转换为 Systrace 格式

TextClassifier 方面的改进

Android 10 在 TextClassifier 界面。

语言检测

通过 detectLanguage() 方法的工作方式与现有分类方法类似。它 会收到 TextLanguage.Request 对象并返回一个 TextLanguage 对象。

TextLanguage 对象由一系列有序对组成。每个有序对都包含分类的语言区域和相应的置信度得分。

建议采取的对话操作

通过 suggestConversationActions() 方法的工作方式与现有分类方法类似。它会收到 ConversationActions.Request 对象并返回一个 ConversationActions 对象。

ConversationActions 对象包含一系列 ConversationAction 对象的操作。每个 ConversationAction 对象都包含一个可能的 建议的操作及其置信度分数。

通知中的智能回复/操作

Android 9 引入了在 通知。Android 10 在此基础上进一步扩展, 添加基于 intent 的建议操作。此外,该平台还能够 并自动生成这些建议应用仍可提供自己的 或选择停用系统生成的建议。

用于生成这些回复的 API 是 TextClassifier, 也已直接提供给 Android 10 的开发者。 请参阅关于 TextClassifier 改进的部分

如果您的应用提供自己的建议,平台不会生成任何 自动提供建议。如果您不想显示应用的通知 对于任何建议的回复或操作,您可以选择停用系统生成的回复 和操作 setAllowGeneratedReplies()setAllowSystemGeneratedContextualActions()