行为变更:以 API 级别 28 及更高级别为目标的应用

Android 9(API 级别 28)对 Android 系统引入了多项更改。 以下行为变更仅影响 API 级别 28 或更高级别。将 targetSdkVersion 设置为 API 级别 28 的应用,或 必须修改 来适当地支持这些行为(如果适用)。

适用于影响在 Android 9 上运行的所有应用(无论哪个 API)的变更 目标级别,请参阅 行为变更:所有应用

前台服务

如果应用以 Android 9 或更高版本为目标平台并使用前台服务,则必须请求 FOREGROUND_SERVICE 权限。这是一般权限, 以便系统自动将其授权给发出请求的应用。

如果以 Android 9 或更高版本为目标平台的应用尝试创建前台服务,却没有 正在请求FOREGROUND_SERVICE, 系统会抛出 SecurityException

隐私权变更

如果应用以 Android 9 为目标平台,则应保留以下内容 行为变更。对设备序列号和 DNS 信息进行的这些更新 加强对用户隐私的保护。

构建序列号弃用

在 Android 9 中,Build.SERIAL 为 始终设置为 "UNKNOWN",以保护用户的保护隐私。

如果您的应用需要访问设备的硬件序列号,您应该 而是请求 READ_PHONE_STATE 权限,然后调用 getSerial()

DNS 隐私权

以 Android 9 为目标平台的应用应遵从私有 DNS API。具体来说, 应用应确保,如果系统解析器执行 DNS-over-TLS, 内置 DNS 客户端使用加密 DNS,使用与 系统,或者因系统解析器而遭到停用。

框架安全性变更

Android 9 包含几项行为变更,旨在改进您的 但这些变更只有在您的应用以 API 级别为目标平台时才会生效 28 或更高版本。

默认启用网络传输层安全协议 (TLS)

如果您的应用以 Android 9 或更高版本为目标平台, isCleartextTrafficPermitted() 方法默认返回 false。如果您的应用需要针对 则必须将 cleartextTrafficPermitted 明确设置为 true 在应用的网络安全 配置

按进程分设基于网络的数据目录

为了提高 Android 9 中的应用稳定性和数据完整性,应用不得 共享一项 WebView 数据 目录 多个进程。通常情况下 此类数据目录会存储 Cookie、HTTP 缓存和其他持续性 与网络浏览相关的临时存储机制。

在大多数情况下,您的应用应使用 android.webkit 软件包,如 以WebViewCookieManager,只需一个 过程。例如,您应该将所有 使用 WebViewActivity 对象 相同的进程您可以更严格地执行“仅一个流程”规则 通过调用 disableWebView() 英寸 应用的其他进程此调用会阻止初始化 WebView 其他进程中的错误,即使从依赖 库。

如果您的应用必须使用 WebView 在多个进程中, 您必须使用 WebView.setDataDirectorySuffix() 方法,然后再在该进程中使用 WebView 的给定实例。此方法 将来自每个进程的网络数据放置在应用数据中其自己的目录中 目录。

按应用划分的 SELinux 域

以 Android 9 或更高版本为目标平台的应用无法通过以下方式与其他应用共享数据: 全局可访问的 Unix 权限。此更改可提高 Android 应用沙盒 尤其是应用 私有数据可供访问 来自该应用

如需与其他应用共享文件,请使用内容 provider

网络连接变更

网络连接数据计数和多路径

在以 Android 9 或更高版本为目标平台的应用中,系统会统计 网络上的网络流量 非当前默认选项,例如设备开启时的移动网络流量 Wi-Fi - 并提供 NetworkStatsManager 类来查询该流量。

具体来说, getMultipathPreference() 现在会返回基于上述网络流量的值。开头为 在 Android 9 中,该方法会针对单元格数据返回 true,但当数据量超过一定数量时, 在一天内累积的流量后,就会开始返回 false。运行应用 Android 9 必须调用此方法并遵从此提示。

ConnectivityManager.NetworkCallback 类现在会向应用发送有关 VPN 的信息。这项变更让 让应用可以监听连接事件,而无需混用同步事件和 异步调用和使用有限的 API 来实现。此外,这还意味着 当一个设备连接到多个平台时,信息传输可以按预期运行 Wi-Fi 网络或同时使用多个移动网络。

Apache HTTP 客户端弃用

对于 Android 6.0 我们取消了对 Apache HTTP 客户端的支持。 从 Android 9 开始,该库已从 bootclasspath,并且默认情况下不可用于应用。

以 Android 9 及更高版本为目标平台的应用若要继续使用 Apache HTTP 客户端 可以将以下内容添加到其 AndroidManifest.xml 中:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

作为使用运行时 Apache 库的替代方案,应用可以将自己的 自己的 APK 中拥有自己的 org.apache.http 库版本。执行这一操作后 就必须将该库重新打包(使用 Jar Jar)来避免类兼容性问题 与运行时中提供的类相关联。

界面变更

视图焦点

0 面积的视图(即宽度或高度为 0)再也不能被聚焦。

此外,Activity 在 中不再隐式分配初始焦点, 触控模式。而是由您明确请求初始焦点(如果 。

CSS RGBA 十六进制值处理

以 Android 9 或更高版本为目标平台的应用必须启用草稿 CSS 颜色模块级别 4 处理 4 和 8 个十六进制数字 CSS 颜色的行为。

CSS 颜色模块级别 4 自 52 版起便得到了 Chrome 的支持,但 WebView 目前停用此功能 因为我们发现现有的 Android 应用包含 32 位十六进制颜色码 这导致呈现错误。

例如,颜色 #80ff8080 目前的呈现颜色为 WebView(不透明) 浅红色 (#ff8080)。领先的 组件(Android 会将其解读为 Alpha 组件)是 当前已忽略。如果应用以 API 级别 28 或更高级别为目标,则 #80ff8080 为 系统会解读为 50% 透明浅绿色 (#80ff80)。

文件的 MIME 类型嗅探:URI

Android 9 之前的 Android 版本可以从文件中推断出 MIME 类型 内容。从 Android 9(API 级别 28)开始,应用必须使用 在 file: WebView

使用文件内容推断 MIME 类型可能会导致出现安全错误, 而现代浏览器通常不允许出现此类行为

如果文件具有可识别的文件扩展名(例如 .html), .txt.js.css,MIME 类型由扩展名决定。 如果文件没有扩展名或扩展名无法识别,那么 MIME 类型就是纯文本 文本。

例如,像 file:///sdcard/test.html 这样的 URI 将呈现为 HTML,但像 file:///sdcard/test 这样的 URI 将以纯文本形式呈现, 即使该文件包含 HTML 数据也一样。

文档滚动元素

Android 9 可正确处理文档根目录 元素是滚动元素。 在早期版本中,滚动位置在 body 元素上设置, 根元素的滚动值为零。Android 9 支持 符合标准的行为,其中滚动元素是根 元素。

此外,直接访问 document.body.scrollTopdocument.body.scrollLeftdocument.documentElement.scrollTopdocument.documentElement.scrollLeft 的行为方式因目标 SDK 而异。使用视口滚动功能 值,请使用 document.scrollingElement(如果有)。

来自已暂停应用的通知

在 Android 9 之前,已暂停的应用发出的通知会被取消。 从 Android 9 开始,已暂停的应用发出的通知将一直隐藏,直到 应用恢复运行。