Android 7.0 Nougat 为用户和开发者引入了各种新功能和新特性。本文档重点介绍面向开发者的新功能。
务必查看 Android 7.0 行为变更,了解平台变更可能影响您应用的领域。
要详细了解 Android 7.0 的消费者功能,请访问www.android.com。
多窗口支持
在 Android 7.0 中,我们正在将一项全新的、备受期待的多任务处理功能引入平台 — 多窗口支持。
用户现在可以在屏幕上同时打开两个应用。
在运行 Android 7.0 的手机和平板电脑上,用户可以在分屏模式下并排或叠放运行两个应用。用户可以通过拖动应用之间的分隔线来调整应用大小。
在 Android TV 设备上,应用可以将自己置于画中画模式,让它们在用户浏览或与其他应用交互时继续显示内容。
图 1. 在分屏模式下运行的应用。
特别是在平板电脑和其他大屏幕设备上,多窗口支持为您提供了吸引用户的新方式。您甚至可以在应用中启用拖放功能,让用户方便地将内容拖到或从您的应用中拖出 — 这是增强用户体验的好方法。
向您的应用添加多窗口支持并配置其处理多窗口显示的方式非常简单。例如,您可以指定您的 Activity 的最小允许尺寸,以防止用户将 Activity 调整到小于该尺寸。您还可以禁用您的应用的多窗口显示,这确保系统只会以全屏模式显示您的应用。
有关更多信息,请参阅多窗口支持开发者文档。
通知增强功能
在 Android 7.0 中,我们重新设计了通知,使其更易于使用和更快。一些变更包括
模板更新:我们正在更新通知模板,以更加突出英雄图片和头像。开发者只需对代码进行少量调整即可利用新模板。
消息样式自定义:您可以使用 MessagingStyle 类自定义更多与您的通知相关的用户界面标签。您可以配置消息、对话标题和内容视图。
捆绑通知:系统可以将消息分组,例如按消息主题分组,并显示该组。用户可以直接对它们执行操作,例如“忽略”或“归档”。如果您已经为 Android Wear 实现了通知,您将已经熟悉此模式。
直接回复:对于实时通信应用,Android 系统支持内联回复,以便用户可以直接在通知界面中快速回复短信或文本消息。
自定义视图:两个新的 API 允许您在使用通知中的自定义视图时,利用系统装饰,例如通知标题和操作。
图 2. 捆绑通知和直接回复。
要了解如何实现新功能,请参阅通知指南。
配置文件引导的 JIT/AOT 编译
在 Android 7.0 中,我们在 ART 中添加了具有代码剖析功能的即时 (JIT) 编译器,这使得它能够不断改进 Android 应用运行时的性能。JIT 编译器补充了 ART 当前的预先 (AOT) 编译器,有助于提高运行时性能、节省存储空间并加快应用更新和系统更新。
配置文件引导的编译让 ART 可以根据每个应用的实际用法以及设备上的条件来管理其 AOT/JIT 编译。例如,ART 会维护每个应用热点方法的配置文件,并且可以预编译并缓存这些方法以获得最佳性能。对于应用的其余部分,ART 会等到它们实际被使用时才进行编译。
除了提高应用关键部分的性能外,配置文件引导的编译还有助于减少应用的整体 RAM 占用量,包括相关的二进制文件。此功能对于低内存设备尤为重要。
ART 管理配置文件引导的编译的方式最大限度地减少了对设备电池的影响。它仅在设备空闲且充电时执行预编译,通过提前完成该工作来节省时间和电池。
应用安装快速路径
ART JIT 编译器的最显著好处之一是应用安装和系统更新的速度。即使在 Android 6.0 中需要几分钟才能优化和安装的大型应用,现在只需几秒钟即可安装完成。系统更新也更快,因为不再需要优化步骤。
移动设备上的打盹模式...
Android 6.0 引入了打盹模式 (Doze),这是一种系统模式,它通过在设备闲置(例如放在桌子上或抽屉里)时延迟应用的 CPU 和网络活动来节省电池电量。
现在,在 Android 7.0 中,打盹模式更进一步,在移动设备上也能节省电池电量。只要屏幕关闭一段时间且设备未连接电源,打盹模式就会对应用应用一套熟悉的 CPU 和网络限制子集。这意味着即使用户将设备放在口袋里,也能节省电池电量。
图 3. 打盹模式现在应用限制,即使设备没有静止不动也能提高电池续航。
设备在使用电池供电时屏幕关闭后不久,打盹模式会限制网络访问并推迟作业和同步。在短暂的维护窗口期间,允许应用进行网络访问,并执行任何被推迟的作业/同步。开启屏幕或插入设备会使设备退出打盹模式。
当设备再次静止,屏幕关闭并使用电池供电一段时间后,打盹模式会对 PowerManager.WakeLock、AlarmManager 闹钟以及 GPS/Wi-Fi 扫描应用完整的 CPU 和网络限制。
将应用适配到打盹模式的最佳实践与设备是否移动无关,因此如果您已经更新了应用以妥善处理打盹模式,那么您已经准备就绪。如果没有,请立即开始将您的应用适配到打盹模式。
瘦身计划:后台优化
瘦身计划 (Project Svelte) 是一个正在进行的项目,旨在最大限度地减少生态系统中各类 Android 设备上的系统和应用 RAM 使用。在 Android 7.0 中,瘦身计划重点优化应用在后台运行的方式。
后台处理是大多数应用的重要组成部分。如果处理得当,它可以让您的用户体验非凡 — 即时、快速且具有情境感知能力。如果处理不当,后台处理会不必要地消耗 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 来节省电量。
流量节省程序
图 4. “设置”中的流量节省程序。
在移动设备的整个生命周期中,蜂窝数据套餐的费用通常超过设备本身的成本。对于许多用户来说,蜂窝数据是一种昂贵的资源,他们希望节约使用。
Android 7.0 引入了流量节省程序模式,这是一种新的系统服务,可帮助减少应用对蜂窝数据的使用,无论是在漫游、账单周期即将结束还是使用小型预付费数据包时。流量节省程序让用户可以控制应用如何使用蜂窝数据,并允许开发者在流量节省程序开启时提供更高效的服务。
当用户在“设置”中启用流量节省程序且设备连接到按流量计费的网络时,系统会阻止后台数据使用,并通知应用在前景中尽可能减少数据使用 — 例如,通过限制流式传输的比特率、降低图像质量、推迟乐观预缓存等。用户可以允许特定应用即使在流量节省程序开启时也允许在后台使用按流量计费的数据。
Android 7.0 扩展了 ConnectivityManager,为应用提供了一种方法来检索用户的流量节省程序偏好设置以及监控偏好设置变化。所有应用都应检查用户是否已启用流量节省程序,并努力限制前景和后台数据使用。
Vulkan API
Android 7.0 将新的 3D 渲染 API Vulkan™ 集成到平台中。与 OpenGL™ 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 文档。
快速设置图块 API
图 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 框架中提供了 ICU4J API 的一个子集,位于 android.icu 包下。迁移很容易,主要只需将命名空间从 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 版本(开发版、测试版或稳定版)或独立的 Webview APK 作为 WebView 实现。
多进程
从 Android 7.0 中的 Chrome 51 开始,当启用开发者选项“多进程 WebView”时,WebView 将在单独的沙盒进程中运行网页内容。
在未来的 Android 版本中启用多进程 WebView 之前,我们正在收集有关 Android N 中的兼容性和运行时性能的反馈。在此版本中,预计启动时间、总内存使用量和软件渲染性能会回退。
如果您在多进程模式下遇到意外问题,我们希望收到您的反馈。请通过 Chromium bug tracker 与 WebView 团队联系。
页面加载前运行的 Javascript
从面向 Android 7.0 的应用开始,加载新页面时将重置 Javascript 上下文。目前,对于新的 WebView 实例中加载的第一个页面,上下文会延续下来。
希望将 Javascript 注入 WebView 的开发者应在页面开始加载后执行脚本。
非安全来源上的地理位置
从面向 Android 7.0 的应用开始,地理位置 API 只允许在安全来源(通过 HTTPS)上使用。此政策旨在在使用不安全连接时保护用户的隐私信息。
使用 WebView Beta 进行测试
WebView 定期更新,因此我们建议您经常使用 WebView 的 beta 通道测试与您的应用的兼容性。要在 Android 7.0 上开始测试 WebView 的预发布版本,请下载并安装 Chrome Dev 或 Chrome Beta,并按照上述说明在开发者选项下将其选为 WebView 实现。请通过 Chromium bug tracker 报告问题,以便我们可以在发布新版本的 WebView 之前修复它们。
OpenGL™ 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 时,请务必在您的清单文件中使用
有关使用 OpenGL ES 的信息,包括如何在运行时检查设备支持的 OpenGL ES 版本,请参阅OpenGL ES API 指南。
Android TV 录制
Android 7.0 添加了通过新的录制 API 录制和回放 Android TV 输入服务中内容的功能。在现有时间偏移 API 的基础上,TV 输入服务可以控制哪些频道数据可以录制、录制会话如何保存以及管理用户与录制内容的交互。
有关更多信息,请参阅Android TV 录制 API。
适用于工作场景的 Android
适用于工作场景的 Android 为运行 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() 方法自定义工作挑战的凭据屏幕。
关闭工作
在具有工作资料的设备上,用户可以切换工作模式。关闭工作模式时,托管用户会临时关闭,这将禁用工作资料应用、后台同步和通知。这包括资料所有者应用。关闭工作模式时,系统会显示一个持久的状态图标,提醒用户无法启动工作应用。启动器指示工作应用和微件不可访问。
始终开启的 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 配置构建文件以签署应用。
作用域目录访问
在 Android 7.0 中,应用可以使用新的 API 请求访问特定的外部存储目录,包括可移动媒体(如 SD 卡)上的目录。新的 API 极大地简化了您的应用程序访问标准外部存储目录(例如 Pictures 目录)的方式。照片应用等应用可以使用这些 API,而不是使用授予访问所有存储目录权限的 READ_EXTERNAL_STORAGE,或者使用需要用户导航到目录的存储访问框架 (Storage Access Framework)。
此外,新的 API 简化了用户授予您的应用外部存储访问权限的步骤。当您使用新的 API 时,系统会使用一个简单的权限 UI,清楚地详细说明应用程序请求访问哪个目录。
有关更多信息,请参阅作用域目录访问开发者文档。
键盘快捷键助手
在 Android 7.0 中,用户可以按下 Meta + / 触发一个“键盘快捷键”屏幕,该屏幕显示系统和焦点应用中可用的所有快捷键。如果快捷键存在,系统会自动从应用的菜单中检索这些快捷键。您还可以为该屏幕提供自己精心调整的快捷键列表。您可以通过重写 onProvideKeyboardShortcuts() 方法来做到这一点。
注意:Meta 键并非存在于所有键盘上:在 Macintosh 键盘上,它是 Command 键;在 Windows 键盘上,它是 Windows 键;在 Pixel C 和 ChromeOS 键盘上,它是 Search 键。
要在您的应用中任何地方触发键盘快捷键助手,请从相关 Activity 中调用 requestShowKeyboardShortcuts()。
自定义指针 API
Android 7.0 引入了自定义指针 API,允许您自定义指针的外观、可见性和行为。当用户使用鼠标或触摸板与 UI 对象交互时,此功能特别有用。默认指针使用标准图标。此 API 还包含高级功能,例如根据特定的鼠标或触摸板移动更改指针图标的外观。
要设置指针图标,请重写 View 类的 onResolvePointerIcon() 方法。此方法使用 PointerIcon 对象绘制与特定运动事件对应的图标。
持续性能 API
对于长时间运行的应用,性能可能会剧烈波动,因为当设备组件达到温度限制时,系统会限制系统芯片引擎。这种波动给创建高性能、长时间运行的应用的开发者带来了移动目标。
为了解决这些限制,Android 7.0 支持持续性能模式,使 OEM 能够为长时间运行的应用提供有关设备性能能力的提示。应用开发者可以使用这些提示来调整应用,以在长时间内实现可预测、一致的设备性能水平。
应用开发者可以在 Android 7.0 上的 Nexus 6P 设备上试用这个新的 API。要使用此功能,请为您想在持续性能模式下运行的窗口设置持续性能窗口标志。使用 Window.setSustainedPerformanceMode() 方法设置此标志。当窗口不再获得焦点时,系统会自动禁用此模式。
VR 支持
Android 7.0 为新的 VR 模式添加了平台支持和优化,让开发者能够为用户构建高质量的移动 VR 体验。有一些性能增强,包括为 VR 应用提供专属 CPU 核心的访问。在您的应用中,您可以利用智能头部跟踪以及适用于 VR 的立体声通知。最重要的是,Android 7.0 提供了非常低的图形延迟。有关构建适用于 Android 7.0 的 VR 应用的完整信息,请参阅Google VR SDK for Android。
打印服务增强
在 Android 7.0 中,打印服务开发者现在可以显示有关单个打印机和打印作业的更多信息。
在列出单个打印机时,打印服务现在可以通过两种方式设置每个打印机的图标
您可以通过调用 setIconResourceId() 从资源 ID 设置图标。
您可以通过调用 setHasCustomPrinterIcon() 来显示网络上的图标,并使用 onRequestCustomPrinterIcon() 设置请求图标时的回调。
此外,您可以通过调用 setInfoIntent() 提供一个每个打印机对应的活动,以显示更多信息。
您可以通过分别调用 setProgress() 和 setStatus(),在打印作业通知中指示打印作业的进度和状态。
帧指标 API
帧指标 API 允许应用监控其 UI 渲染性能。该 API 通过公开流式 Pub/Sub API 来传输应用当前窗口的帧计时信息,从而提供此功能。返回的数据与 adb shell dumpsys gfxinfo framestats 显示的数据等效,但不受限于过去 120 帧。
您可以使用帧指标 API 在生产环境中测量交互级别的 UI 性能,无需 USB 连接。此 API 允许以比 adb shell dumpsys gfxinfo 更高的粒度收集数据。之所以可以实现更高的粒度,是因为系统可以收集应用中特定交互的数据;系统无需捕获整个应用性能的全局摘要,也无需清除任何全局状态。您可以使用此功能收集性能数据并捕获应用内实际用例中 UI 性能的退步。
要监控窗口,请实现 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 中,您的应用可以使用存储访问框架 (Storage Access Framework) 让用户从其云存储帐户(例如 Google 云端硬盘)中选择文件。但是,无法表示没有直接字节码表示形式的文件;每个文件都必须提供输入流。
Android 7.0 在存储访问框架中添加了虚拟文件的概念。虚拟文件功能允许您的 DocumentsProvider 返回文档 URI,即使它们没有直接的字节码表示形式,也可以与 ACTION_VIEW Intent 一起使用。Android 7.0 还允许您为用户文件(无论是虚拟文件还是其他文件)提供替代格式。
有关打开虚拟文件的更多信息,请参阅存储访问框架指南中的打开虚拟文件。