行为变更:以 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 颜色。

Chrome 自版本 52 以来便一直支持 CSS 颜色模块级别 4,但 WebView 目前停用了此功能,因为现有 Android 应用被发现包含 Android ordering (ARGB) 中的 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 开始,已暂停的应用发出的通知将一直隐藏,直到 应用恢复运行。