Android 7.0 Nougat 为用户和开发者引入了各种新特性和功能。本文重点介绍了面向开发者的新变化。
请务必查看 Android 7.0 行为变更,了解平台变更可能会在哪些方面影响您的应用。
如需详细了解 Android 7.0 的消费者功能,请访问 www.android.com。
多窗口支持
在 Android 7.0 中,我们在平台中引入了一个备受期待的全新多任务处理功能 - 多窗口支持。
现在,用户可以同时在屏幕上打开两个应用。
- 在搭载 Android 7.0 的手机和平板电脑上,用户可以并排运行两个应用,或者在分屏模式下一个应用上下并排显示。用户可以通过拖动应用之间的分隔线来调整应用大小。
- 在 Android TV 设备上,应用可以将自身置于画中画模式,从而在用户浏览或与其他应用互动时继续显示内容。
![在分屏模式下运行应用](https://developer.android.google.cn/static/images/android-7.0/mw-portrait.png?authuser=5&hl=hu)
图 1. 在分屏模式下运行的应用。
多窗口支持为您提供了吸引用户的新方式,特别是在平板电脑和其他更大屏幕的设备上。您甚至可以在应用中启用拖放功能,让用户可以方便地将内容拖入或拖出您的应用,这是提升用户体验的绝佳方式。
向应用添加多窗口支持并配置多窗口显示的处理方式非常简单。例如,您可以指定 activity 允许的最小尺寸,以防止用户将 activity 的大小调整到低于该尺寸。您还可以为应用停用多窗口显示,这可确保系统将仅以全屏模式显示应用。
如需了解详情,请参阅多窗口支持开发者文档。
通知增强功能
在 Android 7.0 中,我们重新设计了通知,使其更易于使用、更快速。部分变更包括:
- 模板更新:我们将更新通知模板,新强调了主打图片和头像。开发者将能够充分利用新模板,只需进行少量的代码调整。
-
消息样式自定义:您可以使用
MessagingStyle
类自定义更多与通知关联的界面标签。您可以配置消息、对话标题和内容视图。 - 捆绑通知:系统可以将消息分组(例如按消息主题)并显示分组。用户可以适当地对这些操作执行关闭或归档等操作。如果您已针对 Android Wear 实现了通知,那么您已经很熟悉此模式。
- 直接回复:对于实时通信应用,Android 系统支持内嵌回复,以便用户可以直接在通知界面中快速回复短信。
- 自定义视图:两个新的 API 让您在通知中使用自定义视图时可以利用系统装饰元素,例如通知标题和操作。
![显示捆绑消息通知的手机](https://developer.android.google.cn/static/images/android-7.0/notifications-1.png?authuser=5&hl=hu)
![显示单条消息通知的移动设备](https://developer.android.google.cn/static/images/android-7.0/notifications-3.png?authuser=5&hl=hu)
![在通知界面中显示内嵌消息回复的手机](https://developer.android.google.cn/static/images/android-7.0/notifications-2.png?authuser=5&hl=hu)
图 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=5&hl=hu)
图 3. 现在,即使设备未处于静止状态,低电耗模式也会应用限制以延长电池续航时间。
屏幕关闭片刻后,设备在使用电池时,低电耗模式会限制网络访问并延迟作业和同步。在简短的维护期间,系统会允许应用访问网络,并执行延迟的作业/同步。打开屏幕或将设备插入电源会使设备退出低电耗模式。
当设备再次处于静止状态时,屏幕关闭且使用电池一段时间,低电耗模式会对 PowerManager.WakeLock
、AlarmManager
闹钟和 GPS/WLAN 扫描应用完整 CPU 和网络限制。
无论设备是否处于运动状态,将应用调整到低电耗模式的最佳实践都是相同的,因此,如果您已更新应用以妥善处理低电耗模式,则一切就绪。如果不是,请立即开始将应用调整到低电耗模式。
Project Svelte:后台优化
Project Svelte 在不断努力,以最大限度地减少生态系统中一系列 Android 设备中系统和应用使用的 RAM。在 Android 7.0 中,Project Svelte 注重优化应用在后台运行的方式。
后台处理是大多数应用的重要组成部分。处理得当,可让您获得非常棒的用户体验 - 即时、快速且情境感知。处理不当时,后台处理可能会不必要地消耗 RAM(和电池),并影响其他应用的系统性能。
从 Android 5.0 开始,JobScheduler
已成为执行后台工作且有利于用户的方式的首选方式。应用可以调度作业,同时让系统根据内存、电源和连接情况进行优化。JobScheduler 可实现控制和简洁性,我们想让所有应用都使用它。
另一个不错的选择是 Google Play 服务中的
GCMNetworkManager
,它在旧版 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=5&hl=hu)
图 4. “设置”中的流量节省程序。
在移动设备的整个生命周期,移动数据网络方案的费用通常会超过设备本身的费用。对于许多用户来说,移动数据网络是他们想要节省的昂贵资源。
Android 7.0 引入了流量节省程序模式,这是一项新的系统服务,有助于减少应用使用移动数据网络,无论是在漫游,结算周期即将结束,还是使用少量的预付费流量包。借助流量节省程序,用户可以控制应用使用移动数据网络的方式,并允许开发者在流量节省程序开启时提供更高效的服务。
当用户在设置中启用流量节省程序且设备连接到按流量计费的网络时,系统会阻止后台流量消耗,并指示应用在前台尽可能减少流量消耗,例如通过限制流式传输的比特率、降低图片质量、推迟乐观的预缓存等。用户可以允许特定应用允许后台按流量计费的流量消耗,即使在流量节省程序开启时也是如此。
Android 7.0 扩展了 ConnectivityManager
,以便为应用检索用户的流量节省程序偏好设置并监控偏好设置变更。所有应用都应检查用户是否已启用流量节省程序,并尽量限制前台和后台流量消耗。
Vulkan API
Android 7.0 将一款新的 3D 渲染 API VulkanTM 集成到了平台中。与 OpenGLTM ES 一样,Vulkan 是 3D 图形和渲染的一项开放标准,由 Khronos Group 维护。
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=5&hl=hu)
图 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 系统 WebView。此方法可改善设备本身的内存用量,还可减少确保 WebView 保持最新状态所需的带宽(因为只要 Chrome 保持启用状态,独立 WebView APK 将不再更新)。
您可以选择 WebView 提供商,方法是启用“开发者选项”,然后选择 WebView 实现。您可以使用设备上安装的任何兼容的 Chrome 版本(开发者版、Beta 版或稳定版)或独立的 WebView APK 来作为 WebView 实现。
多进程
从 Android 7.0 中的 Chrome 版本 51 开始,当开发者选项“多进程 WebView”处于启用状态时,WebView 将在单独的沙盒化进程中运行 Web 内容。
在未来的 Android 版本中,在启用多进程 WebView 之前,我们希望获得关于 N 中的兼容性和运行时性能的反馈。在此版本中,可预期启动时间回归、总内存用量和软件渲染性能。
如果您在多进程模式下遇到意外问题,请告知我们。请通过 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 错误跟踪工具报告问题,以便我们在发布新版 WebView 之前解决问题。
OpenGLTM ES 3.2 API
Android 7.0 添加了框架接口和对 OpenGL ES 3.2 的平台支持,包括:
-
Android 扩展包 (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 输入服务录制和播放内容的功能。TV 输入服务基于现有的时移 API 构建,可以控制可以录制哪些频道数据、如何保存录制的会话,以及管理用户与录制内容的交互。
如需了解详情,请参阅 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
方法的“始终开启” 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()
提供各打印机的 Activity,以显示其他信息。
您可以通过分别调用 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 指南中打开虚拟文件。