功能和 API 概览

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

要了解新 API,请阅读 API 差异报告或访问 Android API 参考文档。为便于分辨,新 API 会突出显示。此外,要了解平台变更可能会在哪些方面影响您的应用,请务必参阅适用于以 Android R 为目标平台的应用适用于所有应用的 Android 11 行为变更,以及隐私权变更

数据访问审核

我们期待能收到您的反馈!请填写这份简短的调查问卷,将您使用此功能的情况告知我们。特别是,请将受此功能影响的用例告知我们。

为了让应用及其依赖项访问用户私密数据的过程更加透明,Android 11 引入了数据访问审核功能。通过使用此功能,您可以更好地识别和纠正可能出现的意外数据访问。

要详细了解此功能,请阅读与权限相关的隐私权变更说明页面中的数据访问审核部分

高性能图形调试层注入

应用现在可以将外部图形层(GLESVulkan)加载到原生应用代码中,可以在不产生性能开销的前提下,提供与可调试应用相同的功能。在使用 GAPID 等工具对应用进行性能剖析时,此功能尤为重要。要对应用进行性能剖析,只需要在应用清单文件中添加以下元数据元素,而无需让应用变成可调试应用:

    <application ... >
        <meta-data android:name="com.android.graphics.injectLayers.enable"
                      android:value="true" />
    </application>
    

媒体文件的批量操作

为实现各种设备之间的一致性并增加用户便利性,Android 11 向 MediaStore API 中添加了多种方法。要详细了解这些方法,请参阅与存储有关的 Android 11 隐私权页面中的执行批量操作部分

在快速回复中使用富媒体

从 Android 11 开始,用户可以在快速回复中插入图片和其他富媒体内容。要支持此功能,应用需要向 RemoteInput 通知添加信息,指定可以处理的 MIME 类型。应用可以通过调用 RemoteInput.Builder.setAllowDataType() 来执行此操作。此外,应用还必须检查收到的任何 RemoteInput 广播,以查看广播是否包含其中任何一种类型的内容;应用可使用 RemoteInput.getDataResultsFromIntent() 来执行此操作。

使用原始文件路径访问媒体文件

从 Android 11 开始,具有 READ_EXTERNAL_STORAGE 权限的应用可以使用直接文件路径和原生库来读取设备的媒体文件。要详细了解此功能,请参阅与存储相关的 Android 11 隐私权页面中的使用原始路径访问文件部分

安全共享大型数据集

在某些情况下,例如涉及机器学习或媒体播放时,您的应用可能需要与其他应用使用同一个大型数据集。在较早的 Android 版本中,您的应用与其他应用需要各自单独下载该数据集。

为帮助减少网络中和磁盘上的数据冗余,Android 11 允许使用共享数据 blob 在设备上缓存这些大型数据集。要详细了解如何共享数据集,请参阅有关共享大型数据集的深度指南

应用进程退出原因

我们期待能收到您的反馈!请填写这份简短的调查问卷,将您使用此功能的情况告知我们。特别是,请将受此功能影响的用例告知我们。

Android 11 引入了 getHistoricalProcessExitReasons() 方法,用于报告近期任何进程终止的原因。应用可以使用此方法来收集崩溃诊断信息,例如进程终止是由于 ANR、内存问题还是其他原因所致。

getHistoricalProcessExitReasons() 方法会返回 ApplicationExitInfo 类的实例,其中包含与应用进程终止相关的信息。通过对此类的实例调用 getReason(),您可以确定应用进程终止的原因。例如,返回值为 REASON_CRASH 表示您的应用中发生了未处理的异常。

请求并检查低延时支持

特定的显示屏可以执行图形后期处理,例如某些外部显示屏和电视。此类后期处理改善了图形质量,但可能会增加延时。支持 HDMI 2.1 的新款显示屏具有自动低延时模式(ALLM,也称为游戏模式),该模式可以通过关闭后期处理来最大限度地缩短延时。如需详细了解 ALLM,请参阅 HDMI 2.1 规范

窗口可以请求使用自动低延时模式(如果可用)。ALLM 对于游戏和视频会议等应用特别有用,因为对于这些应用而言,低延时的重要性要高于拥有最佳的图形质量。

要开启或关闭最低限度的后期处理,请调用 Window.setPreferMinimalPostProcessing(),或将窗口的 preferMinimalPostProcessing 属性设置为 true。并非所有的显示屏都支持最低限度的后期处理;要了解某个显示屏是否支持该功能,可调用新方法 Display.isMinimalPostProcessingSupported()

MediaCodec 低延时解码

Android 11 增强了 MediaCodec,针对游戏和其他实时应用支持低延时解码。您可以将 FEATURE_LowLatency 传递到 MediaCodecInfo.CodecCapabilities.isFeatureSupported(),检查编解码器是否支持低延时解码。

要启用或停用低延时解码,请执行以下任一操作:

NDK 图像解码器

NDK ImageDecoder API 提供了一种标准 API,供 Android C/C++ 应用直接解码图像。应用开发者不再需要使用框架 API(通过 JNI)或捆绑第三方图像解码库。有关详情,请参阅图像解码器开发者指南

资源加载器

我们期待能收到您的反馈!请填写这份简短的调查问卷,将您使用此功能的情况告知我们。特别是,请将受此功能影响的用例告知我们。

Android 11 引入了一个新 API,允许应用动态扩展资源的搜索和加载方式。新的 API 类 ResourcesLoaderResourcesProvider 主要负责提供新功能。两者协同作用,可以提供额外的资源,或修改现有资源的值。

ResourcesLoader 对象是向应用的 Resources 实例提供 ResourcesProvider 对象的容器,而 ResourcesProvider 对象提供从 APK 和资源表加载资源数据的方法。

此 API 的一个主要用例是自定义资源加载。您可以将新 API 类 DirectoryAssetsProvider 的实例与 ResourcesProvider 配对,以重定向基于文件的资源的解析,这样就只需搜索特定目录,而无需搜索应用 APK。您可以通过 AssetManager API 类中的 open() 系列方法来访问这些资源,就像访问 APK 中绑定的资源一样。

ICU 库更新

Android 11 更新了 android.icu 软件包,以使用 ICU 库版本 66,而 Android 10 中使用的是版本 63。新版库包含更新的 CLDR 语言区域数据以及众多对于 Android 中的国际化支持的增强功能。

新版库包含以下主要变更:

  • 许多格式化 API 现在都支持可扩展 FormattedValue 的新返回对象类型。
  • LocaleMatcher API 在以下方面得到增强:提供了构建器类,支持 java.util.Locale 类型,并且结果类可提供有关匹配的额外数据。
  • 现在支持 Unicode 13。

Neural Networks API 1.3

Android 11 扩展并改进了 Neural Networks API (NNAPI)

新运算方式

NNAPI 1.3 引入了新的运算数类型 TENSOR_QUANT8_ASYMM_SIGNED,以支持 TensorFlow Lite 的新量化方案

此外,NNAPI 1.3 还引入了以下新运算:

  • QUANTIZED_LSTM
  • IF
  • WHILE
  • ELU
  • HARD_SWISH
  • FILL
  • RANK

新的机器学习控件

NNAPI 1.3 引入了全新控件来帮助机器学习流畅运行:

生物识别身份验证更新

为了帮助您控制应用数据的安全级别,Android 11 对生物识别身份验证进行了多项改进。

身份验证强度

Android 11 引入了 BiometricManager.Authenticators 接口,该接口定义了以下身份验证强度级别:

BIOMETRIC_STRONG
使用满足兼容性定义页面上定义的强度级别要求的硬件元素进行身份验证。
BIOMETRIC_WEAK
使用满足兼容性定义页面上定义的强度级别要求的硬件元素进行身份验证。
DEVICE_CREDENTIAL
使用屏幕锁定凭据(即用户的 PIN 码、解锁图案或密码)进行身份验证。

要定义您的应用允许进行生物识别身份验证的强度级别,请将强度级别的按位组合传入 setAllowedAuthenticators() 方法。例如,如果您的应用要求使用“强”硬件元素或屏幕锁定凭据,请传入 BIOMETRIC_STRONG | DEVICE_CREDENTIAL

要检查是否有必要的身份验证元素,请将强度级别的同一按位组合传入 canAuthenticate() 方法。如有必要,请调用 ACTION_BIOMETRIC_ENROLL intent 操作,该操作会提示用户注册具备您的应用所要求的身份验证强度的身份验证器。在 intent extra 中,提供您的应用接受的身份验证器。系统会选择其中一个身份验证器,并要求用户为该身份验证器注册凭据。

在用户进行身份验证后,您可以通过调用 getAuthenticationType() 来检查用户是使用设备凭据还是生物识别凭据进行的身份验证。

对“每次使用时进行身份验证”密钥的额外支持

Android 11 在 BiometricPrompt 类中提供了对“每次使用时进行身份验证”密钥的更多支持。此类密钥要求每次您的应用需要访问受该密钥保护的数据时,用户都必须提供生物识别凭据、设备凭据或上述任一凭据。您的应用可以在 setUserAuthenticationParameters() 的第二个参数中指定用户需要提供的内容。“每次使用时进行身份验证”密钥对高价值的事务(如支付大笔款项或更新个人的健康档案)很有用。

要将 BiometricPrompt 对象与“每次使用时进行身份验证”密钥关联,请将 0 作为 setUserAuthenticationParameters() 的第一个参数传入。

已弃用的方法

Android 11 弃用了以下方法:

  • setDeviceCredentialAllowed() 方法。
  • setUserAuthenticationValidityDurationSeconds() 方法。
  • 不带任何参数的 canAuthenticate() 过载版本。

CallScreeningService 更新

在 Android 11(API 级别“R”)及更高版本中,具有 android.Manifest.permission.READ_PHONE_STATE 权限的应用可以通过 PhoneStateListener.onDisplayInfoChanged() 请求更新电话显示信息,其中包括用于营销品牌塑造的无线接入技术信息。

针对不同运营商的各种 5G 图标显示解决方案由这一新 API 提供。支持的技术包括 LTE、采用载波聚合技术的 LTE (LTE+)、高级专业版 LTE (5Ge)、NR (5G) 和毫米波移动网络频段上的 NR (5G+)。

Android 模拟器中的相机支持扩展

Android 11 改进了Android 模拟器相机功能。添加的功能包括:

  • RAW 捕获
  • YUV 重新处理
  • 3 级设备
  • 逻辑摄像头支持

在主动拍摄期间关闭通知提示音和振动

从 Android 11 开始,在主动使用相机时,您的应用可以使用 setCameraAudioRestriction() 来仅关闭振动、同时关闭声音和振动或都不关闭。

Wi-Fi Passpoint 增强功能

通过 Passpoint,应用可以自动静默地执行身份验证并连接到安全的 Wi-Fi 热点。以 API 级别“R”及更高级别为目标平台的应用可以使用 Passpoint 的以下附加功能。

失效日期强制执行和通知
对配置文件强制执行失效日期可让框架避免使用过期凭据自动连接到接入点,该操作必定会失败。这样可以阻止无线连接,并节省电量和后端带宽。当用户的配置文件位于范围内但已过期时,该功能会向用户显示通知。
FQDN 匹配
允许使用 PerProviderSubscription (PPS) 管理对象 (MO) 中的 Extension/Android 节点,配置独立于接入网络查询协议 (ANQP) 完全限定域名 (FQDN) 的命名 AAA 域。
自签名的私人 CA
对于 Passpoint R1 配置文件,Android 接受采用私人自签名 CA 进行连接身份验证。

Wi-Fi Suggestion API 扩展

Android 11 扩展了 Wi-Fi Suggestion API,以提高应用的网络管理能力,包括:

  • 连接管理应用可以通过允许断开连接请求来管理自己的网络。
  • Passpoint 网络集成到 Suggestion API 中,可以推荐给用户。
  • 通过 Analytics API,您可以获取有关网络质量的信息。

GNSS 天线支持

Android 11 引入了 GnssAntennaInfo 类,让您的应用能够多加利用全球导航卫星系统 (GNSS) 可以提供的厘米精度定位。用户向您的应用授予 ACCESS_FINE_LOCATION 权限之后,您的应用可以访问与 GNSS 天线相关的以下详细信息:

  • 相位中心偏移 (PCO) 坐标
  • 相位中心变化 (PCV) 校正
  • 信号增益校正

要确定设备是否可以向您的应用提供 GNSS 天线信息,请调用 hasGnssAntennaInfo()

隐私注意事项

  • GNSS 天线只能识别设备型号,而不能识别具体设备。
  • 要使用 GnssAntennaInfo 类,必须具备 ACCESS_FINE_LOCATION 权限。

聊天气泡

现已面向开发者推出气泡功能,该功能有助于在系统中显示对话。气泡是 Android 10 中的一项实验性功能,通过开发者选项启用;在 Android 11 中,不再需要如此操作。

气泡性能有多项改进,现在用户可以更灵活地在每个应用中启用和停用气泡功能。对于实现了实验性支持的开发者而言,Android 11 中的 API 有一些变更:

面向无障碍服务开发者的更新

如果您创建自定义无障碍服务,则可以在 Android 11 中使用以下功能:

  • 在无障碍服务的面向用户的解释中,除了纯文本之外,现在还允许使用 HTML 和图片。这种灵活性可让您更轻松地向最终用户解释您的服务做些什么以及对他们有何帮助。
  • 要使用比 contentDescription 在语义上更有意义的界面元素的状态说明,请调用 getStateDescription() 方法。
  • 要请求触摸事件绕过系统的触摸浏览器,请调用 setTouchExplorationPassthroughRegion()。同样,要请求手势绕过系统的手势检测器,请调用 setGestureDetectionPassthroughRegion()
  • 您可以请求 IME 操作(如“输入”和“下一个”),以及不启用 FLAG_SECURE 标记的窗口的屏幕截图。

增量 APK 安装

在设备上安装大型(2GB 以上)APK 可能需要很长的时间,即使只对应用稍作更改也是如此。增量 APK 安装通过安装 APK 中足以用来启动应用的部分,同时在后台流式传输剩余数据,加速了这一过程。

您可以运行以下命令来使用该功能。如果设备不支持增量安装,则该命令会失败并输出详细的解释。

adb install --incremental

必须将 v4 签名文件放在 APK 旁边,才能使此功能正常发挥作用。

APK 签名方案 v4

Android 11 添加了对 APK 签名方案 v4 的支持。此方案会在单独的文件 (apk-name.apk.idsig) 中生成一种新的签名,但在其他方面与 v2 和 v3 类似。没有对 APK 进行任何更改。此方案支持增量 APK 安装,这样会加快 APK 安装速度。

适用于 OpenGL ES 的 ANGLE

您可以使用 ANGLE 运行非核心应用来评估性能,并确定特定应用是否应使用 ANGLE,而不是原生 OpenGL ES 驱动程序。有关说明,请参阅使用适用于 OpenGL ES 的 ANGLE

动态 intent 过滤器

要接收 intent,应用必须通过在其清单中定义 intent 过滤器,在编译时声明它能够接收哪些类型的数据。在 Android 10 及更低版本中,应用无法在运行时更改其 intent 过滤器。这对于虚拟化应用(如虚拟机和远程桌面)来说是一个问题,因为这些应用无法确切得知用户将在它们内部安装什么软件。

Android 11 引入了 MIME 组,这是一个新的清单元素,可让应用在 intent 过滤器中声明一组动态的 MIME 类型,并在运行时以编程方式对其进行修改。要使用 MIME 组,请使用新的 android:mimeGroup 属性在应用清单中添加一个数据元素:

    <intent-filter>
      <action android:name="android.intent.action.SEND"/>
      <category android:name="android.intent.category.DEFAULT"/>
      <data android:mimeGroup="myMimeGroup"/>
    </intent-filter>
    

android:mimeGroup 属性的值是任意字符串 ID,用于在运行时标识 MIME 组。您可以通过将某个 MIME 组的 ID 传递给 PackageManager API 类中的以下新方法来访问和更新该 MIME 组的内容:

如果您以编程方式将 MIME 类型添加到 MIME 组,其运作方式与清单中明确声明的静态 MIME 类型完全相同。

更好地支持包含多个帧的 HEIF 图片

从 Android 11 开始,如果您调用 ImageDecoder.decodeDrawable() 并传递包含帧序列的 HEIF 图片(如动画或连拍照片),则该方法会返回包含整个图片序列的 AnimatedImageDrawable。在较低版本的 Android 系统中,该方法会返回仅包含单个帧的 BitmapDrawable

如果 HEIF 图片包含的多个帧不在一个序列中,则您可以通过调用 MediaMetadataRetriever.getImageAtIndex() 来检索各个帧。

更好地支持瀑布屏

Android 11 提供了一些 API 来支持瀑布屏,这是一种无边框的全面屏。这种显示屏被视为刘海屏的变体。现有的 DisplayCutout.getSafeInset…() 方法现在会返回能够避开瀑布区域以及刘海的安全边衬区。要在瀑布区域中呈现您的应用内容,请执行以下操作:

帧速率 API

Android 11 提供了一个 API,可让应用告知系统它们预期的帧速率。大多数设备历来都只支持一种显示屏刷新频率,通常为 60Hz,但这一直在变化。现在,许多设备都支持其他刷新频率,如 90Hz 或 120Hz。该 API 的主要目的是让应用能够更好地利用支持的所有显示屏刷新频率。

Android 提供了多种访问和控制表面的方法,因此该 API 有多个版本:

媒体

已弃用 OpenSL ES

从 NDK r21b Beta 版 2 开始,已弃用 OpenSL ES API。您应改用 Oboe

平台仍支持现有应用的 OpenSL ES。不过,使用 minSdkVersion 为 30 或更高版本的 OpenSL ES 时,系统会显示构建警告。

新的 AAudio 函数 AAudioStream_release()

函数 AAudioStream_close() 会同时释放和关闭音频流。这可能很危险。如果其他进程在音频流关闭后尝试对其进行访问,则该进程将会崩溃。

新函数 AAudioStream_release() 会释放音频流,但不会将其关闭。这样会释放其资源并使音频流处于已知状态。该对象将一直存在,直到您调用 AAudioStream_close()

限制音频访问

Android 11 包含两项新功能,用于限制应用录制音频的能力。

通过 USB 设备捕获音频

当不具备 RECORD_AUDIO 权限的应用请求访问具有音频捕获功能的 USB 音频设备(如 USB 耳机)时,系统会显示一条新的警告消息,要求用户确认应用具备使用该设备的权限。系统会忽略任何“始终使用”选项,因此应用每次请求访问时,用户都必须确认警告消息并授予相应权限。

为了避免这种行为,您的应用应请求 RECORD_AUDIO 权限。

并发访问麦克风

从 Android 10 开始,拥有 RoleManager.ROLE_ASSISTANT 角色的所有应用都可以与其他任何应用并发捕获音频。如果其他应用使用的是“对隐私敏感”的音频源 CAMCORDERVOICE_COMMUNICATION,则不允许并发捕获。如需了解详情,请参阅共享音频输入

Android 11 向 AudioRecordMediaRecorderAAudioStream API 添加了一些新方法。不管选择的用例是什么,这些方法均可启用和停用并发捕获的能力。

这些新方法包括:

如果将 setPrivacySensitive() 设为 true,则捕获用例是私有的,即使是特权助理也不能并发捕获。此设置会替换依赖于音频源的默认行为。例如,VOICE_COMMUNICATION 默认情况下是私有的,而 UNPROCESSED 则不是。