Android 9.0是谷歌开发的Android操做系统,最先于2018年1月25日出如今谷歌官网,2018年2月,Android 9.0的初步代号定为Pistachio Ice Cream,中文暂译为开心果冰淇淋。通过Android 8.0以后,Android 9.0系统功能进一步完善,Android 9.0主要新增了谷歌统一推送升级、深度集成Project Treble模式、更加封闭、原生支持通话录音等功能,下面就让咱们一探究竟。android
##利用 Wi-Fi RTT 进行室内定位 Android 9 添加了对 IEEE 802.11mc Wi-Fi 协议(也称为 Wi-Fi Round-Trip-Time (RTT))的平台支持,从而让您的应用能够利用室内定位功能。算法
在运行 Android 9 且具备硬件支持的设备上,应用可使用 RTT API 来测量与附近支持 RTT 的 Wi-Fi 接入点 (AP) 的距离。 设备必须已启用位置服务并开启 Wi-Fi 扫描(在 Settings > Location 下),同时您的应用必须具备 ACCESS_FINE_LOCATION 权限。后端
设备无需链接到接入点便可使用 RTT。 为了保护隐私,只有手机能够肯定与接入点的距离;接入点无此信息。设计模式
若是您的设备测量与 3 个或更多接入点的距离,您可使用一个多点定位算法来预估与这些测量值最相符的设备位置。 结果一般精准至 1 至 2 米。数组
经过这种精确性,您能够打造新的体验,例如楼内导航、基于精细位置的服务,如无歧义语音控制(例如,“打开这盏灯”),以及基于位置的信息(如 “此产品是否有特别优惠?”)。 缓存
Android 9 支持最新的全面屏,其中包含为摄像头和扬声器预留空间的屏幕缺口。 经过 DisplayCutout 类可肯定非功能区域的位置和形状,这些区域不该显示内容。 要肯定这些屏幕缺口区域是否存在及其位置,请使用 getDisplayCutout() 函数。安全
全新的窗口布局属性 layoutInDisplayCutoutMode 让您的应用能够为设备屏幕缺口周围的内容进行布局。 您能够将此属性设为下列值之一:bash
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
复制代码
能够按如下方法在任何运行 Android 9 的设备或模拟器上模拟屏幕缺口: 启用开发者选项。 在 Developer options 屏幕中,向下滚动至 Drawing 部分并选择 Simulate a display with a cutout。 选择屏幕缺口的大小。 注:咱们建议您经过使用运行 Android 9 的设备或模拟器测试屏幕缺口周围的内容显示。 服务器
Android 9 引入了多个通知加强功能,可供以 API 级别 28 及以上版本做为目标平台的开发者使用。网络
从 Android 7.0(API 级别 24)开始,您能够添加一个操做以回复短信或直接从通知中输入其余文本。 Android 9 经过下列加强提高了该功能:
例如,附带照片的MessagingStyle
// Create new Person.
Person sender = new Person()
.setName(name)
.setUri(uri)
.setIcon(null)
.build();
// Create image message.
Message message = new Message("Picture", time, sender)
.setData("image/", imageUri);
Notification.MessagingStyle style = new Notification.MessagingStyle(getUser())
.addMessage("Check this out!", 0, sender)
.addMessage(message);
复制代码
Android 8.0 引入了通知渠道,容许您为要显示的每种通知类型建立可由用户自定义的渠道。 Android 9 经过下列变动简化通知渠道设置:
此外,您的应用可使用全新的 getNotificationChannelGroup() 函数查询当前渠道组设置。
PRIORITY_CATEGORY_ALARMS 优先处理警报。
PRIORITY_CATEGORY_MEDIA 优先处理媒体源的声音,如媒体和语音导航。
PRIORITY_CATEGORY_SYSTEM 优先处理系统声音。
复制代码
SUPPRESSED_EFFECT_FULL_SCREEN_INTENT 防止通知启动全屏 Activity。
SUPPRESSED_EFFECT_LIGHTS 屏蔽通知灯。
SUPPRESSED_EFFECT_PEEK 防止通知短暂进入视图(“滑出”)。
SUPPRESSED_EFFECT_STATUS_BAR 防止通知显示在支持状态栏的设备的状态栏中。
SUPPRESSED_EFFECT_BADGE 在支持标志的设备上屏蔽标志。 如需了解详细信息,请参阅修改通知标志。
SUPPRESSED_EFFECT_AMBIENT 在支持微光显示的设备上屏蔽通知。
SUPPRESSED_EFFECT_NOTIFICATION_LIST 防止通知显示在支持列表视图(如通知栏或锁屏)的设备的列表视图中。
复制代码
在运行 Android 9 的设备上,您能够经过两个或更多物理摄像头来同时访问多个视频流。在配备双前置摄像头或双后置摄像头的设备上,您能够建立只配备单摄像头的设备所不可能实现的创新功能,例如无缝缩放、背景虚化和立体成像。 经过该 API,您还能够调用逻辑或融合的摄像头视频流,该视频流可在两个或更多摄像头之间自动切换。 摄像头方面的其余改进还包括附加会话参数和 Surface 共享,前者有助于下降首次拍照期间的延迟,然后者则让摄像头客户端可以处理各类用例,而无需中止并启动摄像头视频流。 咱们还针对基于显示屏的 flash 支持和 OIS 时间戳访问新增了一些 API,用以实现应用级的图像稳定化和特效。
在 Android 9 中,多摄像头 API支持单色摄像头,适用于具备 FULL 或 LIMITED 功能的设备。 单色输出经过 YUV_420_888 格式实现,Y 为灰度,U (Cb) 为 128,V (Cr) 为 128。
在受支持的设备上,Android 9 还支持外置 USB/UVC 摄像头。
Android 9 引入了 ImageDecoder 类,可提供现代化的图像解码方法。 使用该类取代 BitmapFactory 和 BitmapFactory.Options API。
ImageDecoder 让您可经过字节缓冲区、文件或 URI 来建立 Drawable 或 Bitmap。 要解码图像,请首先以编码图像的来源为参数,调用 createSource()。 而后,经过传递 ImageDecoder.Source 对象来调用 decodeDrawable() 或 decodeBitmap(),从而建立 Drawable]或 Bitmap。 要更改默认设置,请将 OnHeaderDecodedListener 传递给 decodeDrawable() 或 decodeBitmap()。 ImageDecoder 调用 onHeaderDecoded(),以图像的默认宽度和高度(若已知)为参数。 若是编码图像是动画 GIF 或 WebP,decodeDrawable() 将返回 Drawable,它是 AnimatedImageDrawable 类的一个实例。
您可使用不一样的方法来设置图像属性:
经过 ImageDecoder 还能够为圆角或圆形遮罩之类的图像添加复杂的定制效果。 以 PostProcessor 类的一个实例做为参数使用 setPostProcessor(),执行您所需的任何绘图命令。
注:对 AnimatedImageDrawable进行后处理时,效果会出如今动画的全部帧中。
Android 9 引入了 AnimatedImageDrawable 类,用于绘制和显示 GIF 和 WebP 动画图像。 AnimatedImageDrawable 的工做方式与 AnimatedVectorDrawable 的类似之处在于,都是渲染线程驱动 AnimatedImageDrawable 的动画。 渲染线程还使用工做线程进行解码,所以,解码不会干扰渲染线程的其余操做。 这种实现机制容许您的应用在显示动画图像时,无需管理其更新,也不会干扰应用界面线程上的其余事件。
可以使用 ImageDecoder 的实例对 AnimatedImageDrawable 进行解码。 如下代码段演示如何使用 ImageDecoder 来解码 AnimatedImageDrawable:
private void decodeImage() throws IOException {
Drawable decodedAnimation = ImageDecoder.decodeDrawable(
ImageDecoder.createSource(getResources(), R.drawable.my_drawable));
if (decodedAnimation instanceof AnimatedImageDrawable) {
// Prior to start(), the first frame is displayed.
((AnimatedImageDrawable) decodedAnimation).start();
}
}
复制代码
ImageDecoder 有几个容许您进一步修改图像的函数。 例如,可以使用 setPostProcessor() 函数来修改图像的外观,如应用圆形遮罩或圆角。
Android 9 新增了对 High Dynamic Range (HDR) VP9 Profile 2 的内置支持,所以,如今您能够在支持 HDR 的设备上为用户提供来自 YouTube、Play Movies 和其余来源的采用 HDR 的影片。
Android 9 为平台增长了对 HEIF (heic) 图像编码的支持。 MediaMuxer 和 MediaExtractor 类中可支持 HEIF 静态图像示例 HEIF 改进了压缩,可节省存储空间和网络数据流量。 借助 Android 9 设备上的平台支持,从后端服务器发送和使用 HEIF 图像垂手可得。 确保应用兼容这种便于共享和显示的数据格式后,尝试在应用中使用 HEIF 做为图像存储格式。 您可使用 ImageDecoder 或 BitmapFactory 进行 jpeg 到 heicto 的转换,以经过 jpeg 获取位图,而且可使用 HeifWriter 写入来自 YUV 字节缓冲区、Surface 或 Bitmap 的 HEIF 静态图像。
还可经过 AudioTrack、AudioRecord 和 MediaDrm 类获取媒体指标。
Android 9 向 MediaDRM 类添加了函数以获取指标、高带宽数字内容保护 (HDCP) 级别、安全级别和会话数,并对安全性级别和安全中止进行更多控制。 如需了解更多详情,请参阅 API 差别报告。
在 Android 9 中,AAudio API 包含 AAudioStream 属性,用于 usage、content type 和 input preset。 使用这些属性能够建立针对 VoIP 或摄像机应用调整的流。 您还能够设置 SessionID将 AAudio 流与可包含音效的子混音相关联。 使用 AudioEffect API 来控制音效。
Android 9 包含一个用于 DynamicsProcessing 的 AudioEffect API。 借助该类,能够构建基于通道的音效,由各类类型(包括均衡、多频带压缩和限幅器)的多个阶段组成。 频带和活动阶段的数量可配置,并且大多数参数可实时控制。
从 Android 9 开始,JobScheduler 可使用运营商提供的网络状态信号来改善与网络有关的做业处理。
做业能够声明其预估的数据大小、信号预提取,并指定具体的网络要求。 JobScheduler 而后根据网络状态管理工做。 例如,当网络显示拥塞时,JobScheduler 可能会延迟较大的网络请求。 若是使用的是不按流量计费的网络,则 JobScheduler 可运行预提取做业以提高用户体验(例如预提取标题)。
添加做业时,确保使用 setEstimatedNetworkBytes()、setPrefetch() 和 setRequiredNetwork()(若是适用),以帮助 JobScheduler 正确处理工做。 在执行做业时,请确保使用 JobParameters.getNetwork() 返回的 Network 对象。 不然,您将隐式使用设备的默认网络,其可能不符合您的要求,从而致使意外的流量消耗。
Android 8.1(API 级别 27)中引入了 Neural Networks API 以加快 Android 设备上机器学习的速度。 Android 9 扩展和改进了该 API,增长了对九种新运算的支持:
元素级数学运算
数组运算
此外,API 还引入了一个新函数,即 ANeuralNetworksModel_relaxComputationFloat32toFloat16(),容许您指定是否计算范围和精度低至 IEEE 754 16 位浮点格式的 ANEURALNETWORKS_TENSOR_FLOAT32。
Android 9 引入了多项改进,自动填充服务能够利用这些改进进一步加强用户填写表单时的体验。 如需详细了解如何在您的应用中使用自动填充功能,请参阅自动填充框架指南。
Android 9 引入了若干安全功能,详见如下各节摘要说明:
运行 Android 9 或更高版本的受支持设备赋予您使用 Android Protected Confirmation 的能力。 使用该工做流时,您的应用会向用户显示提示,请他们批准一个简短的声明。 应用能够经过这个声明再次确认,用户确实想完成一项敏感事务,例如付款。
若是用户接受该声明,Android 密钥库会收到并存储由密钥哈希消息身份验证代码 (HMAC) 保护的加密签名。 Android 密钥库确认消息的有效性以后,您的应用可使用在可信执行环境 (TEE) 下经过 trustedConfirmationRequired 生成的密钥来签署用户已接受的消息。 该签名具备很高的可信度,它表示用户已看过声明并赞成其内容。
注意:Android Protected Confirmation 不会为用户提供安全信息通道。 应用没法承担 Android 平台所提供机密性保证以外的任何其余保证。 尤为是,请勿使用该工做流显示您一般不会显示在用户设备上的敏感信息。
在 Android 9 中,系统表明您的应用提供生物识别身份验证对话框。 该功能可建立标准化的对话框外观、风格和位置,让用户更加确信,他们在使用可信的生物识别凭据检查程序进行身份验证。
若是您的应用使用 FingerprintManager 向用户显示指纹身份验证对话框,请切换到改用 BiometricPrompt。 BiometricPrompt 依赖系统来显示身份验证对话框。 它还会改变其行为,以适应用户所选择的生物识别身份验证类型。
注:在应用中使用 BiometricPrompt 以前,应该先使用 hasSystemFeature()函数以确保设备支持 FEATURE_FINGERPRINT、FEATURE_IRIS 或 FEATURE_FACE。
若是设备不支持生物识别身份验证,能够回退为使用 createConfirmDeviceCredentialIntent() 函数验证用户的 PIN 码、图案或密码。
运行 Android 9 或更高版本的受支持设备可拥有 StrongBox Keymaster,它是位于硬件安全性模块中的 Keymaster HAL 的一种实现。 该模块包含如下组成部分:
检查存储在 StrongBox Keymaster 中的密钥时,系统会经过可信执行环境 (TEE) 证明密钥的完整性。
Android 9 经过利用 ASN.1‑编码密钥格式将已加密密钥安全导入密钥库的功能,提升了密钥解密的安全性。 Keymaster 随后会在密钥库中将密钥解密,所以密钥的内容永远不会以明文形式出如今设备的主机内存中。
注:只有附带 Keymaster 4 或更高版本的设备才支持该功能。
Android 9 新增了对 APK Signature Scheme v3 的支持。该架构提供的选择能够在其签名块中为每一个签名证书加入一条轮转证据记录。 利用此功能,应用能够经过将 APK 文件过去的签名证书连接到如今签署应用时使用的证书,从而使用新签名证书来签署应用。
注:运行 Android 8.1(API 级别 27)或更低版本的设备不支持更改签名证书。 若是应用的 minSdkVersion 为 27 或更低,除了新签名以外,可以使用旧签名证书来签署应用。
Android 9 引入了 unlockedDeviceRequired 标志。 此选项肯定在容许使用指定密钥对任何正在传输或存储的数据进行解密以前,密钥库是否要求屏幕解锁。 这些类型的密钥很是适合用于加密要存储在磁盘上的敏感数据,例如健康或企业数据。 该标志为用户提供了更高的保证,即便手机丢失或被盗,在设备锁定的状况下,没法对数据进行解密。
注:unlockedDeviceRequired 标志启用以后,仍然能够随时进行加密和签名验证。 该标志可防止在设备解锁时“仅解密”数据。
在设备锁定时要确保密钥安全不被解密,可经过将 true 传递给 setUnlockedDeviceRequired() 函数启用该标志。 完成该步骤以后,当用户的屏幕被锁定时,使用该密钥进行解密或签署数据的任未尝试都会失败。 锁定设备在能够访问以前,须要 PIN 码、密码、指纹或者一些其余可信因素。
附带 Keymaster 4 的 Android 9 设备支持三重数据加密算法(简称三重 DES)。 若是您的应用与须要三重 DES 的旧版系统进行互操做,请使用这种加密来加密敏感凭据。
Android 9 新增了与备份和还原有关的功能和开发者选项。 这些更改的详细信息如以部分下所示。
Android 9 新增了对使用客户端密钥加密 Android 备份的支持。 知足下列条件时会自动启用该支持功能:
该隐私措施启用以后,从用户设备制做的备份还原数据时,会要求提供设备的 PIN 码、图案或密码。
###定义备份所需的设备条件 若是您的应用数据包含敏感信息或偏好,Android 9 可以让您定义设备条件(例如在客户端加密已启用或者正在进行本地设备到设备传输时),数据将依据该条件包括在用户的备份中。
Android 9 引入了针对无障碍功能框架的加强功能,让您可以更轻松地为应用的用户提供更好的体验。
Android 9 中的新增属性让您能够更轻松地定义无障碍服务(尤为是屏幕阅读器)如何从屏幕的某个部分导航到另外一个部分。 这些属性可帮助视力受损用户在应用界面的文本之间快速移动,并容许他们进行选择。
例如,在购物应用中,屏幕阅读器能够帮助用户从某个交易类别直接导航至下一个交易类别,在转到下一个类别以前,屏幕阅读器无需读取当前类别中的全部交易。
在 Android 8.1(API 级别 27)和更低版本中,无障碍服务有时没法肯定屏幕的某个窗格是什么时候更新的,例如某个 Activity 将一个 Fragment 替换为另外一个 Fragment 的时候。 窗格由按照逻辑关系分组、视觉上相关的界面元素组成,其中一般包含一个 Fragment。
在 Android 9 中,可为这些窗格提供 无障碍功能窗格标题,便可单独识别的标题。 若是某个窗格具备无障碍功能窗格标题,当窗格改变时,无障碍服务可接收更详细的信息。 依靠这种功能,服务能够为用户提供有关界面变化的更精细信息。
要指定某个窗格的标题,请使用 android:accessibilityPaneTitle 属性。 您也能够更新在运行时使用 setAccessibilityPaneTitle() 替换的某个界面窗格的标题。 例如,您能够为某个 Fragment 对象的内容区域提供标题。
若是您的应用显示的文本内容包含逻辑标题,则对于表示这些标题的 View 实例,请将 android:accessibilityHeading 属性设置为 true。 经过添加这些标题,无障碍服务可帮助用户直接从一个标题导航至下一个标题。 任何无障碍服务均可以使用这种功能,以改善用户界面的导航体验。
传统上,屏幕阅读器一直使用 android:focusable 属性来肯定什么时候应该将 ViewGroup 或一系列 View 对象做为一个总体进行读取。 这样,用户就能够了解,这些视图在逻辑上彼此相关。
在 Android 8.1 和更低版本中,您须要将 ViewGroup 中的每一个 View 对象标记为不可聚焦,并将 ViewGroup 自己标记为可聚焦。 这种安排致使 View 的某些实例被标记为可聚焦,从而使得键盘导航变得更为繁琐。
从 Android 9 开始,若是将 View 对象标记为可聚焦会产生不良后果,则可使用 android:screenReaderFocusable 属性代替 android:focusable 属性。 屏幕阅读器聚焦在全部将 android:screenReaderFocusable 或 android:focusable 设置为 true 的元素上。
Android 9 新增了一些方便用户执行操做的支持功能:
访问提示: 无障碍功能框架中的新增功能可以让您在应用界面中访问提示。 使用 getTooltipText() 读取提示文本,使用 ACTION_SHOW_TOOLTIP 和 ACTION_HIDE_TOOLTIP 来指示 View 的实例显示或隐藏提示。
新增全局操做: Android 9 在 AccessibilityService 类中引入了对两个额外设备操做的支持。 您的 Service 能够帮助用户分别使用 GLOBAL_ACTION_LOCK_SCREEN 和 GLOBAL_ACTION_TAKE_SCREENSHOT 操做锁定其设备并进行屏幕截图。
Android 9 让您能够在应用同时重绘多个窗口时,更轻松地跟踪应用窗口的更新。 当发生 TYPE_WINDOWS_CHANGED 事件时,可以使用 getWindowChanges() API 来肯定窗口发生的变动。 在多窗口更新期间,每一个窗口都会生成本身的一组事件。 getSource() 函数返回与每一个事件相关联的窗口的根视图。
若是应用已为其 View 对象定义无障碍功能窗格标题,您的 Service 将能够识别应用界面什么时候进行更新。 TYPE_WINDOW_STATE_CHANGED 事件发生时,可以使用 getContentChangeTypes() 所返回的类型来肯定窗口发生的变动。 例如,框架能够检测窗格什么时候有新标题或者窗格什么时候消失。
为避免无心的旋转,咱们新增了一种模式,哪怕设备位置发生变化,也会固定在当前屏幕方向上。 必要时用户能够经过按系统栏上的一个按钮手动触发旋转。
大多数状况下,对应用的兼容性影响微不足道。 不过,若是您的应用有任何自定义旋转行为,或使用了任何很是规的屏幕方向设置,则可能会遇到之前用户旋转首选项始终设置为纵向时被忽视的问题。 咱们鼓励您审视一下您的应用全部关键 Activity 中的旋转行为,并确保您的全部屏幕方向设置仍可提供最佳体验。
一个新的旋转模式容许用户在必要时利用系统栏上的一个按钮手动触发旋转。
Android 9 为平台提供了如下与文本相关的功能:
在运行 Android 9 或更高版本的设备上,Android 运行时 (ART) 提早编译器经过将应用软件包中的 DEX 文件转换为更紧凑的表示形式,进一步优化了压缩的 Dalvik Executable 格式 (DEX) 文件。 此项变动可以让您的应用启动更快并消耗更少的磁盘空间和内存。 这种改进特别有利于磁盘 I/O 速度较慢的低端设备。
Android 9 容许您经过设备记录系统跟踪记录,而后与您的开发团队分享这些记录的报告。 该报告支持多种格式,包括 HTML。
经过收集这些跟踪记录,您能够获取与应用进程和线程相关的计时数据,并查看其余类型的具备全局意义的设备状态。