Android 7.0 Nougat 为用户和开发者引入了各种新功能。本文档重点介绍了面向开发者的新变化。
请务必查看 Android 7.0 行为变更,了解平台变更可能会在哪些方面影响您的应用。
如需详细了解 Android 7.0 的用户功能,请访问 www.android.com。
多窗口支持
在 Android 7.0 中,我们在 Android 平台中引入了一项呼声颇高的全新多任务处理功能 - 多窗口支持。
现在,用户可以同时在屏幕上打开两个应用。
- 在搭载 Android 7.0 的手机和平板电脑上,用户可以并排运行两个应用,或者在分屏模式下一个应用上下并排显示。用户可以通过拖动应用之间的分隔线来调整应用大小。
- 在 Android TV 设备上,应用可以将自身置于画中画模式,从而让它们能够在用户浏览其他应用或与其他应用互动时继续显示内容。
![在分屏模式下运行移动应用](https://developer.android.google.cn/static/images/android-7.0/mw-portrait.png?authuser=1&hl=bn)
图 1. 在分屏模式下运行的应用。
多窗口支持为您提供了吸引用户的新方式,尤其是在平板电脑和其他更大屏幕的设备上。您还可以在应用中启用拖放功能,让用户可以方便地将内容拖放到您的应用或从其中拖出内容,这是提升用户体验的绝佳方式。
向应用添加多窗口支持并配置多窗口显示的处理方式非常简单。例如,您可以指定 activity 允许的最小尺寸,以防止用户将 activity 调整到该尺寸以下。您还可以为应用停用多窗口显示,以确保系统将仅以全屏模式显示应用。
如需了解详情,请参阅多窗口支持开发者文档。
通知增强功能
在 Android 7.0 中,我们重新设计了通知,使其更易于使用、更快速。部分变更包括:
- 模板更新:我们将更新通知模板,新强调了主打图片和头像。开发者将能够充分利用新模板,只需进行极少的代码调整。
-
消息样式自定义:您可以使用
MessagingStyle
类自定义更多与您的通知相关联的界面标签。您可以配置消息、对话标题和内容视图。 - 捆绑通知:系统可以将消息组合在一起(例如,按消息主题)并显示分组。用户可以适当地对这些操作执行 Dismiss 或 Archive 等操作。如果您已实现 Android Wear 的通知,那么您已经很熟悉此模式。
- 直接回复:对于实时通信应用,Android 系统支持内嵌回复,以便用户可以直接在通知界面中快速回复短信。
- 自定义视图:两个新的 API 让您在通知中使用自定义视图时能够利用系统装饰元素,例如通知标题和操作。
![显示捆绑消息通知的手机](https://developer.android.google.cn/static/images/android-7.0/notifications-1.png?authuser=1&hl=bn)
![显示单条消息通知的移动设备](https://developer.android.google.cn/static/images/android-7.0/notifications-3.png?authuser=1&hl=bn)
![在通知界面中显示内嵌消息回复的移动设备](https://developer.android.google.cn/static/images/android-7.0/notifications-2.png?authuser=1&hl=bn)
图 2. 捆绑通知和直接回复。
如需了解如何实现新功能,请参阅通知指南。
配置文件指导的 JIT/AOT 编译
在 Android 7.0 中,我们添加了 Just in Time (JIT) 编译器,它可以针对 ART 进行代码性能分析,使其能够在 Android 应用运行时持续提升其性能。JIT 编译器对 Android 运行组件当前的 Ahead of Time (AOT) 编译器进行了补充,有助于提升运行时性能,节省存储空间,加快应用更新和系统更新速度。
配置文件引导的编译可让 Android 根据每个应用的实际使用情况以及设备上的情况管理每个应用的 AOT/JIT 编译。例如,ART 会维护每个应用热方法的配置文件,并且可以预编译和缓存这些方法以实现最佳性能。对于应用的其他部分,在实际使用之前不会进行编译。
除了提高应用的关键部分的性能之外,配置文件引导的编译还有助于减少应用的整体 RAM 占用,包括关联的二进制文件。此功能对于低内存设备非常尤其重要。
Android 运行组件在管理配置文件引导型编译时,可最大程度降低对设备电池的影响。仅当设备处于空闲状态和充电时,它才会进行编译,从而可以通过提前执行该工作节约时间和省电。
快速的应用安装路径
Android 运行组件的 JIT 编译器最实际的好处之一是应用安装和系统更新的速度。即使在 Android 6.0 中需要几分钟进行优化和安装的大型应用,现在只需几秒钟即可完成安装。由于无需再执行优化步骤,系统更新也变得更快。
随时随地低电耗模式...
Android 6.0 引入了低电耗模式,这是一种系统模式,可在设备处于空闲状态时(例如设备放在桌上或抽屉中)延迟应用的 CPU 和网络活动,从而节省电量。
现在,在 Android 7.0 中,低电耗模式又前进了一步,随时随地节省了电量。只要屏幕关闭一段时间且设备未接通电源,低电耗模式就会对应用应用熟悉的 CPU 和网络限制的子集。 这意味着用户即使将设备放入口袋里也能省电。
![低电耗模式如何应用第一级系统活动限制以延长电池续航时间的图示](https://developer.android.google.cn/static/images/android-7.0/doze-diagram-1.png?authuser=1&hl=bn)
图 3. 现在,即使设备不处于静止状态,低电耗模式也会应用限制以延长电池续航时间。
屏幕关闭片刻后,设备在使用电池时,低电耗模式会限制网络访问,并延迟作业和同步。在短暂的维护期内,系统会允许应用访问网络,并执行延迟的作业/同步。打开屏幕或将设备接通电源会使设备退出低电耗模式。
当设备再次处于静止状态时,屏幕关闭且使用电池一段时间,低电耗模式会对 PowerManager.WakeLock
、AlarmManager
闹钟和 GPS/WLAN 扫描应用完整的 CPU 和网络限制。
无论设备是否处于运动状态,将应用调整到低电耗模式的最佳实践都相同,因此,如果您已更新应用以妥善处理低电耗模式,则一切就绪。如果不是,请立即开始将应用调整到低电耗模式。
Project Svelte:后台优化
Project Svelte 在持续改善,以最大程度减少生态系统中一系列 Android 设备中系统和应用使用的 RAM。在 Android 7.0 中,Project Svelte 注重优化应用在后台运行的方式。
后台处理是大多数应用的重要组成部分。处理得当,可让您实现令人惊叹的用户体验 - 即时、快速和情境感知。如果处理不当,后台处理可能会不必要地消耗 RAM(和电池),并影响其他应用的系统性能。
从 Android 5.0 开始,JobScheduler
已成为执行后台工作的首选方式,其工作方式有利于用户。应用可以安排作业,同时让系统根据内存、电源和连接情况进行优化。JobScheduler 可实现控制和简洁性,我们希望所有应用都使用它。
另一个非常好的选择是
GCMNetworkManager
(Google Play 服务的一部分),它在旧版 Android 中提供类似的作业安排和兼容性。
我们在继续扩展 JobScheduler
和 GCMNetworkManager
,以满足您的更多用例 - 例如,在 Android 7.0 中,您现在可以根据 Content Provider 的变化来调度后台工作。同时,我们开始废弃一些较旧的模式,这些模式可能会降低系统性能,特别是低内存设备的系统性能。
在 Android 7.0 中,我们移除了三个常用的隐式广播(CONNECTIVITY_ACTION
、ACTION_NEW_PICTURE
和 ACTION_NEW_VIDEO
),因为这些广播可能会一次唤醒多个应用的后台进程,并消耗内存和电池电量。如果您的应用收到这些广播,请充分利用 Android 7.0 迁移到 JobScheduler
和相关 API。
如需了解详情,请查看后台优化文档。
SurfaceView
Android 7.0 对 SurfaceView
类进行了同步移动,该类在某些情况下可提供比 TextureView
更好的电池性能:在渲染视频或 3D 内容时,具有滚动和动画视频位置的应用在 SurfaceView
中功耗低于 TextureView
。
SurfaceView
类可在屏幕上进行更省电的合成,因为它是在专用硬件中合成,与应用窗口内容分开。因此,它产生的中间副本数量少于 TextureView
。
SurfaceView
对象的内容位置现在与包含的应用内容同步更新。这项变更的一个结果是,在 SurfaceView
中播放的视频进行简单的翻译或缩放后,在视图移动时,不会再在视图旁边产生黑条。
从 Android 7.0 开始,我们强烈建议您使用 SurfaceView
(而非 TextureView
)来节省电量。
流量节省程序
![“设置”中的流量节省程序](https://developer.android.google.cn/static/images/android-7.0/datasaver.png?authuser=1&hl=bn)
图 4. “设置”中的流量节省程序。
在移动设备的整个生命周期内,移动数据网络方案的费用通常会超出设备本身的费用。对于许多用户来说,移动数据网络是他们想要节省的昂贵资源。
Android 7.0 引入了流量节省程序模式,这是一项新的系统服务,有助于减少应用使用的移动网络流量,无论是在漫游,账单周期即将结束,还是使用少量的预付费流量包。借助流量节省程序,用户可以控制应用使用移动数据网络的方式,并使开发者能够在流量节省程序开启时提供更高效的服务。
当用户在设置中启用流量节省程序且设备连接到按流量计费的网络时,系统会阻止后台流量消耗,并指示应用尽可能在前台使用较少的数据流量,例如限制流式传输的比特率、降低图片质量、推迟乐观的预缓存等。用户可以允许特定应用允许后台按流量计费的流量消耗,即使流量节省程序已开启。
Android 7.0 扩展了 ConnectivityManager
,以便为应用检索用户的流量节省程序偏好设置并监控偏好设置更改提供一种方式。所有应用都应检查用户是否启用了流量节省程序,并努力限制前台和后台流量消耗。
Vulkan API
Android 7.0 将新的 3D 渲染 API VulkanTM 集成到平台中。与 OpenGLTM ES 一样,Vulkan 是由 Khronos Group 维护的 3D 图形和渲染的开放式标准。
Vulkan 是完全从零开始设计的,旨在最大限度地减少驱动程序中的 CPU 开销,并让您的应用能够更直接地控制 GPU 操作。Vulkan 还允许多个线程同时执行工作(如命令缓冲区构建),从而更好地并行处理。
Vulkan 开发工具和库都已卷入 Android 7.0 SDK。具体包括:
- 标头
- 验证层(调试库)
- SPIR-V 着色器编译器
- SPIR-V 运行时着色器编译库
Vulkan 仅适用于搭载 Vulkan 硬件的设备上的应用,如 Nexus 5X、Nexus 6P 和 Nexus Player。我们正在与合作伙伴密切合作,以尽快使 Vulkan 能够面向更多设备推出。
如需了解详情,请参阅 API 文档。
Quick Settings Tile API
![通知栏中的“快捷设置”图块](https://developer.android.google.cn/static/images/android-7.0/quicksettings.png?authuser=1&hl=bn)
图 5. 通知栏中的“快捷设置”图块。
“快捷设置”通常用于直接从通知栏显示关键设置和操作,非常简单。在 Android 7.0 中,我们扩展了“快捷设置”的范围,使其更加实用和方便。
我们为额外的“快捷设置”图块添加了更多空间,用户可以通过向左或向右滑动跨分页的显示区域访问这些图块。此外,我们还让用户可以控制显示哪些“快捷设置”图块以及显示的位置 - 用户只需拖放图块即可添加或移动图块。
对于开发者,Android 7.0 还添加了一个新 API,可让您定义自己的“快捷设置”图块,以便用户轻松访问应用中的关键控件和操作。
“快捷设置”图块专用于急需或频繁使用的控件或操作,不应用作启动应用的快捷方式。
定义功能块后,您可以将其呈现给用户,用户可通过拖放操作将它们添加到“快捷设置”中。
如需了解如何创建应用功能块,请参阅 Tile
的参考文档。
号码屏蔽
Android 7.0 现在支持在平台中进行号码屏蔽,并提供了一个框架 API,让服务提供商可以维护屏蔽的号码列表。默认短信应用、默认电话应用和运营商应用可以对屏蔽的号码列表执行读写操作。其他应用则无法访问此列表。
通过将号码屏蔽作为平台的标准功能,Android 为应用提供一致的方式来支持在各种设备上进行号码屏蔽。应用可以利用的其他优势包括:
- 无法接听来电的号码也会屏蔽短信
- 通过备份和恢复功能,屏蔽的号码可以在重置和设备之间保留
- 多个应用可以使用相同的屏蔽号码列表
此外,通过 Android 集成运营商应用,意味着运营商可以读取设备上被屏蔽号码列表,并为用户执行服务端屏蔽,以防止用户通过任何媒介(例如 VoIP 端点或转接电话)收到不需要的来电和短信。
如需了解详情,请参阅 BlockedNumberContract
的参考文档。
来电过滤
Android 7.0 允许默认手机应用过滤来电。手机应用通过实现新的 CallScreeningService
来实现此目的,它允许手机应用根据来电的 Call.Details
执行大量操作,例如:
- 拒接来电
- 不允许调用通话记录
- 不向用户显示来电通知
如需了解详情,请参阅 CallScreeningService
的参考文档。
多语言区域支持,更多语言
Android 7.0 现在允许用户在“设置”中选择多个语言区域,以更好地支持双语用例。应用可以使用新的 API 获取用户选择的语言区域,然后为多区域设置用户提供更复杂的用户体验,例如以多种语言显示搜索结果,并且不提供以用户了解的语言翻译网页的服务。
除了多区域设置支持外,Android 7.0 还扩展了用户可用的语言范围。它针对常用语言提供超过 25 个变体,例如英语、西班牙语、法语和阿拉伯语。它还针对 100 多种新语言添加了部分支持。
应用可以通过调用 LocaleList.GetDefault()
获取用户设置的语言区域列表。为了支持更多语言区域,Android 7.0 将改变其解析资源的方式。请务必使用新的资源解析逻辑测试并验证您的应用能否按预期运行。
如需了解新的资源解析行为和应遵循的最佳实践,请参阅多语言支持。
新增的表情符号
Android 7.0 引入了更多表情符号以及与表情符号相关的功能,包括肤色表情符号以及对变体选择器的支持。如果您的应用支持表情符号,请遵循以下准则,以便利用这些表情符号相关功能。
-
在插入之前,检查设备是否包含表情符号。
如需检查系统字体中有哪些表情符号,请使用
hasGlyph(String)
方法。 - 检查表情符号是否支持变体选择器。 变体选择器可让您以彩色或黑白显示某些表情符号。 在移动设备上,应用应以彩色(而非黑白)呈现表情符号。但是,如果您的应用显示内嵌在文本中的表情符号,则应使用黑白变体。 如需确定表情符号是否有变体,请使用变体选择器。 如需查看包含变体的字符的完整列表,请参阅 关于变体的 Unicode 文档的表情符号变体序列部分。
-
检查表情符号是否支持肤色。Android 7.0 允许用户根据自己的喜好修改表情符号呈现的肤色。键盘应用应为具有多个肤色的表情符号提供视觉指示,并应允许用户选择他们喜欢的肤色。如需确定哪些系统表情符号有肤色修饰符,请使用
hasGlyph(String)
方法。您可以阅读 Unicode 文档,确定哪些表情符号使用肤色。
Android 中的 ICU4J API
Android 7.0 现在会在 Android 框架(位于 android.icu
软件包下)中提供 ICU4J API 的子集。迁移很简单,主要是需要从 com.java.icu
命名空间更改为 android.icu
。如果您已在应用中使用 ICU4J 软件包,切换到 Android 框架中提供的 android.icu
API 可以大量缩减 APK 大小。
如需详细了解 Android ICU4J API,请参阅 ICU4J 支持。
WebView
Chrome 和 WebView 配合使用
从 Android 7.0 及更高版本的 Chrome 51 开始,设备上的 Chrome APK 将用于提供和呈现 Android System WebView。此方法可改善设备本身的内存用量,同时减少使 WebView 保持最新状态所需的带宽(因为只要 Chrome 保持启用状态,独立 WebView APK 就不会再更新)。
您可以选择 WebView 提供方,方法是启用开发者选项,然后选择 WebView 实现。您可以使用设备上安装的任何兼容 Chrome 版本(开发者版、Beta 版或稳定版)或独立的 WebView APK 作为 WebView 实现。
多进程
从 Android 7.0 中的 Chrome 版本 51 开始,当开发者选项“多进程 WebView”处于启用状态时,WebView 将在单独的沙盒进程中运行 Web 内容。
我们希望获得关于 N 中的兼容性和运行时性能的反馈,然后再在未来的 Android 版本中启用多进程 WebView。在此版本中,可预期启动时间回归、总内存用量和软件渲染性能。
如果您在多进程模式下遇到意外问题,请告诉我们。请使用 Chromium bug 跟踪器与 WebView 团队联系。
Javascript 在页面加载之前运行
从以 Android 7.0 为目标平台的应用开始,JavaScript 上下文会在新页面加载时重置。目前,新 WebView 实例中加载的第一个页面会沿用上下文。
想要将 JavaScript 注入 WebView 的开发者应在页面开始加载后执行脚本。
不安全起点上的地理定位
从以 Android 7.0 为目标平台的应用开始,地理定位 API 将只能在安全的出发地(通过 HTTPS)上使用。此政策的目的是在用户使用不安全连接时保护他们的私密信息。
测试 WebView 测试版
WebView 会定期更新,因此我们建议您经常使用 WebView 的 Beta 渠道测试与应用的兼容性。如需开始在 Android 7.0 上测试 WebView 的预发布版本,请下载并安装 Chrome 开发者版或 Chrome Beta 版,然后选择开发者选项下的 WebView 实现(如上所述)。请通过 Chromium bug 跟踪器报告问题,以便我们在发布新版 WebView 之前解决问题。
OpenGLTM ES 3.2 API
Android 7.0 添加了框架接口和对 OpenGL ES 3.2 的平台支持,包括:
-
Android Extension Pack (AEP) 中的所有扩展(
EXT_texture_sRGB_decode
除外)。 - 用于 HDR 和延迟着色的浮点帧缓冲区。
- BaseVertex 绘制调用可实现更好的批处理和流式传输。
- 强大的缓冲区访问控制,以减少 WebGL 开销。
Android 7.0 上适用于 OpenGL ES 3.2 的框架 API 随 GLES32
类提供。使用 OpenGL ES 3.2 时,请务必使用 <uses-feature>
标记和 android:glEsVersion
属性在清单文件中声明要求。
如需了解如何使用 OpenGL ES(包括如何在运行时检查设备支持的 OpenGL ES 版本),请参阅 OpenGL ES API 指南。
Android TV 录制
Android 7.0 通过新的录制 API 添加了从 Android TV 输入服务录制和播放内容的功能。基于现有的时移 API,TV 输入服务可以控制可以录制的频道数据、录制的会话的保存方式,以及管理用户与录制的内容之间的互动。
如需了解详情,请参阅 Android TV Recording API。
Android for Work
Android for Work 针对搭载 Android 7.0 的设备添加了许多新功能和 API。 下面列出了部分亮点;如需查看完整的功能列表,请参阅 Android Enterprise 功能列表。
工作资料安全验证
以 N SDK 为目标平台的资料所有者可以为在工作资料中运行的应用指定单独的安全性挑战。当用户尝试打开任何工作应用时,系统会显示工作挑战。成功完成安全验证会解锁工作资料,并在必要时将其解密。对于资料所有者,ACTION_SET_NEW_PASSWORD
会提示用户设置工作验证,ACTION_SET_NEW_PARENT_PROFILE_PASSWORD
会提示用户设置设备锁定。
个人资料所有者可以使用 setPasswordQuality()
、setPasswordMinimumLength()
和相关方法针对工作挑战设置不同的密码政策(例如 PIN 码需要多长,或者是否可以使用指纹解锁个人资料)。资料所有者还可以使用新的 getParentProfileInstance()
方法返回的 DevicePolicyManager
实例来设置设备锁定。
此外,个人资料所有者还可以使用新的 setOrganizationColor()
和 setOrganizationName()
方法针对工作挑战自定义凭据屏幕。
关闭工作
在装有工作资料的设备上,用户可以切换工作模式。工作模式关闭时,受管用户会暂时关闭,这会停用工作资料应用、后台同步和通知。这包括资料所有者应用。当工作模式关闭时,系统会显示一个永久状态图标,以提醒用户他们无法启动工作应用。启动器会指示工作应用和 widget 无法访问。
始终开启的 VPN
设备所有者和配置文件所有者可以确保工作应用始终通过指定的 VPN 连接。系统会在设备启动后自动启动该 VPN。
新的 DevicePolicyManager
方法是 setAlwaysOnVpnPackage()
和 getAlwaysOnVpnPackage()
。
由于 VPN 服务无需应用交互即可由系统直接绑定,因此 VPN 客户端需要为始终开启的 VPN 处理新的入口点。和以前一样,由与操作 android.net.VpnService
匹配的 intent 过滤器向系统指示服务。
用户还可以使用设置> 更多> VPN 手动设置实现 VPNService
方法的 Always on VPN 客户端。仅当 VPN 客户端以 API 级别 24 为目标时,才能从“设置”中启用“始终开启的 VPN”的选项。
自定义配置
应用可以使用企业颜色和徽标来自定义资料所有者和设备所有者配置流程。DevicePolicyManager.EXTRA_PROVISIONING_MAIN_COLOR
用于自定义数据流颜色。DevicePolicyManager.EXTRA_PROVISIONING_LOGO_URI
使用公司徽标自定义流程。
无障碍增强功能
Android 7.0 现在针对新的设备设置直接在欢迎屏幕上提供“视觉设置”。这可让用户更轻松地发现和配置其设备上的无障碍功能,包括放大手势、字体大小、显示大小和 TalkBack。
随着这些无障碍功能更为突出,在启用这些功能后,用户更有可能试用您的应用。请务必提前启用这些设置测试您的应用。您可依次前往“设置”>“无障碍”来启用它们。
还是在 Android 7.0 中,无障碍服务现在可以帮助有运动障碍的用户触摸屏幕。新的 API 允许构建具有面部跟踪、眼动追踪、点扫描等功能的服务,以满足这些用户的需求。
如需了解详情,请参阅 GestureDescription
的参考文档。
直接启动
直接启动可以缩短设备启动时间,使注册的应用具有有限的功能,即使在意外重新启动后也是如此。例如,如果加密设备在用户睡觉时重新启动,那么注册的闹钟、消息和来电现在可以继续照常通知用户。这也意味着重启后无障碍服务会立即可用。
在 Android 7.0 中,直接启动利用基于文件的加密,为系统和应用数据启用精细的加密政策。系统针对选定的系统数据和显式注册的应用数据使用设备加密存储区。默认情况下,凭据加密的存储区用于所有其他系统数据、用户数据、应用和应用数据。
启动时,系统在受限模式下启动,仅访问设备加密的数据,而不会对应用或数据进行常规访问。如果您有想要在此模式下运行的组件,可以通过在清单中设置标志来注册这些组件。重启后,系统通过广播 LOCKED_BOOT_COMPLETED
intent 激活已注册的组件。系统确保已注册的设备加密应用数据在解锁前可用。所有其他数据在用户确认锁定屏幕凭据进行解密之前,将无法使用。
密钥认证
Android 7.0 引入了密钥认证,这是一种新的安全工具,可帮助您确保存储在设备的硬件支持的密钥库中的密钥对正确保护应用使用的敏感信息。通过使用此工具,您可以更加确信应用会与位于安全硬件中的密钥交互,即使运行您的应用的设备已取得 root 权限,亦是如此。如果您在应用中使用由硬件支持的密钥库中的密钥,则应该使用此工具,尤其是当您使用密钥验证应用中的敏感信息时。
通过密钥认证,您可以验证 RSA 或 EC 密钥对是否已创建并存储在设备的可信执行环境 (TEE) 内由硬件支持的密钥库中。借助该工具,您还可以使用设备外服务(例如应用的后端服务器)来确定密钥对的使用和有效性,并对其进行严格验证。这些功能可提供一层额外的安全保护,即使有人破解设备的 root 权限或破坏设备上运行的 Android 平台的安全性,也能妥善保护密钥对。
注意 :只有少数搭载 Android 7.0 的设备支持硬件级密钥认证;所有其他搭载 Android 7.0 的设备则使用软件级密钥认证。在生产级环境中验证设备的硬件支持的密钥的属性之前,您应确保设备支持硬件级密钥认证。为此,您应检查认证证书链是否包含由 Google 认证根密钥签名的根证书,并且密钥说明数据结构中的 attestationSecurityLevel
元素已设为 TrustedEnvironment 安全等级。
如需了解详情,请参阅密钥认证开发者文档。
网络安全性配置
在 Android 7.0 中,应用可以使用声明性网络安全配置(而不是使用传统的容易出错的程序化 API(例如 X509TrustManager)),安全地自定义其安全(HTTPS、TLS)连接的行为,而无需修改任何代码。
支持的功能:
- 自定义信任锚。让应用可以针对安全连接自定义哪些证书授权机构 (CA) 值得信赖。例如,信任特定的自签名证书或一组受限的公共 CA。
- 仅调试替换。让应用开发者能够安全地调试其应用的安全连接,而不会增加已安装应用的风险。
- 选择停用明文流量。让应用可以防止自身意外使用明文流量。
- 证书固定。这是一项高级功能,让应用可以针对安全连接限制哪些服务器密钥受信任。
如需了解详情,请参阅网络安全配置。
默认受信任的证书颁发机构
默认情况下,以 Android 7.0 为目标平台的应用仅信任系统提供的证书,且不再信任用户添加的证书授权机构 (CA)。如果以 Android 7.0(API 级别 24)为目标平台的应用想要信任用户添加的 CA,则应使用网络安全配置来指定应如何信任用户 CA。
APK 签名方案 v2
Android 7.0 引入了 APK 签名方案 v2,这是一种新的应用签名方案,有助于缩短应用安装时间,并更好地防范对 APK 文件进行未经授权的更改。默认情况下,Android Studio 2.2 和 Android Plugin for Gradle 2.2 会使用 APK 签名方案 v2 和传统签名方案(该方案使用 JAR 签名)为您的应用签名。
虽然我们建议您对您的应用采用 APK 签名方案 v2,但这一新方案并非强制性的。如果您的应用在使用 APK 签名方案 v2 时无法正确构建,您可以停用新方案。停用过程会导致 Android Studio 2.2 和 Android Plugin for Gradle 2.2 仅使用传统签名方案为您的应用签名。如需仅使用传统方案进行签名,请打开模块级 build.gradle
文件,然后将 v2SigningEnabled false
行添加到您的版本签名配置中:
android { ... defaultConfig { ... } signingConfigs { release { storeFile file("myreleasekey.keystore") storePassword "password" keyAlias "MyReleaseKey" keyPassword "password" v2SigningEnabled false } } }
注意 :如果您使用 APK 签名方案 v2 为您的应用签名,然后对应用进行进一步更改,则应用的签名将会失效。因此,请在使用 APK 签名方案 v2 为应用签名之前(而不是之后)使用 zipalign
等工具。
如需了解详情,请阅读相关 Android Studio 文档,这些文档介绍了如何在 Android Studio 中 为应用签名,以及如何使用 Android Plugin for Gradle 配置用于为应用签名的 build 文件。
作用域目录访问
在 Android 7.0 中,应用可以使用新的 API 请求访问特定的外部存储空间目录,包括可移动介质(如 SD 卡)上的目录。新 API 大大简化了应用访问标准外部存储目录(例如 Pictures
目录)的方式。应用(如照片应用)可以使用这些 API,而不是使用 READ_EXTERNAL_STORAGE
(授予所有存储目录的访问权限)或存储访问框架(使用户能够导航到目录)。
此外,新的 API 简化了用户向应用授予外部存储空间访问权限的步骤。当您使用新 API 时,系统使用一个简单的权限界面,该界面清晰地详细说明了应用正在请求访问的目录。
如需了解详情,请参阅作用域目录访问开发者文档。
键盘快捷键辅助工具
在 Android 7.0 中,用户可以按 Meta + / 触发键盘快捷键屏幕,其中会显示系统和获得焦点的应用中可用的所有快捷键。如果存在这些快捷方式,系统会自动从应用的菜单中检索这些快捷方式。您还可以为屏幕提供自己的微调后快捷方式列表。为此,您可以替换 onProvideKeyboardShortcuts()
方法。
注意:并非所有键盘上都有 Meta 键:在 Mac 键盘上,它是 Command 键;在 Windows 键盘上,它是 Windows 键;在 Pixel C 和 ChromeOS 键盘上,它是 Search 键。
要从应用的任何位置触发键盘快捷键辅助工具,请从相关 Activity 调用 requestShowKeyboardShortcuts()
。
自定义 Pointer API
Android 7.0 引入了 Custom Pointer API,可让您自定义指针的外观、可见性和行为。当用户使用鼠标或触控板与界面对象互动时,此功能特别有用。默认指针使用标准图标。该 API 还包含一些高级功能,例如根据鼠标或触控板的特定移动来更改指针图标的外观。
如需设置指针图标,请替换 View
类的 onResolvePointerIcon()
方法。此方法使用 PointerIcon
对象绘制与特定动作事件相对应的图标。
Sustained Performance API
长时间运行的应用的性能可能会大幅波动,因为系统会在设备组件达到其温度限值时限制系统芯片引擎。这种波动是创建高性能长期运行应用的应用开发者的移动目标。
为了解决这些限制,Android 7.0 引入了对持续性能模式的支持,使 OEM 能够针对长时间运行的应用提供设备性能能力的相关提示。应用开发者可以使用这些提示来根据可预测的一致设备性能水平调整长期应用。
应用开发者只能在 Nexus 6P 设备上的 Android 7.0 中试用以下新 API。如需使用此功能,请为您希望以持续性能模式运行的窗口设置持续性能窗口标志。使用 Window.setSustainedPerformanceMode()
方法设置此标志。当窗口不再获得焦点时,系统会自动停用此模式。
VR 支持
Android 7.0 为新的 VR 模式添加了平台支持和优化,让开发者能够为用户打造高品质的移动 VR 体验。增加了多项性能增强,包括允许 VR 应用访问某个专属的 CPU 核心。在您的应用中,您可以充分利用适用于 VR 的智能头部跟踪和立体声通知。最重要的是,Android 7.0 的图形延时非常低。如需全面了解如何构建适用于 Android 7.0 的 VR 应用,请参阅 Android 版 Google VR SDK。
打印服务增强
在 Android 7.0 中,打印服务开发者现在可以公开有关个别打印机和打印任务的更多信息。
在列出各个打印机时,打印服务现在可以通过两种方式来设置按打印机的图标:
- 您可以通过调用
setIconResourceId()
设置基于资源 ID 的图标。 - 您可以通过调用
setHasCustomPrinterIcon()
并针对使用onRequestCustomPrinterIcon()
请求图标的情况设置回调来显示来自网络的图标。
此外,您还可以通过调用 setInfoIntent()
提供按打印机活动,以显示其他信息。
您可以通过分别调用 setProgress()
和 setStatus()
在打印任务通知中指示打印任务的进度和状态。
Frame Metrics API
Frame Metrics API 允许应用监控其界面渲染性能。该 API 通过公开流式传输 Pub/Sub API 来提供此功能,以传输应用当前窗口的帧时间信息。返回的数据相当于 adb shell
dumpsys gfxinfo framestats
显示的数据,但不限定于在过去的 120 帧内。
您可以使用 Frame Metrics API 衡量生产环境中的交互级界面性能,无需 USB 连接。此 API 允许在比 adb shell dumpsys gfxinfo
更高的粒度上收集数据。之所以能够实现这种更高的粒度,是因为系统可以收集应用中特定互动的数据;系统不需要捕获有关整个应用性能的全局摘要,也不需要清除任何全局状态。您可以使用此功能针对应用中的实际用例收集性能数据和捕获界面性能回归。
如需监控某个窗口,请实现 OnFrameMetricsAvailableListener.onFrameMetricsAvailable()
回调方法,并在该窗口中注册它。
该 API 提供了一个 FrameMetrics
对象,其中包含渲染子系统针对一帧生命周期中各种里程碑报告的时间数据。支持的指标包括:UNKNOWN_DELAY_DURATION
、INPUT_HANDLING_DURATION
、ANIMATION_DURATION
、LAYOUT_MEASURE_DURATION
、DRAW_DURATION
、SYNC_DURATION
、COMMAND_ISSUE_DURATION
、SWAP_BUFFERS_DURATION
、TOTAL_DURATION
和 FIRST_DRAW_FRAME
。
虚拟文件
在以前的 Android 版本中,您的应用可以使用存储访问框架来允许用户从其云端存储帐号中选择文件,例如 Google 云端硬盘。但是,不能表示没有直接字节码表示的文件;每个文件都需要提供一个输入流。
Android 7.0 在存储访问框架中增加了“虚拟文件”的概念。虚拟文件功能允许您的 DocumentsProvider
返回可与 ACTION_VIEW
intent 一起使用的文档 URI,即使它们没有直接字节码表示形式也是如此。Android 7.0 还允许您为用户文件(虚拟或其他类)提供备用格式。
如需详细了解如何打开虚拟文件,请参阅在 Storage Access Framework 指南中打开虚拟文件。