Android O 8浅谈

Android O 8 新特性亮点

  1. Android O 引入了通知渠道,其允许您为要显示的每种通知类型创建用户可自定义的渠道。用户界面将通知渠道称之为通知类别

  2. Android O 通过引入自动填充框架,简化了登录和信用卡表单之类表单的填写工作。在用户选择接受自动填充之后,新老应用都可使用自动填 充框架。

  3. Android O 允许以画中画 (PIP) 模式启动 Activity。PIP 是一种特殊的多窗口模式,最常用于视频播放。目前,PIP 模式可用于 Android TV,而 Android O 则让该功能可进一步用于其他 Android 设备。

  4. Android O 推出一项新功能,即 XML 中的字体,允许您使用字体作为资源。引入自适应启动器图标。自适应图标支持视觉效果,可在不同设备型号上显示为各种不同的形状。

  5. Android O 新增了对 WLAN 感知的支持,此技术基于周边感知联网 (NAN) 规范。在具有相应 WLAN 感知硬件的设备上,应用和附近设备可以通过 WLAN 进行搜索和通信,无需依赖互联网接入点。

  6. 音频录制器现在支持对流式传输有用的 MPEG2_TS 格式

  7. Vitals,在Android O中,谷歌还会将重点放在针对设备电池续航、安全、应用启动时间和稳定性的优化上。

  8. 系统/应用启动程序加速,Android O上, Pixel设备的启动几乎只需要原来一半的时间,同样,在应用启动速度上也是如此。谷歌对应用启动的进程进行了优化,包括并发进程、压缩收集的垃圾信息和代码区域等。此外还有针对后台服务的限制,防止应用程序在后台运行太久。目标是大大减少电池消耗。

  9. Play Console Dashboard是一种新的开发人员工具,可提供对应用在设备上使用情况的分析。开发人员可以在任何Android设备上看到他们应用程序的实时结果-这可能不会消除开发人员在大多数主要手机上测试应用程序的需求,但如果设备正在运行,肯定会帮助他们减少问题。最重要的是,这个工具可以深入了解开发人员如何调整应用程序,以减少电池消耗并提高在各个设备上的运行速度。

  10. 未知来源应用,Android O还有一项比较有用的功能是,在应用权限设置的“特殊访问权限”中,加入了“安装其他应用”的设置,这主要是为了防止应用内引导用户安装其他无关应用,特别是针对一些流氓应用会比较有效。

Android O 8特性对开发的影响和注意事项

引入新权限

  1. Android O 中引入了一项新权限android.permission.ANSWER_PHONE_CALLS,使用此权限,应用可按设定的方式接听拨入的电话。此权限被划分为危险类别,属于 PHONE 权限组。
  2. 要在应用中处理拨入的电话,您可以使用 TelecomManager 类中的 acceptRingingCall() 方法。
    内容提供程序分页
  3. 更新内容提供程序以支持加载大型数据集,每次加载一页。例如,一个具有大量图像的照片应用可查询要在页面中显示的数据的子集。内容提供程序返回的每个结果页面由一个 Cursor 对象表示。客户端和提供程序必须实现分页才能利用此功能。

兼容性影响

  1. 在 Android 8.0 之前,创建前台服务的方式通常是先创建一个后台服务,然后将该服务推到前台。Android 8.0 有一项复杂功能;系统不允许后台应用创建后台服务。 因此,Android 8.0 引入了一种全新的方法,即 Context.startForegroundService(),以在前台启动新服务。在系统创建服务后,应用有五秒的时间来调用该服务的 startForeground() 方法以显示新服务的用户可见通知。如果应用在此时间限制内未调用startForeground(),则系统将停止服务并声明此应用为 ANR。

MediaPlayer

  1. 通过控制缓冲行为改进性能的功能。
  2. 在搜索帧时进行精细控制。
  3. 播放受数字版权管理保护的材料的功能。

API 变更

1.ActivityOptions 提供两个新方法以支持多个显示器:

  1. setLaunchDisplayId() 指定 Activity 在启动后应显示在哪个显示器上。
  2. getLaunchDisplayId() 返回 Activity 的当前启动显示器。

应用类别

在适当的情况下,Android O 允许每个应用声明它们所属的类别。这些类别用于将应用呈现给用户的用途或功能相同的应用归类在一起,例如按流量消耗、电池消耗和存储消耗将应用归类。您可以在 清单标记中设置 android:appCategory 属性,定义应用的类别。
新的 StrictMode 检测程序

  1. detectUnbufferedIo() 将检测您的应用何时读取或写入未缓冲的数据,这可能极大影响性能。

  2. detectContentUriWithoutPermission() 将检测您的应用在其外部启动 Activity 时何时意外忘记向其他应用授予权限。

  3. detectUntaggedSockets() 将检测您的应用何时使用网络流量,而不使用 setThreadStatsTag(int) 将流量标记用于调试目的。

内容变更通知

  1. Android O 更改了 ContentResolver.notifyChange() 和 registerContentObserver(Uri, boolean, ContentObserver) 在面向针对 Android O 的应用中的行为方式

  2. 现在,这些 API 需要在所有 URI 中为颁发机构定义一个有效的 ContentProvider。使用相关权限定义一个有效的 ContentProvider 可帮助您的应用防范来自恶意应用的内容变更,并防止将可能的私密数据泄露给恶意应用。

后台执行限制

  1. 为提高设备性能,系统会限制未在前台运行的应用的某些行为。具体而言:现在,在后台运行的应用对后台服务的访问受到限制。
    应用无法使用其清单注册大部分隐式广播(即,并非专门针对此应用的广播)。

安全性

如果您的应用的网络安全性配置选择退出对明文流量的支持,那么,您的应用的 WebView 对象无法通过 HTTP 访问网站。每个 WebView 对象必须转而使用 HTTPS。

  1. 更影响 Android O 的隐私性:

    1. 系统属性 net.dns1、net.dns2、net.dns3 和 net.dns4 不再可用,此项变更可加强平台的隐私性。
    2. 要获取 DNS 服务器之类的网络连接信息,具有 ACCESS_NETWORK_STATE 权限的应用可以注册 NetworkRequest 或 NetworkCallback 对象。这些类在 Android 5.0(API 级别 21)及更高版本中提供。
    3. 从 Android O 开始,不再支持 Build.SERIAL,此字段将返回一个未定义的值。需要知道硬件序列号的应用应改为使用新的 Build.getSerial() 方法,该方法要求具有 READ_PHONE_STATE 权限。
    4. LauncherApps API 不再允许托管配置文件应用获取有关主配置文件的信息。当某个用户在托管配置文件中时,LauncherApps API 的行为就像同一配置文件组的其他配置文件中未安装任何应用一样。和之前一样,尝试访问无关联的配置文件会引发 SecurityExceptions。

2.权限

  1. 在 Android O 之前,如果应用在运行时请求权限并且被授予该权限,系统会错误地将属于同一权限组并且在清单中注册的其他权限也一起授予应用。对于针对 Android O 的应用,此行为已被纠正。系统只会授予应用明确请求的权限。然而,一旦用户为应用授予某个权限,则所有后续对该权限组中权限的请求都将被自动批准。

  2. 框架会执行音频闪避。进行 AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK 时,应用不会失去焦点。新的 API 适用于需要暂停而不是闪避的应用。不过,Android O 中未提供此行为。
    当用户打电话时,活动的媒体流将在通话期间静音。
    音频流类型应仅用于音量控制;所有其他流类型的使用(例如 AudioTrack 构造函数)仍有效,但系统会将其作为错误记录下来。
    所有与音频相关的 API 均使用 AudioAttributes 来描述音频播放用例。
    使用 AudioTrack 时,如果应用请求了足够大的音频缓冲区,则框架将尝试使用深度缓冲区输出(如果可用)。

网络连接和 HTTP(S) 连接行为变更

  1. 无正文的 OPTIONS 请求具有 Content-Length: 0 标头

  2. HttpURLConnection 在包含斜线的主机或颁发机构名称后面附加一条斜线,使包含空路径的网址规范化。

  3. 通过 ProxySelector.setDefault() 设置的自定义代理选择器仅针对所请求的网址(架构、主机和端口)。因此,仅可根据这些值选择代理。传递至自定义代理选择器的网址不包含所请求的网址的路径、查询参数或片段。

  4. URI 不能包含空白标签。

  5. Android O 在实现 HttpsURLConnection 时不会执行不安全的 TLS/SSL 协议版本回退。

  6. 在通过连接建立隧道 HTTP(S) 连接时,系统会在 Host 行中正确放置端口号 (:443) 并将此信息发送至中间服务器。

  7. 系统不再将 user-agent标头由隧道连接请求复制到建立隧道的代理请求。相反,库为此请求生成 user-agent标头。
    如果之前执行的 connect() 方法失败,send(java.net.DatagramPacket) 方法将会引发 SocketException。

Android O 行为变更

  1. 后台执行限制,Android O 为提高电池寿命而引入的变更之一是,当您的应用进入已缓存状态时,如果没有活动的组件,系统将解除应用具有的所有唤醒锁。

  2. Android 后台位置限制,为节约电池电量,保持良好的用户体验和确保系统健康运行,在运行 Android O 的设备上使用后台应用时,降低了后台应用接收位置更新的频率。此行为变更会影响包括 Google Play 服务在内的所有接收位置更新的应用。

    此类变更会影响以下 API:

    1. Fused Location Provider (FLP)

    2. Geofencing

    3. GNSS Measurements

    4. Location Manager

  3. NotificationManager.startServiceInForeground() 方法将启动一个前台服务。启动前台服务的老办法将不再奏效。现在,如果针对 Android O 的应用尝试在限制服务的情况下使用 startService() 方法,则该方法将引发一个 IllegalStateException。

    为确保您的应用按预期方式运行,请完成以下步骤:

    1. 查看您的应用的逻辑,并确保您使用的是最新的位置 API。

    2. 测试您的应用是否在每个用例中都表现出预期行为。

    3. 考虑使用 Fused Location Provider (FLP) 或地理围栏来处理依赖于用户当前位置的用例。

  4. Android O 对 ScanRecord.getBytes() 方法检索的数据长度做出了以下变更

    1. getBytes() 方法对于所接收的字节数不作任何假定。因此,应用不应受所返回的任何最小或最大字节数的影响。相反,应用应当计算所返回数组的长度。

    2. 兼容蓝牙 5 的设备返回的数据长度可能会超出之前最大 60 个字节的限制。

    3. 如果远程设备未提供扫描响应,则也可能返回少于 60 个字节的数据。

只对targetSdkVersion>=28生效的变更

  1. 使用前台服务的应用必须请求 FOREGROUND_SERVICE 权限

  2. 只需要在manifest中声明,系统自动授予,无需动态授权

  3. 若无此权限运行前台服务,会发生SecurityException

  4. 隐私权变更( 对设备序列信息和 DNS 信息进行的这些更新可增强用户隐私保护。

  5. 去除通过Build.SERIAL获取设备序列号的方法,在 Android 9 中,Build.SERIAL 始终设置为 "UNKNOWN" 以保护用户的隐私。如果您的应用需要访问设备的硬件序列号,您应改为请求 READ_PHONE_STATE 权限,然后调用 getSerial()

  6. DNS 隐私,以 Android 9 为目标平台的应用应采用私有 DNS API。 具体而言,当系统解析程序正在执行 DNS-over-TLS 时,应用应确保任何内置 DNS 客户端均使用加密的 DNS 查找与系统相同的主机名,或停用它而改用系统解析程序。

  7. 框架安全性变更

  8. 默认情况下启用网络传输层安全协议 (TLS),如果您的应用以 Android 9 或更高版本为目标平台,则默认情况下 isCleartextTrafficPermitted() 函数返回 false。 如果您的应用需要为特定域名启用明文,您必须在应用的网络安全性配置中针对这些域名将 cleartextTrafficPermitted 显式设置为 true。

  9. WebView数据目录不允许共享

    1. 即使是同一个应用的不同进程也不行
    2. 建议:只在一个进程中调用WebView,其他进程disableWebView()
    3. 不同进程的WebView数据目录名必须使用不同的后缀
    4. 如果应用中的多个进程需要访问同一WebView数据,您需要自行在这些进程之间复制数据。 例如,您可以调用 getCookie() 和 setCookie(),在不同进程之间手动传输 Cookie 数据。
  10. 应用间不可以使用全局的Unix权限共享数据

    1. 每个应用数据目录都由selinux保护
    2. 应用可以继续使用ContentProvider或者外部存储共享数据

参考文档

Android 实现应用更新适配 Android O (Android 8.0) https://blog.csdn.net/mq2856992713/article/details/79688587

迁移你的App到Android O(8.0)https://www.jianshu.com/p/e4c56e2a4751

Android Oreo API https://developer.android.google.cn/about/versions/oreo/

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 125,140评论 16 537
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 6,382评论 1 35
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 71,268评论 12 116
  • Android O 除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种变更。本文重点介绍您应该了解并在...
    咻咻ing阅读 358评论 1 3
  • 极目樯帆影,苍苍逝水间。 叹悲归楫日,霜染翠云鬟。 非常感谢Julia老师点评!(这首五绝是典型的送别诗,起承句,...
    木木无纹阅读 34评论 8 15