笛里谁知壮士心,沙头空照征人骨。这篇文章主要讲述译Android 7.0 for Developers相关的知识,希望能为你提供帮助。
译者注:
译者:aroundme原文地址:https://developer.android.com/about/versions/nougat/android-7.0.html主要是介绍Android 7.0提供新特性。翻译的动机主要是为了适配Android 7.0,提前踩点。防止大坑。就翻译来看,除去一些可有可无的更新之外,关注点主要是集中在四点:* 通知栏一系列更新
* 对于应用后台优化(或者说限制)
* WebView持续性更新(混合开发需要注意)
* 对于GPU的优化,优化3D渲染(为了全面实现手机VR铺路?)翻译如有语法不当之处请指正,如果觉得对你有帮助不妨点个赞或者鼓励鼓励,谢谢支持。PS:(原:......)表示翻译恐有歧义,遂附上原文。标题默认都会注上英语原文。超链接需要科学上网。
Android 7.0 Nougat为用户和开发人员介绍了各种新功能和功能。本文档重点介绍了开发人员的新功能。
请务必查看 Android 7.0行为更改,了解平台更改可能会对您的应用产生哪些影响。
要详细了解Android 7.0的用户功能,请访问 www.android.com。
一、多窗口支持(Multi-window Support)在Android 7.0中,我们在平台中引入了一个新的和非常需要的多任务功能 - 多窗口支持。
用户现在可以一次在屏幕上弹出打开两个应用程序。
- 在运行Android 7.0的手机和平板电脑上,用户可以在分屏模式下同时并排运行两个应用程序或者一个在另一个之上运行。
用户可以通过拖动应用程序之间的分隔线来调整应用程序的大小。 - 在Android TV装置上,应用程式可以使用画中画模式,让使用者在浏览或与其他应用程式互动时,可以继续显示内容。
特别是在平板电脑和其他大屏幕设备上,多窗口支持为您提供了吸引用户的新方法。
您甚至可以在应用中启用拖放功能,以便用户方便地将内容拖动到您的应用或从应用中拖出内容,这是增强用户体验的绝佳方式。
它可以直接添加多窗口支持到您的应用程序,并配置如何处理多窗口显示。
例如,您可以指定Activity的最小允许尺寸,防止用户将Activity大小调整为小于该尺寸。
您还可以为应用程序禁用多窗口显示,以确保系统只以全屏模式显示您的应用程序。
文章图片
图1.以分屏模式运行的应用程序。
二、通知增强(Notification Enhancements)在Android 7.0中,我们重新设计了通知,使其更容易,更快速地使用。一些更改包括:
1.模板更新(Template updates)
我们正在更新通知模板,以强调英雄(原:hero)图片和头像。开发人员将能够利用新模板,在代码中进行最少调整用以实现。
2.自定义消息主题(Messaging style customization)
您可以使用MessagingStyle类自定义更多与您的通知相关联的用户界面标签 。您可以配置消息,对话标题和内容视图。
3.通知绑定(Bundled notifications)
系统可以将通知消息分组在一起,例如通过消息主题,并且在组内显示。用户可以对其执行操作,例如“关闭”或“存档”。
如果您已经掌握Android Wear通知方式,那么您已经熟悉此模型。
4.直接回复(Direct reply)
对于实时通讯应用,Android系统支持内联回复,用户能当以短信或者文字消息的方式来直接回复通知的消息。
5.自定义视图(Custom views)
当在通知中使用自定义视图时,两个新的API可让您利用系统装饰(原:leverage system decorations),例如通知标题和操作。
三、配置文件引导 JIT / AOT 编译(Profile-guided JIT/AOT Compilation)
在Android 7.0中,我们添加了一个JIT(即时)编译器,其中包含针对ART的代码分析,这使得它能够在运行时不断提高Android应用的性能。
JIT编译器辅助ART的即时Ahead of Time (AOT)编译器,有助于提高运行时性能,节省存储空间,加快应用程序更新和系统更新速度。
配置引导编译(原:Profile-guided compilation)允许ART根据每个应用的实际使用情况以及设备上的条件来管理每个应用的AOT / JIT编译。
例如,ART维护每个应用程序的热方法(原:hot method)的配置引导文件,并可以预编译和缓存这些方法以获得最佳性能。
它不会编译其他部分,直到它们实际使用才会编译。
除了提高应用程序关键部分的性能,配置文件引导编译(原:profile-guided compilation)有助于减少应用程序的总体RAM占用空间,
包括相关联的二进制文件。此功能在低内存设备上尤其重要。
ART以最小化对设备电池的影响的方式来管理配置引导编译。它仅在设备空闲和充电时才进行预编译,从而通过提前完成此项工作来节省时间和电量。
四、快速的应用安装路径(Quick Path to App Install)
ART的JIT编译器的最显着的优点之一是应用安装和系统更新的速度。
甚至是在Android 6.0中,需要几分钟来优化和安装的大型应用程序现在可以在几秒钟内安装。
系统更新也更快,因为没有更多的优化步骤。
五、设备移动中的Doze优化(Doze on the Go …)
Android 6.0介绍了Doze,这是一种系统模式,通过延迟应用程序的CPU和网络活动来节省电池,当设备空闲时,例如当它躺在桌子或抽屉里。
现在在Android 7.0中,Doze进一步,在运行中节省电池。
任何时候屏幕关闭一段时间,并且设备已拔出,Doze会将限制应用CPU和网络(原:Doze applies a subset of the familiar CPU and network restrictions to apps.)。
这意味着用户即使在口袋中携带设备也可以节省电池。
(译者注:在Android 6.0的时候Doze会通过传感器和定位来判断手机是否在运动状态,静止才可能会触发Doze。
而现在Android 7.0通过优化可以满足手机在运动的情况下也可以触发Doze达到省电)
文章图片
图3. Doze现在应用限制以提高电池寿命,即使设备不稳定。
在设备处于电池状态时屏幕关闭后很短时间,Doze限制网络访问并延迟作业和同步。
在短暂的维护窗口期间,允许应用程序进行网络访问,并执行任何延迟作业/同步。打开屏幕或插入设备会使设备脱离Doze。
当设备再次静止时,在使用电池情况下屏幕关闭,Doze会全面限制PowerManager.WakeLock,AlarmManager警报和WIFI扫描的CPU和网络。
无论设备是否移动,适用于Doze的应用程序的最佳做法是相同的,因此如果您已经更新了应用程序以优雅地处理Doze,那么您就已经设置好了。
如果没有,请立即开始使您的应用程序适应Doze。
六、Svelte项目:后台优化(Project Svelte: Background Optimizations)
项目Svelte是一个持续努力,最大限度地减少系统和应用程序在生态系统中的Android设备的RAM使用。
在Android 7.0中,Svelte项目专注于优化应用程序在后台运行的方式。
后台处理是大多数应用程序的重要组成部分。当处理正确,它可以使您的用户体验令人惊叹-即时,迅速,自动化(原:context-aware)。
当不正确处理时,后台处理可能不必要地消耗RAM(和电池),并影响其他应用程序的系统性能。
自从Android 5.0以来,JobScheduler 一直是以一种对用户有利的方式执行后台工作的首选方式。
应用程序可以调度作业,同时根据内存,电源和连接条件优化系统。JobScheduler提供了控制和便捷,我们希望所有的应用程序使用它。
另一个好的选择是GCMNetworkManager,它是Google Play服务的一部分,它提供类似的作业调度功能,可与旧版Android兼容。
我们将继续扩展JobScheduler并 GCMNetworkManager满足更多您的使用案例 - 例如,在Android 7.0中,您现在可以根据内容提供商的更改安排后台工作。
同时,我们开始弃用一些可能降低系统性能的旧模式,特别是在低内存设备上。
在Android 7.0中,我们删除了三个常用的隐式广播 - CONNECTIVITY_ACTION,ACTION_NEW_PICTURE和ACTION_NEW_VIDEO,
因为那些可以一次唤醒多个应用程序的后台进程,并消耗内存和电池。如果您的应用程式收到这些资料,请改用Android 7.0迁移至JobScheduler相关API。
更多详情请见 后台优化 文档
七、SurfaceView
Android 7.0在SurfaceView类中提供了同步移动,在某些情况下,它提供比extureView更好的电池性能:当渲染视频或3D内容时,使用滚动和动画视频位置的应用程序,使用SurfaceView比使用TextureView更少的力气。
SurfaceView类在屏幕上实现了更多的电池效率合成,因为它被合成在专用硬件中,与应用程序窗口内容分开。 因此,它比TextureView的中间副本少。
SurfaceView对象的内容位置现在与包含应用程序内容同步更新。 这种变化的一个结果是,在SurfaceView中播放的视频的简单转换或缩放不再随着视图移动而在视图旁产生黑色条。
从Android 7.0开始,我们强烈建议您通过使用SurfaceView而不是TextureView来节省功耗。
八、流量节省程序(Data Saver)
在移动设备的寿命期间,蜂窝数据计划的成本通常超过设备本身的成本。对于许多用户,蜂窝数据是他们想要节省的昂贵资源。
Android 7.0引入了Data Saver模式,这是一种新的系统服务,可帮助减少应用程序(无论是漫游,接近结算周期结束还是小型预付费数据包)使用移动数据网络。
Data Saver可以让用户控制应用程序如何使用移动数据网络,并让开发者在启用“数据节省程序”时提供更有效的服务。
当用户在“设置”中启用“数据节省程序”并且设备位于计量网络上时,系统会阻止后台数据使用情况,并通知应用程序尽可能在前台使用较少的数据,例如限制流式传输的比特率,降低图像质量,延迟乐观预缓存等。
用户可以将特定应用加入白名单,以便在打开“流量节省程序”时允许后台计量的数据流量。
Android 7.0扩展了ConnectivityManager为应用程序提供了一种检索用户的数据节省程序偏好设置和监控偏好设置更改的方法。所有应用程序应检查用户是否已启用数据节省程序,并努力限制前台和后台数据使用情况。
文章图片
九、Vulkan API
Android 7.0将 Vulkan?(一种新的3D渲染API)集成到平台中。像 OpenGL?ES一样,Vulkan是由Khronos集团维护的3D图形和渲染的开放标准。
Vulkan是从头开始设计的,以最大限度地减少驱动程序中的CPU开销,并允许您的应用程序更直接地控制GPU操作。Vulkan还通过允许多个线程一次执行诸如命令缓冲器构造的工作来实现更好的并行化。
Vulkan开发工具和库已经推出到Android 7.0DK。他们包括:
- 标题
- 验证层(调试库)
- SPIR-V着色器编译器
- SPIR-V运行时着色器编译库
有关详细信息,请参阅API文档。
十、快速设置Tile API(Quick Settings Tile API)
快速设置是一种流行和简单的方法,直接从通知窗口中显示关键设置和操作。在Android 7.0中,我们扩大了快速设置的范围,使其更加实用和方便。
我们为其他快速设置图块添加了更多空间,用户可以通过向左或向右滑动来访问分页显示区域。我们还让用户控制快速设置图块的显示方式以及显示的位置 - 用户只需通过拖放即可添加或移动图块。
对于开发人员,Android 7.0还添加了一个新的API,可让您定义自己的快速设置图块,以便用户轻松访问应用中的主要控件和操作。
快速设置图块保留用于紧急需要或经常使用的控件或操作,不应用作启动应用程序的快捷方式。
定义图块后,您可以将其展示给用户,他们可以通过拖放将其添加到“快速设置”中。
有关创建应用程序图块的信息,请参阅参考文档Tile。
十一、号码屏蔽(Number Blocking)
Android 7.0 现在支持在平台中进行号码屏蔽,提供框架 API,让服务提供商可以维护屏蔽的号码列表。
默认短信应用、默认手机应用和运营商应用可以对屏蔽的号码列表进行读取和写入操作。其他应用则无法访问此列表。
通过使号码屏蔽成为平台的标准功能,Android 为应用提供一致的方式来支持广泛的设备上的号码屏蔽。应用可以利用的其他优势包括:
- 还会屏蔽已屏蔽的来电号码发出的短信
- 通过 Backup & Restore(备份和还原)功能可以跨重置和设备保留屏蔽的号码
- 多个应用可以使用相同的屏蔽号码列表
有关详细信息,请参阅参考文档 BlockedNumberContract。
十二、来电过滤(Call Screening)
Android 7.0允许默认手机应用程序屏幕来电。手机应用程序通过实现新的CallScreeningService,这允许手机应用程序执行基于来电的一些操作Call.Details,例如:
- 拒绝来电
- 不允许呼叫通话记录
- 不向用户显示该通话的通知
十三、多语言支持,更多语言(Multi-locale Support, More Languages)
Android 7.0现在允许用户在“设置”中选择多个地区,以便更好地支持双语用例。
应用程序可以使用新的API获取用户所选的区域设置,然后为多地区用户提供更复杂的用户体验,
例如显示多种语言的搜索结果,而不提供以用户已知的语言翻译网页。
除了多语言环境支持之外,Android 7.0还扩展了用户可用的语言范围。它提供超过25种变体,每种用于常用的语言,如英语,西班牙语,法语和阿拉伯语。它还增加了对100多种新语言的部分支持。
应用程序可以通过调用获取用户设置的区域设置列表 LocaleList.GetDefault()。为了支持更多的区域设置,Android 7.0正在改变它解决资源的方式。请确保您测试并验证您的应用程序按照预期使用新的资源解析逻辑。
要了解新的资源解析行为和您应遵循的最佳做法,请参阅多语言支持。
十四、新Emojis(New Emojis)
Android 7.0引入了额外的emojis和表情符号相关的功能,包括肤色表情和支持变化选择器。如果您的应用程式支持emojis,请按照下列指南来使用这些表情符号相关功能。
1.在使用之前,请检查设备是否包含表情符号要检查系统字体中存在哪些emojis,请使用[hasGlyph(String)}(https://developer.android.com/reference/android/graphics/Paint.html#hasGlyph(java.lang.String))方法。
2.检查表情符号是否支持变化选择器变化选择器允许您以彩色或黑白显示某些表情符号。在移动设备上,应用应以彩色而不是黑白表示emojis。
但是,如果您的应用在文本中显示emojis,则应使用黑白变体。要确定表情符号是否有变化,请使用变化选择器。
有关包含变体的字符的完整列表,请查看 Unicode文档中关于变体的 表情符号变体序列部分 。
3.检查表情符号是否支持肤色Android 7.0允许用户根据自己的喜好修改emojis的渲染肤色。
键盘应用程序应该为具有多种肤色的表情符号提供可视指示,并应允许用户选择他们喜欢的肤色。
要确定哪个系统表情符号有肤色调整,请使用该hasGlyph(String) 方法。
您可以通过阅读 Unicode文档 来确定哪些emojis使用肤色 。
十五、Android中的ICU4J API
Android 7.0现在在Android框架中的包下提供了一ICU4J API 的子集android.icu。
迁移很容易,并且大多数情况下只需要从com.java.icu命名空间更改为 android.icu。
如果您已在应用中使用ICU4J绑定,则切换到android.icuAndroid框架中提供的API可以大幅节省APK大小。
要了解有关Android ICU4J API的更多信息,请参阅 ICU4J支持。
十六、WebView
1.Chrome + WebView,在一起(Chrome + WebView, Together)从Android 7.0及更高版本的Chrome 51版本开始,您设备上的Chrome APK用于提供和渲染Android系统WebViews。
这种方法可以提高设备本身的内存使用,还可以减少保持WebView更新所需的带宽(因为只要Chrome保持启用状态,独立的WebView APK将不再更新)。
您可以选择通过使开发人员选项,然后选择您的WebView提供商的WebView实现。您可以使用安装在设备或独立Webview APK上的任何兼容的Chrome版本(开发,测试或稳定)作为WebView实现。
2.多处理(Multiprocess)从Android 7.0中的Chrome版本51开始,当启用开发人员选项“Multiprocess WebView”时,WebView将在单独的沙箱进程中运行Web内容。
在未来的Android版本中启用多处理WebView之前,我们正在寻找有关兼容性和运行时性能的反馈。在此版本中,预计在启动时间,总内存使用和软件渲染性能方面的回归。
如果你在多进程模式下发现意外的问题,我们想了解问题。请与Chromium错误跟踪器上的WebView小组联系。
3.javascript在网页加载之前运行(Javascript run before page load)从以Android 7.0为目标的应用开始,当加载新网页时,Javascript上下文将被重置。目前,对于在新的WebView实例中加载的第一页,上下文被继承。
想要在WebView中插入Javascript的开发人员应该在页面开始加载后执行脚本。
4.不安全的地理位置(Geolocation on insecure origins)从以Android 7.0为目标的应用开始,地理位置API将只允许在安全来源(通过HTTPS)。此政策旨在保护用户在使用不安全连接时的私人信息。
5.使用WebView Beta测试(Testing with WebView Beta)WebView定期更新,因此我们建议您经常使用WebView的测试版频道测试与您的应用程序的兼容性。
要开始在Android 7.0上测试WebView的预发布版本,请下载并安装Chrome开发者版或Chrome测试版,然后选择它作为开发人员选项下的WebView实施,如上所述。
请通过Chromium错误跟踪器报告问题,以便我们可以在新版本的WebView发布之前修复它们。
如果您有任何其他问题或疑问,请随时通过我们的 G +社区与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时,请务必使用标记和属性在清单文件中声明android:glEsVersion需求。
有关使用OpenGL ES的信息,包括如何在运行时检查设备支持的OpenGL ES版本,请参阅OpenGL ES API指南。
十八、Android TV录制(Android TV Recording)
Android 7.0增加了通过新的录制API录制和播放来自Android TV输入服务的内容的能力。基于现有的时移API,电视输入服务可以控制可以记录什么频道数据,如何记录会话,以及管理用户与记录内容的交互。
有关详情,请参阅 Android TV录制API。
十九、Android for Work
Android for Work为运行Android 7.0的设备添加了许多新功能和API。以下是一些亮点:有关更改的完整列表,请参阅 Android for Work更新。
1.工作资料安全挑战(Work profile security challenge)定位到N SDK的个人资料所有者可以为在工作资料中运行的应用指定单独的安全挑战。 当用户尝试打开任何工作应用程序时,将显示工作挑战。
成功完成安全质询解锁工作资料并在必要时解密。
对于个人资料所有者,ACTION_SET_NEW_PASSWORD提示用户设置工作质询,ACTION_SET_NEW_PARENT_PROFILE_PASSWORD提示用户设置设备锁定。
【译Android 7.0 for Developers】资料拥有者可以设置使用的工作挑战不同的密码策略(如PIN码需要多久是或指纹是否可以被用来解锁配置文件)setPasswordQuality(), setPasswordMinimumLength()以及相关的方法。
配置文件所有者还可以使用DevicePolicyManager 新getParentProfileInstance()方法返回的实例设置设备锁定。
此外,个人资料所有者可以使用新的setOrganizationColor()和 setOrganizationName()方法自定义工作挑战的凭证屏幕。
2.关闭工作(Turn off work)在具有工作资料的设备上,用户可以切换工作模式。当工作模式关闭时,管理用户暂时关闭,这会禁用工作资料应用,后台同步和通知。
这包括个人资料所有者应用程序。当工作模式关闭时,系统将显示持续状态图标,提醒用户他们无法启动工作应用程序。
启动器指示无法访问工作应用和窗口小部件。
3.永远连接VPN(Always on VPN)设备所有者和个人资料所有者可以确保工作应用始终通过指定的VPN连接。设备启动后,系统自动启动该VPN。
新的DevicePolicyManager方法是 setAlwaysOnVpnPackage()和 getAlwaysOnVpnPackage()。
由于VPN服务可以由系统直接绑定而无需应用程序交互,因此VPN客户端需要处理始终在VPN上的新入口点。
如前所述,通过意图过滤器匹配动作向系统指示服务android.net.VpnService。
用户还可以VPNService使用设置> 更多> Vpn手动设置始终在VPN客户端上实施 方法 。
从“设置”启用“始终开启VPN”的选项仅在VPN客户端定位API级别24时可用。
4.自定义配置应用程序可以使用公司颜色和徽标自定义配置文件所有者和设备所有者配置流程。
DevicePolicyManager.EXTRA_PROVISIONING_MAIN_COLOR定制流颜色。
DevicePolicyManager.EXTRA_PROVISIONING_LOGO_URI 定制具有公司标志的流程。
二十、辅助功能增强(Accessibility Enhancements)
Android 7.0现在直接在欢迎屏幕上提供新的设备设置的视觉设置。
这使得用户更容易发现和配置其设备上的辅助功能,包括放大手势,字体大小,显示大小和“话语提示”。
由于这些辅助功能的展示位置更加突出,您的用户更有可能在启用它们的情况下试用您的应用。确保在启用这些设置的情况下提前测试您的应用。您可以从设置> 辅助功能启用。
此外,在Android 7.0中,辅助功能服务现在可以帮助运动损伤的用户触摸屏幕。新的API允许构建具有面部跟踪,眼睛跟踪,点扫描等功能的服务,以满足这些用户的需求。
有关详细信息,请参阅参考文档 GestureDescription。
二十一、直接引导(Direct Boot)
直接启动可以缩短设备启动时间,让注册的应用具有有限的功能,即使在意外重启后。例如,如果当用户睡觉时加密的设备重启,那么注册的警报、消息和来电现在可以和往常一样继续通知用户。这也意味着重启后无障碍服务会立即可用。
在 Android 7.0 中,直接启动充分利用基于文件的加密,以针对系统和应用数据启用细化的加密策略。系统针对选定的系统数据和显式注册的应用数据使用设备加密存储。默认情况下,凭据加密存储可用于所有其他系统数据、用户数据、应用及应用数据。
启动时,系统在受限的模式中启动,仅访问设备加密数据,不会对应用或数据进行常规访问。如果您有想要在此模式下运行的组件,您可以通过在清单中设置标记注册它们。重启后,系统通过广播 LOCKED_BOOT_COMPLETED intent 激活注册的组件。系统确保注册的设备加密的应用数据在解锁前可用。所有其他数据在用户确认锁定屏幕凭据进行解密前均不可用。
如需了解详细信息,请参阅直接引导。
二十二、密钥认证(Key Attestation)
Android 7.0 引入密钥认证,这是一个新的安全工具,可帮助您确保设备的硬件支持的密钥库中存储的密钥对适当保护您的应用使用的敏感信息。
借助此工具,您可以更加放心地让您的应用与驻留在安全硬件中的密钥交互,即使运行您的应用的设备已被破解 root 权限。
如果您在应用中使用硬件支持的密钥库中的密钥,您应使用此工具,尤其当您使用密钥验证应用中的敏感信息时。
通过密钥认证,您可以在设备的可信执行环境 (TEE) 中验证在设备的硬件支持的密钥库中创建和存储的 RSA 或 EC 密钥对。
通过此工具,您还可以使用设备服务,例如您的应用的后端服务器,确定和有效验证密钥对的使用和有效性。
这些功能为保护密钥对提供额外的安全级别,即使有人破解设备的 root 权限或损害运行于设备的 Android 平台的安全。
注:仅少部分运行 Android 7.0 的设备支持硬件级密钥认证;其他所有运行 Android 7.0 的设备则使用软件级密钥认证。
在生产级环境中验证设备的硬件支持的密钥之属性前,您应确保设备支持硬件级密钥认证。
为此,您应确保认证证书链包含由 Google 认证根密钥签署的根证书,且密钥说明数据结构中的 attestationSecurityLevel 元素设置为 TrustedEnvironment 安全级别。
如需了解详细信息,请参阅密钥认证开发者文档。
二十三、网络安全性配置(Network Security Config)
在 Android 7.0 中,通过使用说明性“网络安全性配置”(而不是使用传统的易出错的编程 API(例如,X509TrustManager)),应用可以安全地自定义其安全(HTTPS、TLS)连接的行为,无需任何代码修改。
支持的功能:
- 自定义信任锚。让应用可以针对安全连接自定义哪些证书颁发机构 (CA) 值得信赖。例如,信任特定的自签署证书或限制应用信任的公共 CA 集。
- 仅调试重写。让应用开发者可以安全调试其应用的安全连接,而不会增加安装基础的风险。
- 明文流量选择退出。让应用可以防止自身意外使用明文流量。
- 证书固定。这是一项高级功能,让应用可以针对安全连接限制哪些服务器密钥受信任。
二十四、默认受信任的证书颁发机构(Default Trusted Certificate Authority)
默认情况下,面向 Android 7.0 的应用仅信任系统提供的证书,且不再信任用户添加的证书颁发机构 (CA)。
如果面向 Android N 的应用希望信任用户添加的 CA,则应使用网络安全性配置以指定信任用户 CA 的方式。
二十五、APK signature scheme v2
Android 7.0 引入一项新的应用签名方案 APK Signature Scheme v2,它能提供更快的应用安装时间和更多针对未授权 APK 文件更改的保护。
在默认情况下,Android Studio 2.2 和 Android Plugin for Gradle 2.2 会使用 APK Signature Scheme v2 和传统签名方案来签署您的应用。
虽然我们建议您对您的应用采用 APK Signature Scheme v2,但这项新方案并非强制性的。
如果您的应用在使用 APK Signature Scheme 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 Signature Scheme v2 签署您的应用,并对应用进行了进一步更改,则应用的签名将无效。
出于这个原因,请在使用 APK Signature Scheme v2 签署您的应用之前、而非之后使用 zipalign 等工具。
如需了解详细信息,请阅读相关的 Android Studio 文档,这些文档介绍了如何在 Android Studio 中签署应用
以及如何使用 Android Plugin for Gradle 为签署应用配置构建文件。
二十六、作用域目录访问
在 Android 7.0 中,应用可以使用新的 API 请求访问特定的外部存储目录,包括可移动媒体上的目录,如 SD 卡。
新 API 大大简化了应用访问标准外部存储目录的方式,如 Pictures 目录。
应用(如照片应用)可以使用这些 API(而不是使用 READ_EXTERNAL_STORAGE),其授予所有存储目录的访问权限或存储访问框架,从而让用户可以导航到目录。
此外,新的 API 简化了用户向应用授予外部存储访问权限的步骤。当您使用新的 API 时,系统使用一个简单的权限 UI,其清楚地详细介绍应用正在请求访问的目录。
如需了解详细信息,请参阅作用域目录访问开发者文档
二十七、键盘快捷键辅助工具
在 Android 7.0 中,用户可以按“Meta + /”触发“键盘快捷键”屏幕,它会显示的系统和对焦的应用中可用的所有快捷键。
如果快捷键存在,系统自动从应用菜单检索这些快捷键。您也可以为屏幕提供微调的快捷键列表。
您可以通过重写新 Activity.onProvideKeyboardShortcuts() 的方法来进行这项操作,如可下载的 API 参考中所述。
注:所有键盘都没有 Meta 键:在 Macintosh 键盘上,它是 Command 键;
在 Windows 键盘上,它是 Windows 键;
而在 Pixel C 和 Chrome 操作系统键盘上,它是 Search 键。
要在您的应用的任何地方触发键盘快捷键辅助工具,为相关 Activity 调用 Activity.requestKeyboardShortcutsHelper()。
二十八、Custom Pointer API
Android 7.0 引入 Custom Pointer API,以便您可以自定义指针的外观、 可见性和行为。
此功能在用户使用鼠标或触控板与 UI 对象交互尤为有用。默认指针使用标准图标。此 API 还包含多种高级功能,例如根据鼠标或触控板特定移动情况改变指针图标外观。
要设置指针图标,请替换 View 类的 onResolvePointerIcon() 方法。此方法使用 PointerIcon 对象绘制与特定移动事件对应的图标。
二十九、Sustained Performance API
长期运行的应用的性能可能会显著波动,因为系统会阻止系统芯片在设备组件达到温度限制时启动。
这种波动是建立高性能长期运行应用的应用开发者的移动目标。
为解决这些限制,Android 7.0 包括了对持续性能模式的支持,帮助原始设备制造商 (OEM) 提供关于长期运行应用的设备性能能力的提示。
应用开发者可以使用这些提示来根据可预测的一致设备性能水平调整长期应用。
应用开发者只能在 Nexus 6P 设备的 Android 7.0 中尝试这款新 API。要使用此功能,为您希望以持续性能模式运行的窗口设置持续性能窗口标记。
使用 Window.setSustainedPerformanceMode() 方法设置此标记。当窗口不再对焦时,系统会自动停用此模式。
三十、VR 支持(VR Support)
Android 7.0 添加了新的 VR 模式的平台支持和优化,以使开发者能为用户打造高质量移动 VR 体验。
增加了一些性能增强特性,包括允许 VR 应用访问某个专属的 CPU 核心。
在您的应用中,您可以充分利用到专为 VR 设计的智能头部跟踪和立体声通知功能。最重要的是,Android 7.0 的图形延时非常低。
如需了解有关开发面向 Android 7.0 的 VR 应用的完整信息,请参阅面向 Android 的 Google VR SDK。
三十一、打印服务增强(Print Service Enhancements)
在 Android 7.0 中,打印服务开发者现在可以公开关于个别打印机和打印作业的其他信息。
在列出各打印机时,打印服务现在可以通过两种方式来设置按打印机的图标:
您可以通过调用 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 Drive。
但是,不能表示没有直接字节码表示的文件;每个文件都必须提供一个输入流。
Android 7.0 在存储访问框架中添加了虚拟文件的概念。虚拟文件功能可以让您的 DocumentsProvider返回可与 ACTION_VIEW intent 使用的文件 URI,即使它们没有直接字节码表示。Android 7.0 还允许您为用户文件(虚拟或其他类)提供备用格式。
为获得您的应用中的虚拟文件的 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);
}
}
如需了解有关访问用户文件的详细信息,请参阅存储访问框架指南。
推荐阅读
- Android: 设置 app 字体大小不跟随系统字体调整而变化
- Android android.database.CursorIndexOutOfBoundsException:Index -1 requested, with a size of 1
- Android编译选项enguseruserdebug的区别
- 管理Android设备的唤醒状态
- Android系统层次解析
- (Android UI)Action Bar
- android 中处理崩溃异常并重启程序
- Android7.0 Phone应用源码分析 phone拒接流程分析
- Android的ImageLoader图片加载简单逻辑