Android 10 为用户和开发者引入了强大的功能和特性。本文档重点介绍了开发者可用的内容。
要了解 API,请阅读API 差异报告或访问 Android API 参考文档——查找“在 API 级别 29 中添加”的 API。此外,请务必查看 Android 10 的行为变更(针对以 API 级别 29 为目标的应用和所有应用),以及隐私权变更,以了解平台变更可能影响您应用的领域。
安全增强功能
Android 10 引入了多项安全功能,以下部分将对此进行总结。
改进的生物识别身份验证对话框
Android 10 对生物识别身份验证支持引入了以下改进:
- 检查生物识别身份验证功能。
- 一种备用机制,允许用户在无法使用生物识别输入进行身份验证时,使用设备 PIN、图案或密码进行身份验证。
- 一个提示,告诉系统在用户使用隐式生物识别模式进行身份验证后,不需要用户再次确认。例如,您可以告诉系统,在用户使用人脸识别进行身份验证后,不需要进一步确认。
直接从 APK 运行嵌入式 DEX 代码
从 Android 10 开始,您可以指示平台直接从应用的 APK 文件运行嵌入式 DEX 代码。如果攻击者设法篡改设备上的本地编译代码,此选项有助于防止攻击。
有关详细信息,请参阅直接从 APK 运行嵌入式 DEX 代码。
支持 TLS 1.3
Android 10 添加了对 TLS 1.3 的支持。TLS 1.3 是 TLS 标准的一次重大修订,其中包括性能优势和增强的安全性。我们的基准测试表明,使用 TLS 1.3 建立安全连接比使用 TLS 1.2 快 40%。
有关我们 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 包含了多项与网络和连接相关的改进。
Wi-Fi 网络连接 API
Android 10 添加了对点对点连接的支持。此功能允许您的应用通过使用 WifiNetworkSpecifier
描述所请求网络的属性,来提示用户更改设备连接的接入点。点对点连接用于非网络提供目的,例如 Chromecast 和 Google Home 硬件等辅助设备的引导配置。
有关详细信息,请参阅用于点对点连接的 Wi-Fi 网络请求 API。
Wi-Fi 网络建议 API
Android 10 添加了对您的应用提示用户连接到 Wi-Fi 接入点的支持。您可以提供要连接的网络建议。平台将最终根据您和其他应用的输入选择要接受的接入点。
有关此功能的更多信息,请参阅Wi-Fi 建议。
Wi-Fi 高性能和低延迟模式改进
Android 10 允许您向底层调制解调器提供提示以最大程度地降低延迟。
Android 10 扩展了 Wi-Fi 锁定 API,以有效支持高性能模式和低延迟模式。Wi-Fi 节能功能在高性能和低延迟模式下被禁用,并且根据调制解调器支持,低延迟模式下可能会启用进一步的延迟优化。
低延迟模式仅在获取锁定的应用程序在前台运行且屏幕亮起时启用。低延迟模式对于实时移动游戏应用程序特别有用。
DNS 解析器中的专门查找
Android 10 添加了对使用明文查找和 DNS-over-TLS 模式进行专门 DNS 查找的本机支持。此前,平台 DNS 解析器仅支持 A 和 AAAA 记录,它们只允许查找与名称关联的 IP 地址,而不支持任何其他记录类型。DnsResolver
API 提供了通用、异步的解析,使您能够查找 SRV
、NAPTR
和其他记录类型。请注意,解析响应由应用自行执行。
对于基于 NDK 的应用,请参阅android_res_nsend
。
Wi-Fi Easy Connect
Android 10 允许您使用 Easy Connect 向对等设备提供 Wi-Fi 凭据,以替代已弃用的 WPS。应用可以通过使用 ACTION_PROCESS_WIFI_EASY_CONNECT_URI
intent 将 Easy Connect 集成到其设置和配置流程中。
有关此功能的更多信息,请参阅Wi-Fi Easy Connect。
Wi-Fi Direct 连接 API
Android 10 中 WifiP2pConfig
和 WifiP2pManager
API 类进行了更新,以支持使用预定信息快速建立 Wi-Fi Direct 连接。此信息通过侧信道共享,例如蓝牙或 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);
蓝牙低功耗连接导向通道 (CoC)
Android 10 允许您的应用使用 BLE CoC 连接在两个 BLE 设备之间传输更大的数据流。此接口抽象了蓝牙和连接机制,以简化实现。
电话功能
Android 10 包含多项与电话相关的改进。
通话质量改进
Android 10 增加了在支持该功能的设备上收集正在进行的 IP 多媒体子系统 (IMS) 通话质量信息的能力,包括与网络的质量。
呼叫筛选和来电显示
Android 10 为您的应用提供了一种识别用户通讯录中不存在的通话为潜在垃圾电话的方法,并代表用户静默拒绝垃圾电话。有关这些被阻止通话的信息将记录为通话记录中的被阻止通话,以便在用户错过通话时提供更高的透明度。使用此 API 无需从用户获取 READ_CALL_LOG
权限即可提供通话筛选和来电显示功能。
呼叫重定向服务 API
Android 10 更改了处理呼叫 intent 的方式。NEW_OUTGOING_CALL
广播已弃用,并由 CallRedirectionService
API 取代。CallRedirectionService
API 提供了接口,允许您修改 Android 平台发出的去电。例如,第三方应用可能会取消通话并将其通过 VoIP 重新路由。
外部存储上文件创建的改进
除了引入分区存储外,Android 10 还添加了以下与外部存储相关的功能:
- 您可以使用
IS_PENDING
标志,在媒体文件写入磁盘时,授予您的应用对该文件的独占访问权限。 - 如果您知道文件的特定存储位置,可以向系统提供提示,以指定新写入文件的存储位置。
- 每个外部存储设备都具有唯一的卷名。
媒体和图形
Android 10 引入了以下新的媒体和图形功能及 API:
共享音频输入
Android 10 增加了两个应用同时共享音频输入的能力。有关完整信息,请参阅共享音频输入。
音频播放捕获
Android 10 使应用程序能够捕获来自其他应用程序的音频播放。有关完整信息,请参阅播放捕获。
MediaStyle 通知中的进度条
从 Android 10 开始,MediaStyle
通知将显示一个进度条。进度条显示 PlaybackState.getPosition()
的播放进度,在某些情况下,进度条可用于跳转到正在播放节目的某个位置。进度条的外观和行为受以下规则控制:
- 如果存在活动的
MediaSession
且其持续时间(由MediaMetadata.METADATA_KEY_DURATION
指定)大于零,则进度条会显示。这意味着进度条不会显示在不确定流(如直播和广播)中。 - 如果会话实现
ACTION_SEEK_TO
,用户可以拖动进度条来控制播放位置。
原生 MIDI API
Android 原生 MIDI API (AMidi) 使应用程序开发者能够使用 C/C++ 代码发送和接收 MIDI 数据,从而更紧密地与他们的 C/C++ 音频/控制逻辑集成,并最大限度地减少对 JNI 的需求。
有关详细信息,请参阅Android 原生 MIDI API。
MediaCodecInfo 改进
Android 10 向 MediaCodecInfo
添加了方法,以揭示有关编解码器的更多信息。
有关详细信息,请参阅媒体编解码器。
热敏 API
当设备过热时,它们可能会限制 CPU 和/或 GPU,这可能会以意想不到的方式影响应用和游戏。使用复杂图形、大量计算或持续网络活动的应用更有可能遇到问题,这些问题会因芯片组和核心频率、集成级别以及设备封装和外形尺寸而异。
在 Android 10 中,应用和游戏可以使用热敏 API 监控设备上的变化并采取措施以维持较低的功耗来恢复正常温度。应用在 PowerManager 中注册侦听器,系统通过该侦听器报告从轻度、中度到严重、关键、紧急和关机的持续热状态。
当设备报告热应力时,应用和游戏可以通过减少正在进行的活动来帮助降低功耗。例如,流媒体应用可以降低分辨率/比特率或网络流量,相机应用可以禁用闪光灯或密集的图像增强,游戏可以降低帧率或多边形镶嵌,媒体应用可以降低扬声器音量,地图应用可以关闭 GPS。
热敏 API 需要一个新的设备 HAL 层——它目前在运行 Android 10 的 Pixel 设备上受支持,我们正在与设备制造商合作伙伴合作,以尽快将广泛支持引入生态系统。
相机和图像
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 中添加了以下内容:
isSessionConfigurationSupported(SessionConfiguration sessionConfig)
——使您能够查询传递的会话配置是否可用于创建相机捕获会话。LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID
——使您能够确定支持逻辑相机设备的活动物理相机的 ID。您可以使用返回的 ID 请求逻辑流和物理子相机流,以实现更好的电源效率。
无障碍服务 API
Android 10 引入了以下新的无障碍服务功能和 API:
AccessibilityNodeInfo 输入键标志
从 Android 10 开始,您可以调用 isTextEntryKey()
来确定给定的 AccessibilityNodeInfo
是否表示键盘或按键的一部分的文本输入键。
无障碍对话框语音反馈
在用户需要执行无障碍快捷方式以启动无障碍服务的情况下,如果服务请求,Android 10 允许对话框附带文本转语音提示。
启用手势导航时的无障碍快捷方式
当 Android 10 中启用手势导航功能时,无障碍按钮不可见或不可选。要访问无障碍服务菜单,用户必须执行以下手势之一:
- 双指向上滑动。
- 双指向上滑动并按住。
物理键盘的无障碍快捷方式
在 Android 10 中,用户可以通过按 Control+Alt+Z 在物理键盘上触发无障碍快捷方式。
软键盘控制器增强
在 Android 10 中,无障碍服务可以请求显示软键盘,即使设备检测到连接了硬键盘。用户可以覆盖此行为。
用户定义的无障碍超时
Android 10 引入了 getRecommendedTimeoutMillis()
API。此方法为交互式和非交互式 UI 元素的用户定义超时提供了支持。返回值受用户偏好设置和无障碍服务 API 的影响。
自动填充改进
Android 10 包含对自动填充服务的以下改进。
与兼容性相关的自动填充请求
您可以使用 FillRequest.FLAG_COMPATIBILITY_MODE_REQUEST
标志来确定自动填充请求是否通过兼容模式生成。
同时保存用户名和密码
您可以通过使用 SaveInfo.FLAG_DELAY_SAVE
标志来支持应用程序使用多个活动显示用户名、密码和其他字段的情况。
用户与保存 UI 的交互
您可以通过在对话框上设置操作侦听器并更改相应密码远程视图的可见性来显示和隐藏保存对话框中的密码字段。
支持更新数据集
自动填充可以更新现有密码。例如,如果用户已经存储了一个密码,然后又保存了一个新密码,自动填充会提示用户更新现有密码,而不是保存一个新密码。
字段分类改进
Android 10 包含对字段分类 API 的以下改进。
UserData.Builder 构造函数
UserData.Builder
构造函数已更改,以更好地与 Builder
模式对齐。
允许一个值映射到多种类别的 ID
在 Android 10 中使用 UserData.Builder
时,您现在可以将一个值映射到多种类别的 ID。在之前的版本中,如果一个值被多次添加,则会抛出异常。
改进了对信用卡号的支持
字段分类现在可以将四位数字检测为信用卡号的后四位。
支持应用特定的字段分类
Android 10 添加了 FillResponse.setUserData()
,它允许您在会话期间设置应用特定的用户数据。这有助于自动填充服务检测具有应用特定内容的字段类型。
UI 和系统控件
Android 10 提供了以下用户界面改进:
支持 JVMTI PopFrame 限制
Android 10 添加了对 Android JVMTI 实现中 can_pop_frames
功能的支持。在调试时,此功能允许您在断点处暂停并调整局部变量、全局变量或函数实现后重新运行函数。有关详细信息,请参阅 Oracle 的 Pop Frame 参考页面。
Surface control API
Android 10 提供了一个 SurfaceControl
API,用于对系统合成器 (SurfaceFlinger
) 进行低级访问。对于大多数用户而言,SurfaceView 是利用合成器的正确方式。SurfaceControl
API 在某些情况下可能很有用,例如:
- 多个曲面的同步
- 跨进程曲面嵌入
- 较低级别的生命周期管理
SurfaceControl
API 在 SDK 和 NDK 绑定中均可用。NDK 实现包括一个用于与合成器手动交换缓冲区的 API。这为遇到 BufferQueue
限制的用户提供了替代方案。
WebView 挂起渲染器检测
Android 10 引入了 WebViewRenderProcessClient
抽象类,应用可以使用它来检测 WebView
是否无响应。要使用此类别:
- 定义您自己的子类并实现其
onRenderProcessResponsive()
和onRenderProcessUnresponsive()
方法。 - 将
WebViewRenderProcessClient
的实例附加到一个或多个WebView
对象。 - 如果
WebView
变得无响应,系统会调用客户端的onRenderProcessUnresponsive()
方法,并传递WebView
和WebViewRenderProcess
。(如果WebView
是单进程的,则WebViewRenderProcess
参数为 null。)您的应用可以采取适当的行动,例如向用户显示一个对话框,询问他们是否要终止渲染进程。
如果 WebView
仍然无响应,系统会定期调用 onRenderProcessUnresponsive()
(每五秒不超过一次),但不采取其他行动。如果 WebView
再次响应,系统只调用一次 onRenderProcessResponsive()
。
设置面板
Android 10 引入了“设置面板”,这是一个允许应用在应用上下文中向用户显示设置的 API。这可以防止用户为了使用应用而需要进入“设置”来更改“NFC”或“移动数据”等内容。


例如,假设用户在设备处于飞行模式时打开网页浏览器。在 Android 10 之前,应用只能显示通用消息,要求用户打开“设置”以恢复连接。在 Android 10 中,浏览器应用可以显示一个内联面板,其中显示关键连接设置,例如飞行模式、Wi-Fi(包括附近网络)和移动数据。通过此面板,用户无需离开应用即可恢复连接。
要显示设置面板,请使用以下 Settings.Panel
操作之一触发 intent:
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
- 显示与互联网连接相关的设置,例如飞行模式、Wi-Fi 和移动数据。
ACTION_WIFI
- 显示 Wi-Fi 设置,但不显示其他连接设置。这对于需要 Wi-Fi 连接来执行大文件上传或下载的应用很有用。
ACTION_NFC
- 显示所有与近场通信(NFC)相关的设置。
ACTION_VOLUME
- 显示所有音频流的音量设置。
共享改进
Android 10 提供了多项共享改进:
共享快捷方式 API
共享快捷方式 API 取代了直接共享 API。
共享快捷方式 API 不再按需被动地检索结果,而是允许应用提前发布直接共享目标。这是 ShortcutManager
的工作方式。由于这两个 API 相似,我们扩展了 ShortcutInfo API
,以使使用这两个功能更容易。借助共享快捷方式 API,您可以直接将类别或人员分配给共享目标。共享目标会保留在系统中,直到同一应用更新它们或应用被卸载。
旧的直接共享机制仍然有效,但使用它的应用比使用共享快捷方式 API 的应用具有更低的优先级。
ShortcutInfo.Builder
添加并增强了方法,以提供有关共享目标的更多信息。
直接共享目标
您可以将动态快捷方式作为直接共享目标发布。请参阅发布直接共享目标。
ShortcutManagerCompat
是一个新的 AndroidX API,它提供与旧的 DirectShare API 的向后兼容性。这是发布共享目标的推荐方式。
预览文本
当应用共享文本内容时,它可以在共享表单 UI 中显示内容的可选预览。
请参阅添加富文本预览
了解详情
有关应用如何共享数据的更多信息,请参阅向其他应用发送简单数据和从其他应用接收简单数据
深色主题
Android 10 提供了深色主题,适用于 Android 系统 UI 和设备上运行的应用。有关完整信息,请参阅深色主题。
前台服务类型
Android 10 引入了 foregroundServiceType
XML 清单属性,您将其包含在多个特定服务的定义中。为特定服务分配多个前台服务类型是可能的,但很少适用。
下表显示了不同的前台服务类型以及适合声明特定类型的服务示例用例:
前台服务类型 | 应声明此类型的服务的用例示例 |
---|---|
connectedDevice
| 监控可穿戴健身追踪器 |
dataSync
| 从网络下载文件 |
location
| 继续用户发起的操作 |
mediaPlayback
| 播放有声读物、播客或音乐 |
mediaProjection
| 在短时间内录制设备显示器的视频 |
phoneCall
| 处理正在进行的电话呼叫 |
Kotlin
Android 10 包含以下针对 Kotlin 开发的更新。
libcore API 的可空性注解
Android 10 改进了 SDK 中 libcore API 的可空性注解覆盖范围。这些注解使使用 Kotlin 或 Android Studio 中的 Java 可空性分析的应用开发者在与这些 API 交互时能够获取空值信息。
通常,Kotlin 中的可空性契约违规会导致编译错误。为确保与您现有代码的兼容性,仅添加了 @RecentlyNullable
和 @RecentlyNonNull
注解。这意味着可空性违规会导致警告而不是错误。
此外,Android 9 中添加的任何 @RecentlyNullable
或 @RecentlyNonNull
注解将分别更改为 @Nullable
和 @NonNull
。这意味着,在 Android 10 及更高版本中,可空性违规会导致错误而不是警告。
有关注解更改的更多信息,请参阅 Android 开发者博客上的Android Pie SDK 现在对 Kotlin 更加友好。
NDK
Android 10 包含以下 NDK 更改。
改进了文件描述符所有权调试
Android 10 添加了 fdsan,可帮助您更轻松地查找和修复文件描述符所有权问题。
与文件描述符所有权处理不当相关的错误(通常表现为使用后释放和二次释放)类似于内存分配中的使用后释放和二次释放错误,但诊断和修复起来通常要困难得多。fdsan 试图通过强制执行文件描述符所有权来检测和/或防止文件描述符管理不当。
有关与这些问题相关的崩溃的更多信息,请参阅fdsan 检测到的错误。有关 fdsan 的更多信息,请参阅 Googlesource 上的 fdsan 页面。
ELF TLS
使用 NDK 构建且最低 API 级别为 29 的应用程序可以使用 ELF TLS 而不是 emutls
。已添加动态和静态链接器支持,以支持此处理线程局部变量的方法。
对于为 API 级别 28 及更低版本构建的应用,已对 libgcc/compiler-rt
进行改进,以解决一些 emutls
问题。
有关详细信息,请参阅NDK 开发者 Android 变更。
运行时
Android 10 包含以下运行时变更。
基于 Mallinfo 的垃圾回收触发
当小型平台 Java 对象引用 C++ 堆中的大型对象时,C++ 对象通常只能在 Java 对象被回收并(例如)最终确定时才能回收。在以前的版本中,平台估算了许多与 Java 对象关联的 C++ 对象的大小。这种估算并不总是准确的,并且偶尔会导致内存使用量大幅增加,因为平台在应该进行垃圾回收时未能进行。
在 Android 10 中,垃圾回收器 (GC) 会跟踪系统 malloc()
分配的堆的总大小,确保大型 malloc()
分配始终包含在 GC 触发计算中。因此,大量交错 C++ 分配和 Java 执行的应用可能会看到垃圾回收频率增加。其他应用可能会看到少量减少。
测试和调试
Android 10 包含以下测试和调试改进。
设备上系统跟踪的改进
从 Android 10 开始,您可以在执行设备上系统跟踪时指定跟踪的大小和持续时间限制。当您指定任一值时,系统会执行长时间跟踪,并在记录跟踪时定期将跟踪缓冲区复制到目标文件。当达到您指定的大小或持续时间限制时,跟踪完成。
使用这些附加参数来测试与标准跟踪不同的用例。例如,您可能正在诊断一个仅在应用程序运行很长时间后才出现的性能错误。在这种情况下,您可以记录一整天的长时间跟踪,然后分析报告中的 CPU 调度程序、磁盘活动、应用程序线程和其他数据,以帮助您确定错误原因。
在 Android 10 及更高版本中,跟踪文件以可使用 Perfetto 打开的格式保存,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()
选择退出系统生成的回复和操作。