Android N 仍处于活跃的开发状态,但现在您可以将其作为 N Developer Preview 的一部分进行试用。 以下部分重点介绍面向开发者的一些新功能。
多窗口支持 在Android N中,我们 为该平台引入了一个新的而且非常需要的多任务处理功能 — 多窗口支持。 现在,用户可以一次在屏幕上打开两个应用。
- 在运行 Android N 的手机和平板电脑上,用户可以并排运行两个应用,或者处于分屏模式时一个应用位于另一个应用之上。 用户可以通过拖动两个应用之间的分隔线来调整应用。
- 在 Android TV 设备上,应用可以将自身置于画中画模式,从而让它们可以在用户浏览或与其他应用交互时继续显示内容。
文章图片
多窗口支持为您提供新的吸引用户方式,特别是在平板电脑和其他更大屏幕的设备上。 您甚至可以在您的应用中启用拖放,从而使用户可以方便地将内容拖放到您的应用或从其中拖出内容—这是一个非常好的增强用户体验的方式。
向您的应用添加多窗口支持并配置多窗口显示的处理方式非常简单。 例如,您可以指定您的 Activity 允许的最小尺寸,从而防止用户将 Activity 调整到该尺寸以下。 您还可以为应用禁用多窗口显示,这可确保系统将仅以全屏模式显示应用。
通知增强功能 在 Android N 中,我们重新设计了通知,使其更易于使用并且速度更快。 部分变更包括:
- 模板更新:我们正在更新通知模板,新强调了英雄形象和化身。 开发者将能够充分利用新模板,只需进行少量的代码调整。
- 消息样式自定义:您可以自定义更多与您的使用
MessageStyle
类的通知相关的用户界面标签。 您可以配置消息、会话标题和内容视图。 - 捆绑通知:系统可以将消息组合在一起(例如,按消息主题)并显示组。 用户可以适当地进行 Dismiss 或 Archive 等操作。 如果您已实现 Android Wear 的通知,那么您已经很熟悉此模型。
- 直接回复:对于实时通信应用,Android 系统支持内联回复,以便用户可以直接在通知界面中快速回复短信。
- 自定义视图:两个新的 API 让您在通知中使用自定义视图时可以充分利用系统装饰元素,如通知标题和操作。
文章图片
JIT/AOT 编译
在 Android N 中,我们添加了 Just in Time (JIT) 编译器,对 ART 进行代码分析,让它可以在应用运行时持续提升 Android 应用的性能。 JIT 编译器对 Android 运行组件当前的 Ahead of Time (AOT) 编译器进行了补充,有助于提升运行时性能,节省存储空间,加快应用更新和系统更新速度。
个人资料指导的编译让 Android 运行组件能够根据应用的实际使用以及设备上的情况管理每个应用的 AOT/JIT 编译。 例如,Android 运行组件维护每个应用的热方法的个人资料,并且可以预编译和缓存这些方法以实现最佳性能。 对于应用的其他部分,在实际使用之前不会进行编译。
除提升应用的关键部分的性能外,个人资料指导的编译还有助于减少整个 RAM 占用,包括关联的二进制文件。 此功能对于低内存设备非常尤其重要。
Android 运行组件在管理个人资料指导的编译时,可最大程度降低对设备电池的影响。 仅当设备处于空闲状态和充电时才进行编译,从而可以通过提前执行该工作节约时间和省电。
快速的应用安装路径 Android 运行组件的 JIT 编译器最实际的好处之一是应用安装和系统更新的速度。 即使在 Android 6.0 中需要几分钟进行优化和安装的大型应用,现在只需几秒钟就可以完成安装。 系统更新也变得更快,因为省去了优化步骤。
随时随地低电耗模式... Android 6.0 推出了低电耗模式,即设备处于空闲状态时,通过推迟应用的 CPU 和网络活动以实现省电目的的系统模式,例如,设备放在桌上或抽屉里时。
现在,在 Android N 中,低电耗模式又前进了一步,随时随地可以省电。只要屏幕关闭了一段时间,且设备未插入电源,低电耗模式就会对应用使用熟悉的 CPU 和网络限制。这意味着用户即使将设备放入口袋里也可以省电。
图 3. 低电耗模式现在应用限制以延长电池寿命,即使设备未处于静止状态。
屏幕关闭片刻后,设备在使用电池时,低电耗模式将限制网络访问,同时延迟作业和同步。 在短暂的维护时间范围后,其允许应用访问网络,并执行延迟的作业/同步。 打开屏幕或将设备插入电源会使设备退出低电耗模式。
当设备再次处于静止状态时,屏幕关闭且使用电池一段时间,低电耗模式针对
PowerManager.WakeLock
、AlarmManager
警报和 GPS/Wi-Fi 扫描应用完整 CPU 和网络限制。无论设备是否处于运动状态,将应用调整到低电耗模式的最佳做法均相同,因此,如果您已更新应用以妥善处理低电耗模式,则一切就绪。 如果不是,请立即开始将应用调整到低电耗模式。
Project Svelte:后台优化 Project Svelte 在持续改善,以最大程度减少生态系统中一系列 Android 设备中系统和应用使用的 RAM。 在 Android N 中,Project Svelte 注重优化在后台中运行应用的方式。
后台处理是大多数应用的一个重要部分。处理得当,可让您实现非常棒的用户体验 — 即时、快速和情境感知。如果处理不得当,后台处理会毫无必要地消耗 RAM(和电池),同时影响其他应用的系统性能。
自 Android 5.0 发布以来,
JobScheduler
已成为执行后台工作的首选方式,其工作方式有利于用户。 应用可以在安排作业的同时允许系统基于内存、电源和连接情况进行优化。 JobScheduler 可实现控制和简洁性,我们想要所有应用都使用它。另一个非常好的选择是
GCMNetworkManager
(Google Play 服务的一部分),其在旧版 Android 中提供类似的作业安排和兼容性。我们在继续扩展
JobScheduler
和 GCMNetworkManager
,以符合多个用例 — 例如,在 Android N 中,现在,您可以基于内容提供程序中的更改安排后台工作。 同时,我们开始弃用一些较旧的模式,这些模式会降低系统性能,特别是低内存设备的系统性能。在 Android N 中,我们删除了三个常用隐式广播 —
CONNECTIVITY_ACTION
、ACTION_NEW_PICTURE
和 ACTION_NEW_VIDEO
— 因为这些广播可能会一次唤醒多个应用的后台进程,同时会耗尽内存和电池。 如果您的应用收到这些广播,请充分利用 N Developer Preview 以迁移到 JobScheduler
和相关的 API。Data Saver 在移动设备的整个生命周期,蜂窝数据计划的成本通常会超出设备本身的成本。 对于许多用户而言,蜂窝数据是他们想要节省的昂贵资源。
Android N 推出了 Data Saver 模式,这是一项新的系统服务,有助于减少应用使用的蜂窝数据,无论是在漫游,账单周期即将结束,还是使用少量的预付费数据包。 Data Saver 让用户可以控制应用使用蜂窝数据的方式,同时让开发者打开 Data Saver 时可以提供更多有效的服务。
用户在 Settings 中启用 Data Saver 且设备位于按流量计费的网络上时,系统屏蔽后台流量消耗,同时指示应用在前台尽可能使用较少的流量 — 例如,通过限制用于流媒体服务的比特率、降低图片质量、延迟最佳的预缓冲等方法来实现。 用户可以将特定应用加入白名单以允许后台按流量的流量消耗,即使在打开 Data Saver 时也是如此。
Android N 扩展了
ConnectivityManager
,以便为应用检索用户的 Data Saver 首选项并监控首选项变更提供一种方式。 所有应用均应检查用户是否已启用 Data Saver 并努力限制前台和后台流量消耗。Vulkan API Android N 将一项新的 3D 渲染 API Vulkan? 集成到平台中。就像 OpenGL? ES 一样,Vulkan 是 3D 图形和渲染的一项开放标准,由 Khronos Group 维护。
Vulkan 是完全从零开始设计,以最小化驱动器中的 CPU 开销,并能让您的应用更直接地控制 GPU 操作。 Vulkan 还允许多个线程同时执行工作,如命令缓冲区构建,以获得更好的并行化。
Vulkan 开发工具和库都已卷入 Android NDK。它们包括:
- 头
- 验证层(调试库)
- SPIR-V 着色程序编译器
- SPIR-V 运行时着色器编译库
Quick Settings Tile API “快速设置”通常用于直接从通知栏显示关键设置和操作,非常简单。 在 Android N 中,我们已扩展“快速设置”的范围,使其更加有用更方便。
我们为额外的“快速设置”图块添加了更多空间,用户可以通过向左或向右滑动跨分页的显示区域访问它们。 我们还让用户可以控制显示哪些“快速设置”图块以及显示的位置 — 用户可以通过拖放图块来添加或移动图块。
对于开发者,Android N 还添加了一个新的 API,从而让您可以定义自己的“快速设置”图块,使用户可以轻松访问您应用中的关键控件和操作。
对于急需或频繁使用的控件和操作,保留“快速设置”图块,且不应将其用作启动应用的快捷方式。
定义图块后,您可以将它们显示给用户,用户可通过拖放将图块添加到“快速设置”。
号码屏蔽 Android N 现在支持在平台中进行号码屏蔽,提供框架 API,让服务提供商可以维护屏蔽的号码列表。 默认短信应用、默认手机应用和提供商应用可以对屏蔽的号码列表进行读取和写入操作。 其他应用则无法访问此列表。
通过使号码屏蔽成为平台的标准功能,Android 为应用提供一致的方式来支持广泛的设备上的号码屏蔽。 应用可以利用的其他优势包括:
- 还会屏蔽已屏蔽的来电号码发出的短信
- 通过 Backup & Restore(备份和还原)功能可以跨重置和设备保留屏蔽的号码
- 多个应用可以使用相同的屏蔽号码列表
来电过滤 Android N 允许默认的手机应用过滤来电。手机应用执行此操作的方式是实现新的
CallScreeningService
,该方法允许手机应用基于来电的Call.Details
执行大量操作,例如:- 拒绝来电
- 不允许来电到达通话记录
- 不向用户显示来电通知
android.telecom.CallScreeningService
。多区域设置支持、多语言 Android N 现在允许用户在设置中选择多个区域设置,以更好地支持双语用例。 应用可以使用新的 API 获取用户选择的区域设置,然后为多区域设置用户提供更成熟的用户体验 — 如以多个语言显示搜索结果,并且不会以用户了解的语言翻译网页。
除多区域设置支持外,Android N 还扩展了用户可用的语言范围。 它针对常用语言提供超过 25 种的变体,如英语、西班牙语、法语和阿拉伯语。 它还针对 100 多种新语言添加了部分支持。
应用可以通过调用
LocaleList.GetDefault()
获取用户设置的区域设置列表。 为支持扩展的区域设置数量,Android N 正在改变其解析资源的方式。 请务必使用新的资源解析逻辑测试和验证您的应用是否能如期运行。如需有关新资源解析行为和应遵循的最佳做法的更多信息,请参阅多语言支持。
新增的表情符号 Android N 引入更多表情符号和表情符号相关功能,包括肤色表情符号和支持变量选择符。 如果您的应用支持表情符号,请遵循以下准则,以便能充分利用这些表情符号相关功能优势。
- 在插入之前,检查设备是否包含表情符号。 若要检查系统字体中有哪些表情符号,使用
hasGlyph(String)
方法。 - 检查表情符号是否支持变量选择符。 变量选择符使您能够呈现一些彩色或黑白的表情符号。 在移动设备上,应用应呈现彩色的表情符号,而不是黑白的。但是,如果您的应用显示嵌入在文本中的表情符号,那应使用黑白变量。 若要确定表情符号是否有变量,使用变量选择符。
- 如需有关支持变量的字符的完整清单,请参阅变量的 Unicode 文档中的 表情符号变量序列部分。
- 检查表情符号是否支持肤色。Android N 允许用户按照他们的喜好修改表情符号呈现的肤色。 键盘应用应为有多个肤色的表情符号提供可视化的指示,并应允许用户选择他们喜欢的肤色。 若要确定哪些系统表情符号有肤色修改器,使用
hasGlyph(String)
方法。 您可以通过读取 Unicode 文档来确定哪些表情符号使用肤色。
android.icu
软件包下)中提供 ICU4J API 的子集。 迁移很简单,主要是需要从 com.java.icu
命名空间更改为android.icu
。 如果您已在您的应用中使用 ICU4J 捆绑包,切换到 Android 框架中提供的 android.icu
API 可以大量节省 APK 大小。如果要了解有关 Android ICU4J API 的更多信息,请参阅 ICU4J 支持。
OpenGL? ES 3.2 API Android N 添加了框架接口和对 OpenGL ES 3.2 的平台支持,包括:
- 来自 Android 扩展包 (AEP) 的所有扩展(
EXT_texture_sRGB_decode
除外)。 - 针对 HDR 的浮点帧缓冲和延迟着色。
- BaseVertex 绘图调用可实现更好的批处理和流媒体服务。
- 强大的缓冲区访问控制可减少 WebGL 开销。
GLES32
类一起提供。 使用 OpenGL ES 3.2 时,请务必通过
标记和android:glEsVersion
属性在您的清单中声明要求。如需了解有关使用 OpenGL ES 的信息,包括如何在运行时检查设备支持的 OpenGL ES 版本,请参阅 OpenGL ES API 指南。
Android TV 录制 Android N 通过新的录制 API 添加了从 Android TV 输入服务录制和播放内容的功能。 构建在现有时移 API 之上,TV 输入服务可以控制能够录制的渠道数据、保存录制的会话的方式,同时可通过录制的内容管理用户交互。
如需了解详细信息,请参阅 Android TV 录制 API。
Android for Work Android for Work 针对运行 Android N 的设备添加了许多新功能和 API。部分重要内容如下— 有关变更的完整列表,请参阅 Android for Work 更新。
工作资料安全性挑战
面向 N SDK 的个人资料所有者可以为在工作资料中运行的应用指定单独的安全性挑战。 当用户尝试打开任何工作应用时将显示工作挑战。 成功完成安全性挑战可解锁工作资料并将其解密(如果需要)。 对于个人资料所有者,
ACTION_SET_NEW_PASSWORD
提示用户设置工作挑战,ACTION_SET_NEW_PARENT_PROFILE_PASSWORD
提示用户设置设备锁。个人资料所有者可以使用
setPasswordQuality()
、setPasswordMinimumLength()
和相关方法针对工作挑战设置不同的密码策略(例如,PIN 必须多长,或是否可以使用指纹解锁个人资料)。 个人资料所有者还可以使用新的 getParentProfileInstance()
方法返回的 DevicePolicyManager
实例设置设备锁定。此外,个人资料所有者可以使用新的
setOrganizationColor()
和 setOrganizationName()
方法针对工作挑战自定义凭据屏幕。关闭工作
在有工作资料的设备上,用户可以切换工作模式。工作模式关闭时,管理的用户临时关闭,其禁用托管工作资料应用、后台同步和通知。 这包括个人资料所有者应用。 关闭工作模式时,系统显示永久状态图标,以提醒用户他们无法启动工作应用。 启动器指示该工作应用和小组件无法访问。
Always on VPN
设备所有者和个人资料所有者可以确保工作应用始终通过指定的 VPN 连接。 系统在设备启动后自动启动该 VPN。
新的
DevicePolicyManager
方法为 setAlwaysOnVpnPackage()
和 getAlwaysOnVpnPackage()
。由于 VPN 服务无需应用交互即可由系统直接绑定,因此,VPN 客户端必须针对 Always on VPN 处理新的入口点。 和以前一样,由与操作匹配的 Intent 过滤器将服务指示给系统。
android.net.VpnService
。用户还可以使用 Settings>More>Vpn 在主要用户中手动设置实现
VPNService
方法的 Always on VPN 客户端。自定义配置
应用可以用企业颜色和徽标来自定义个人资料所有者和设备所有者配置流程。
DevicePolicyManager.EXTRA_PROVISIONING_MAIN_COLOR
自定义流程颜色。DevicePolicyManager.EXTRA_PROVISIONING_LOGO_URI
用企业徽标自定义流程。无障碍增强功能 Android N 现在针对新的设备设置直接在欢迎屏幕上提供“Vision Settings”。 这使用户可以更容易发现和配置他们设备上的无障碍功能,包括放大手势、字体大小、显示屏尺寸和 TalkBack。
随着这些无障碍功能更为突出,在启用这些功能后,您的用户更可能试用您的应用。 请务必提前启用这些设置测试您的应用。 您可以通过 Settings > Accessibility 启用它们。
还是在 Android N 中,无障碍服务现在可以帮助具有动作障碍的用户触摸屏幕。 全新的 API 允许使用人脸追踪、眼球追踪、点扫描等功能构建服务,以满足这些用户的需求。
如需了解详细信息,请参阅可下载的 API 参考 中的
android.accessibilityservice.GestureDescription
。直接启动 直接启动可以缩短设备启动时间,让注册的应用具有有限的功能,即使在意外重启后。例如,如果当用户睡觉时加密的设备重启,那么注册的警报、消息和来电现在可以和往常一样继续通知用户。 这也意味着重启后无障碍服务会立即可用。
在 Android N 中,直接启动充分利用基于文件的加密,以针对系统和应用数据启用细化的加密策略。为系统和应用数据。系统针对选定的系统数据和显式注册的应用数据使用设备加密的存储。 默认情况下,凭据加密的存储可用于所有其他系统数据、用户数据、应用及应用数据。
启动时,系统在受限的模式中启动,仅访问设备加密的数据,不会对应用或数据进行常规访问。如果您有想要在此模式下运行的组件,您可以通过在清单文件中设置标记注册它们。 重启后,系统通过广播
LOCKED_BOOT_COMPLETED
Intent激活注册的组件。 系统确保注册的设备加密的应用数据在解锁前可用。 所有其他数据在用户确认锁定屏幕凭据进行解密前均不可用。
如需了解详细信息,请参阅 直接启动 。
密钥认证 使用硬件支持的密钥库,可更安全地在 Android 设备上创建、存储和使用加密密钥。 它们可保护密钥免受 Linux 内核、潜在的 Android 漏洞的攻击,也可防止从已取得根权限的设备提取密钥。
为了让硬件支持的密钥库使用起来更简单和更安全,Android N 引入了密钥认证。 应用和关闭的设备可使用密钥认证以坚决地确定 RSA 或 EC 密钥对是否受硬件支持、密钥对的属性如何,以及其使用和有效性有何限制。
应用和关闭的设备服务可以通过 X.509 认证证书(必须由有效的认证密钥签署)请求有关密钥对的信息。 认证密钥是一个 ECDSA 签署密钥,其在出厂时被注入设备的硬件支持的密钥库。因此,有效的认证密钥签署的认证证书可确认硬件支持的密钥库是否存在,以及该密钥库中密钥对的详细信息。
为确保设备使用安全的官方 Android 出厂映像,密钥认证要求设备 bootloader 向可信执行环境 (TEE) 提供以下信息:
- 设备上安装的操作系统版本和补丁级别
- 验证的启动公钥和锁定状态。
除密钥认证外,Android N 还推出了指纹绑定密钥,在指纹注册时不会撤销。
网络安全性配置 在 Android N 中,通过使用说明性“网络安全性配置”(而不是使用传统的易出错的编程 API(例如,X509TrustManager)),应用可以安全地自定义其安全(HTTPS、TLS)连接的行为,无需任何代码修改。
支持的功能:
- 自定义信任锚。让应用可以针对安全连接自定义哪些证书颁发机构 (CA) 值得信赖。 例如,信任特定的自签署证书或限制应用信任的公共 CA 集。
- 仅调试重写。让应用开发者可以安全调试其应用的安全连接,而不会增加安装基础的风险。
- 明文流量选择退出。让应用可以防止自身意外使用明文流量。
- 证书固定。这是一项高级功能,让应用可以针对安全连接限制哪些服务器密钥受信任。
默认受信任的证书颁发机构 默认情况下,面向 Android N 的应用仅信任系统提供的证书,且不再信任用户添加的证书颁发机构 (CA)。 如果面向 Android N 的应用希望信任用户添加的 CA,则应使用网络安全性配置以指定信任用户 CA 的方式。
APK signature scheme v2 Android N 引入一项新的应用签名方案 APK Signature Scheme v2,它能提供更快的应用安装时间和更多针对未授权 APK 文件更改的保护。 在默认情况下,Android Studio 2.2 和 Android Gradle 2.2 插件会使用 APK Signature Scheme v2 和传统签名方案来签署您的应用。
虽然我们建议您对您的应用采用 APK Signature Scheme v2,但这项新方案并非强制性的。 如果您的应用在使用 APK Signature Scheme v2 时不能正确构建,您可以停用这项新方案。 禁用过程会导致 Android Studio 2.2 和 Android Gradle 2.2 插件仅使用传统签名方案来签署您的应用。
若要仅用传统方案签署,打开多层
build.gradle
文件,然后将行 v2SigningEnabled false
添加到您的版本签名配置中:android { ... defaultConfig { ... } signingConfigs { release { storeFile file("myreleasekey.keystore") storePassword "password" keyAlias "MyReleaseKey" keyPassword "password" v2SigningEnabled false } } }
注意:如果您使用 APK Signature Scheme v2 签署您的应用,并对应用进行了进一步更改,则应用的签名将无效。 出于这个原因,请在使用 APK Signature Scheme v2 之前、而非之后使用
zipalign
等工具。如需更多信息,请阅读介绍如何在 Android Studio 中签署一项应用以及如何使用 Android Gradle 插件来为签署应用配置构建文件。
作用域目录访问 在 Android N 中,应用可以使用新的 API 请求访问特定的外部存储目录,包括可移动媒体上的目录,如 SD 卡。 新 API 大大简化了应用访问标准外部存储目录的方式,如
Pictures
目录。 应用(如照片应用)可以使用这些 API(而不是使用 READ_EXTERNAL_STORAGE
),其授予所有存储目录的访问权限或存储访问框架,从而让用户可以导航到目录。此外,新的 API 简化了用户向应用授予外部存储访问权限的步骤。 当您使用新的 API 时,系统使用一个简单的权限 UI,其清楚地详细介绍应用正在请求访问的目录。
如需了解详细信息,请参阅作用域目录访问开发者文档。
键盘快捷键辅助工具 在 Android N 中,用户可以按“Alt + /”触发“键盘快捷键”屏幕,它会显示的系统和对焦的应用中可用的所有快捷键。 这些是从应用菜单(如可用)中自动检索到的,但开发者可以提供自己的屏幕微调快捷键。 您可以通过重写新
Activity.onProvideKeyboardShortcuts()
的方法来进行这项操作,如可下载的 API 参考 中所述。若要在您的应用程序的任何地方触发键盘快捷键辅助工具,为相关活动调用
Activity.requestKeyboardShortcutsHelper()
。持续性能 API 长期运行的应用的性能可能会显著波动,因为系统会阻止系统芯片在设备组件达到温度限制时启动。 这种波动是建立高性能长期运行应用的应用开发者的移动目标。
为解决这些限制,Android N 包括了“持续性能模式”支持,帮助原始设备制造商 (OEM) 提供关于长期运行应用的设备性能能力的提示。 应用开发者可以使用这些提示来根据可预测的一致设备性能水平调整长期应用。
应用开发者只能在 Nexus 6P 设备的 N Developer Preview 上尝试这项新的 API。 若要使用此功能,为您希望以持续性能模式运行的窗口设置持续性能窗口标记。 使用
Window.setSustainedPerformanceMode()
方法设置此举报。 当窗口不再对焦时,系统会自动停用此模式。VR 支持 Android N 添加了新的 VR 模式的平台支持和优化,以使开发者能为用户打造高质量移动 VR 体验。 新版针对开发者提供了大量性能增强特性,包括单一缓冲区渲染以及允许 VR 应用访问某个专属的 CPU 核心。在您的应用中,您可以享受到专为 VR 设计的平滑头部跟踪和立体声通知功能。 最重要的是,
Android N 的图形延时非常低。 如需有关构建面向的 Android N 的 VR 应用的完整信息,请参阅 面向 Android 的 Google VR SDK。
打印服务增强 在 Android N 中,打印服务开发者现在可以公开关于个别打印机和打印作业的其他信息。
在列出各打印机时,打印服务现在可以通过两种方式来设置按打印机的图标:
- 您可以通过调用
PrinterInfo.Builder.setResourceIconId()
设置源于资源 ID 的图标 - 您可以通过调用
PrinterInfo.Builder.setHasCustomPrinterIcon()
,并针对使用android.printservice.PrinterDiscoverySession.onRequestCustomPrinterIcon()
请求图标的情况设置回调来显示源自网络的图标
PrinterInfo.Builder.setInfoIntent()
提供按打印机活动,以显示其他信息。您可以通过分别调用
android.printservice.PrintJob.setProgress()
和 android.printservice.PrintJob.setStatus()
在打印任务通知中指示打印任务的进度和状态。如需有关这些方法的详细信息,请参阅可下载的 API 参考。
FrameMetricsListener API FrameMetricsListener API 允许应用监测它的 UI 渲染性能。 API 通过公开流式传输 Pub/Sub API 来提供此能力,以传递应用当前窗口的帧计时信息。 返回的数据相当于
adb shell dumpsys gfxinfo framestats
显示的数据,但不限定于在过去的 120 帧内。您可以使用 FrameMetricsListener 来衡量生产中的交互级 UI 性能,无需 USB 连接。 API 允许在比
adb shell dumpsys gfxinfo
更高的粒度上收集数据。 因为系统可以从应用中的特定交互中收集数据,因此更高的粒度变得可行;系统不需要采集关于完整应用性能的全局概要或清除任何全局状态。 您可以使用这种能力来针对应用的真实使用案例收集性能数据和捕捉 UI 性能回归。
若要监测一个窗口,实现
FrameMetricsListener.onMetricsAvailable()
回叫方法,并在窗口上注册。 如需了解详细信息,请参阅可下载的 API 参考 中的 FrameMetricsListener
类文档。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 N 在存储访问框架中增加了“虚拟文件”的概念。 虚拟文件功能可以让您的
DocumentsProvider
返回可与 ACTION_VIEW
Intent 使用的文件 URI,即使它们没有直接字节码表示。 Android N 还允许您为用户文件(虚拟或其他类)提供备用格式。为获得您的应用中的虚拟文件的 URI,首先您应创建一个
Intent
以打开文件选择器 UI。 由于应用不能使用 openInputStream()
方法来直接打开一个虚拟文件,因此如果您包括了 CATEGORY_OPENABLE
类别,您的应用不会收到任何虚拟文件。在用户选择之后,系统调用
onActivityResult()
方法。 您的应用可以检索虚拟文件的URI,并得到一个输入流,这表现在以下片段中的代码。// Other Activity code ...final static private int REQUEST_CODE = 64; // We listen to the OnActivityResult event to respond to the user's selection. @Override public void onActivityResult(int requestCode, int resultCode, Intent resultData) { try { if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {Uri uri = null; if (resultData != null) { uri = resultData.getData(); ContentResolver resolver = getContentResolver(); // Before attempting to coerce a file into a MIME type, // check to see what alternative MIME types are available to // coerce this file into. String[] streamTypes = resolver.getStreamTypes(uri, "*/*"); AssetFileDescriptor descriptor = resolver.openTypedAssetFileDescriptor( uri, streamTypes[0], null); // Retrieve a stream to the virtual file. InputStream inputStream = descriptor.createInputStream(); } } } catch (Exception ex) { Log.e("EXCEPTION", "ERROR: ", ex); } }
行为变更 本文内容
- 性能提升
- 低电耗模式
- 后台优化
- 权限更改
- 应用间共享文件
- 无障碍改进
- 屏幕缩放
- 设置向导中的视觉设置
- NDK 应用链接至平台库
- Android for Work
- 注解保留
- 其他重要说明
- Android N API 概览
如果您之前发布过 Android 应用,请注意您的应用可能受到这些平台变更的影响。
电池和内存 Android N 包括旨在延长设备电池寿命和减少 RAM 使用的系统行为变更。 这些变更可能会影响您的应
用访问系统资源,以及您的系统通过特定隐式 Intent 与其他应用互动的方式。
低电耗模式
Android 6.0(API 级别 23)引入了低电耗模式,当用户设备未插接电源、处于静止状态且屏幕关闭时,
该模式会推迟 CPU 和网络活动,从而延长电池寿命。而 Android N 则通过在设备未插接电源且屏幕关闭
【Android7.0更新一览,快来吃Nougat】状态下、但不一定要处于静止状态(例如用户外出时把手持式设备装在口袋里)时应用部分 CPU 和网络
限制,进一步增强了低电耗模式。
图 1. 低电耗模式如何应用第一级系统活动限制以延长电池寿命的图示。
当设备处于充电状态且屏幕已关闭一定时间后,设备会进入低电耗模式并应用第一部分限制: 关闭应用网络访问、推迟作业和同步。
如果进入低电耗模式后设备处于静止状态达到一定时间,系统则会对
PowerManager.WakeLock
、AlarmManager
闹铃、GPS 和 Wi-Fi扫描应用余下的低电耗模式限制。 无论是应用部分还是全部低电耗模式限制,系统都会唤醒设备以提供简短的维护时间窗口,在此窗
口期间,应用程序可以访问网络并执行任何被推迟的作业/同步。
图 2. 低电耗模式如何在设备处于静止状态达到一定时间后应用第二级系统活动限制的图示。
请注意,激活屏幕或插接设备电源时,系统将退出低电耗模式并取消这些处理限制。 此项新增的行为不会影响有关使您的应用适应
Android 6.0(API 级别 23)中所推出的旧版本低电耗模式的建议和最佳实践,如低电耗模式和应用待机模式优化中所讨论。 您仍应遵
循这些建议(例如使用 Google Cloud Messaging (GCM) 发送和接收消息)并开始安排更新计划以适应新增的低电耗模式行为。
Project Svelte:后台优化
Android N 删除了三项隐式广播,以帮助优化内存使用和电量消耗。 此项变更很有必要,因为隐式广播会在后台频繁启动已注册侦听这些广
播的应用。 删除这些广播可以显著提升设备性能和用户体验。
移动设备会经历频繁的连接变更,例如在 Wi-Fi 和移动数据之间切换时。 目前,可以通过在应用清单中注册一个接收器来侦听隐式
CONNECTIVITY_ACTION
广播,让应用能够监控这些变更。 由于很多应用会注册接收此广播,因此单次网络切换即会导致所有应用被唤醒并同时处理此广播。
同理,应用可以注册接收来自其他应用(例如相机)的隐式
ACTION_NEW_PICTURE
和 ACTION_NEW_VIDEO
广播。 当用户使用相机应用拍摄照片时,这些应用即会被唤醒以处理广播。
为缓解这些问题,Android N 应用了以下优化措施:
- 面向 Android N 开发的应用不会收到
CONNECTIVITY_ACTION
广播,即使它们已有清单条目来请求接受这些事件的通知。 在前台运行的 - 应用如果使用
BroadcastReceiver
请求接收通知,则仍可以在主线程中侦听CONNECTIVITY_CHANGE
。 - 应用无法发送或接收
ACTION_NEW_PICTURE
或ACTION_NEW_VIDEO
广播。此项优化会影响所有应用,而不仅仅是面向 Android N 的应用。
这些隐式广播的需求。 例如,
JobScheduler
API 提供了一个稳健可靠的机制来安排满足指定条件(例如连入无限流量网络)时所执行的网络操作。 您甚至可以使用JobScheduler
来适应内容提供程序变化。如需了解有关 Android N 中后台优化以及如何改写应用的详细信息,请参阅后台优化。
权限更改 Android N 做了一些权限更改,这些更改可能会影响您的应用。
系统权限更改
为了提高私有文件的安全性,面向 Android N 或更高版本的应用私有目录被限制访问 (
0700
)。 此设置可防止私有文件的元数据泄漏,如它们的大小或存在。 此权限更改有多重副作用:
- 私有文件的文件权限不应再由所有者放宽,为使用
MODE_WORLD_READABLE
和/或MODE_WORLD_WRITEABLE
而进行的此类尝试将触SecurityException
。 - 注:迄今为止,这种限制尚不能完全执行。 应用仍可能使用原生 API 或
File
API 来修改它们的私有目录权限。 但是,我们强烈反对放宽私有目录的权限。
- 传递软件包网域外的
file://
URI 可能给接收器留下无法访问的路径。 因此,尝试传递file://
URI 会触发FileUriExposedException
。 分享私有文件内容的推荐方法是使用FileProvider
。 DownloadManager
不再按文件名分享私人存储的文件。 旧版应用在访问COLUMN_LOCAL_FILENAME
时可能出现无法访问的路径。 面向 Android N 或更高版本的应用在尝试访问COLUMN_LOCAL_FILENAME
时- 会触发
SecurityException
。 通过使用DownloadManager.Request.setDestinationInExternalFilesDir()
或DownloadManager.Request.setDestinationInExternalPublicDir()
将下载位置设置为 - 公共位置的旧版应用仍可以访问
COLUMN_LOCAL_FILENAME
中的路径,但是我们强烈反对使用这种方法。 访问由DownloadManager
公开的文件的首选方式是使用ContentResolver.openFileDescriptor()
。
StrictMode
API 政策禁止向您的应用外公开 file://
URI。 如果一项包含文件 URI 的 Intent 离开您的应用,应用失败,并出现 FileUriExposedException
异常。若要在应用间共享文件,您应发送一项
content://
URI,并授予 URI 临时访问权限。 进行此授权的最简单方式是使用 FileProvider
类。 如需有关权限和共享文件的更多信息,请参阅共享文件。无障碍改进 为提高平台对于视力不佳或视力受损用户的可用性,Android N 做出了一些更改。这些更改一般并不要求更改您的应用代码,不过您应仔细检查并使用您的应用测试这些功能,以评估它们对用户体验的潜在影响。
屏幕缩放
Android N 支持用户设置显示尺寸,以放大或缩小屏幕上的所有元素,从而提升设备对视力不佳用户的可访问性。用户无法将屏幕缩放至低于最小屏幕宽度 sw320dp,该宽度是 Nexus 4 的宽度,也是常规中等大小手机的宽度。
图 3. 右侧屏幕显示的是一台运行 Android N 系统映像的设备增大显示尺寸后的效果。
当设备密度发生更改时,系统会以如下方式通知正在运行的应用:
- 如果是面向 API 级别 23 或更低版本系统的应用,系统会自动终止其所有后台进程。 这意味着如果用户切换离开此类应用,转而打开“Settings”屏幕并更改 Display size 设置,
- 则系统会像处理内存不足的情况一样终止该应用。 如果应用具有任何前台进程,则系统会如处理运行时变更中所述将配置变更通知给这些进程,就像对待设备屏幕方向变更一样。
- 如果是面向 Android N 的应用,则其所有进程(前台和后台)都会收到有关配置变更的通知,如处理运行时变更中所述。
- 在屏幕宽度为
sw320dp
的设备上测试您的应用,并确保其充分运行。 - 当设备配置发生变更时,更新任何与密度相关的缓存信息,例如缓存位图或从网络加载的资源。当应用从暂停状态恢复运行时,检查配置变更。 注:如果您要缓存与配置相关的数据,则最好也包括相关元数据,例如该数据对应的屏幕尺寸或像素密度。 保存这些元数据便于您在配置变更后决定是否需要刷新缓存数据。
- 避免用像素单位指定尺寸,因为像素不会随屏幕密度缩放。应改为使用与密度无关像素 (
dp
) 单位指定尺寸。
Android N 在“Welcome”屏幕中加入了“Vision Settings”,用户可以在新设备上设置以下无障碍功能设置: Magnification gesture、Font size、Display size 和 TalkBack。 此项变更增强了与
不同屏幕设置相关的错误的可见性。 要评估此功能的影响,您应在启用这些设置的状态下测试应用。 您可以在Settings > Accessibility 中找到这些设置。
NDK 应用链接至平台库 Android N 做了一些命名空间更改,以阻止加载非公开 API。 如果您使用 NDK,则只能使用 Android 平台提供的公开 API。 在下一个官方发布的 Android 版本上使用非公开 API 会导致应用崩溃。
为提醒您使用了非公开 API,在 Android N 设备上运行的应用会在有应用调用非公开 API 时在日志消息输出中生成一个错误。 此错误还会作为消息显示在设备屏幕上,以帮助增强您对此情况的认识。
您应检查应用代码以删除使用非公开平台 API,并使用预览版设备或模拟器全面测试应用。
如果您的应用依赖平台库,则请参见 NDK 文档,了解使用公开 API 等效项替换普通私有 API 的典型修复。 您还可以链接至平台库,而无需实现此应用,如果应用使用的库是平台的一部分(例如
libpng
),但不属于 NDK,则更可如此。 此情况下,请确保您的 APK 包含您打算链接到的所有 .so 文件。
注意:有些第三方库可能会链接至非公开 API。 如果您的应用使用这些库,那么当您的应用在下一个官方发布的 Android 版本上运行时可能会出现崩溃现象。
应用不应依赖或使用不属于 NDK 的原生库,因为这些库可能会发生更改或从一个 Android 版本迁移至另一版本。 例如,从 OpenSSL 切换至 BoringSSL 即属于此类更改。 此外,
不同的设备可能提供不同级别的兼容性,因为不属于 NDK 中的平台库没有兼容性要求。 如果您必须在较旧设备上访问非 NDK 库,则请依据 Android API 级别进行加载。
为帮助您诊断此类问题,下面列举了一些在您试图使用 Android N 开发应用时可能遇到的 Java 和 NDK 错误:
Java 错误示例:
java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libcutils.so" is not accessible for the namespace "classloader-namespace"
NDK 错误示例:
dlopen failed: cannot locate symbol "__system_property_get" referenced by ...
以下是遇到这类错误的应用的一些典型修复:
- 可以使用标准 JNI 函数来替代使用 libandroid_runtime.so 中的 getJavaVM 和 getJNIEnv:
AndroidRuntime::getJavaVM -> GetJavaVM from
AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or JavaVM::AttachCurrentThread from .
- 可以使用公开
alternative __system_property_get
来替代使用libcutils.so
中的property_get
符号。如需这样做,请使用__system_property_get
及以下 include 函数:#include
- 应使用应用本地版本来替代使用
libcrypto.so
中的SSL_ctrl
符号。例如,您应在.so
文件中静态链接libcyrpto.a
,或者在应用中包含您自己的来自 BoringSSL 或 OpenSSL 的动态libcrypto.so
。
- 您必须先安装授权证书安装程序,然后 DPC 才能对其进行设置。 对于面向 N SDK 的个人资料和设备所有者应用,您应在设备策略控制器 (DPC) 调用
DevicePolicyManager.setCertInstallerPackage()
之前安装授权证书安装程序。 如果尚未安装此安装程序,则系统会引发IllegalArgumentException
。 - 针对设备管理员的重置密码限制现在也适用于个人资料所有者。 设备管理员无法再使用
DevicePolicyManager.resetPassword()
来清除或更改已经设置的密码。 设备管理员仍可以设置密码,但只能在设备没有密码、PIN 或图案时这样做。 - 即使设置了限制,设备所有者和个人资料所有者仍可以管理帐户。而且,即使具有
DISALLOW_MODIFY_ACCOUNTS
用户限制,设备所有者和个人资料所有者仍可调用 Account Management API。 - 设备所有者可以更轻松地管理二级用户。当设备在设备所有者模式下运行时,系统将自动设置
DISALLOW_ADD_USER
限制。 这样可以防止用户创建非托管二级用户。 此外,CreateUser()
和createAndInitializeUser()
方法已弃用,取而代之的是DevicePolicyManager.createAndManageUser()
方法。 - 设备所有者可以访问设备标识符。设备所有者可以使用
DevicePolicyManagewr.getWifiMacAddress()
访问设备的 Wi-Fi MAC 地址。 如果设备上从未启用 Wi-Fi,则此方法将返回一个null
值。 - 工作模式设置控制工作应用访问。当工作模式关闭时,系统启动器通过使工作应用显示为灰色来指示它们不可用。 启用工作模式会再次恢复正常行为。
注解保留 Android N 在注解可见性被忽略时修复错误。这种问题将启用本不应被允许的运行时访问注解。 这些注解包括:
VISIBILITY_BUILD
:仅应编译时可见。VISIBILITY_SYSTEM
:运行时应可见,但仅限基本系统。
@Retention(RetentionPolicy.RUNTIME)
来如此做。其他重要说明
- 如果一个应用在 Android N 上运行,但却是针对更低 API 级别开发的,那么在用户更改显示尺寸时,系统将终止此应用进程。 应用必须能够正常处理此情景。 否则,当用户从最近使用记录中恢复运行应用时,应用将会出现崩溃现象。 您应测试应用以确保不会发生此行为。要进行此测试,您可以通过 DDMS 手动终止应用,以造成相同的崩溃现象。
在密度发生更改时,系统不会自动终止面向 N 及更高版本的应用;不过,这些应用仍可能对配置变更做出不良响应。
- Android N 上的应用应能够正常处理配置变更,并且在后续启动时不会出现崩溃现象。您可以通过更改字体大小 (Setting > Display > Font size) 并随后从最近使用记录中恢复运行应用,来验证应用行为。
- 由于之前的 Android 版本中的一项错误,系统未能将对主线程上的一个 TCP 套接字的写入操作举报为严格模式违反。 Android N 修复了此错误。呈现出这种行为的应用引发
android.os.NetworkOnMainThreadException
。 - 一般情况下,我们不建议在主线程上执行网络操作,因为这些操作通常都有可能导致 ANR 和卡顿的高尾延迟。
Debug.startMethodTracing()
方法族现在默认在您的共享的存储空间上的软件包特定目录中存储输出,而非 SD 卡顶级。 这意味着应用不再需要请求WRITE_EXTERNAL_STORAGE
使用这些 API 的权限。- 许多平台 API 现在开始检查在
Binder
事务间发送的大负载,系统现在会将TransactionTooLargeExceptions
再次作为RuntimeExceptions
引发,而不再只是默默记录或抑制它们。 一个常见例子是 - 在
Activity.onSaveInstanceState()
上存储过多数据,导致ActivityThread.StopInfo
在您的应用面向 Android N 时引发RuntimeException
。 - 如果应用向
View
发布Runnable
任务,并且View
未附加到窗口,系统会用View
为Runnable
任务排队;在View
附加到窗口之前,Runnable
任务不会执行。 此行为会修复以下错误:- 如果一项应用是从并非预期窗口 UI 线程的其他线程发布到
View
,则Runnable
可能会因此运行错误的线程。 - 如果
Runnable
任务是从并非环路线程的其他线程发布,则应用可能会曝光Runnable
任务。
- 如果一项应用是从并非预期窗口 UI 线程的其他线程发布到
- 如果 Android N 上一项有
DELETE_PACKAGES
权限的应用尝试删除一个软件包,但另一项应用已经安装了这个软件包,则系统可能要求用户确认。 在这种情况下,应用在调用PackageInstaller.uninstall()
时的返回状态应为STATUS_PENDING_USER_ACTION
。