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
软件包中的类,例如 WebView
和 CookieManager
。例如,您应该将所有
使用 WebView
的 Activity
对象
相同的进程您可以通过在应用的其他进程中调用 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.scrollTop
、document.body.scrollLeft
、
document.documentElement.scrollTop
或 document.documentElement.scrollLeft
的行为方式因目标 SDK 而异。使用视口滚动功能
值,请使用 document.scrollingElement
(如果有)。
来自已暂停应用的通知
在 Android 9 之前,已暂停的应用发出的通知会被取消。 从 Android 9 开始,已暂停的应用发出的通知将一直隐藏,直到 应用恢复运行。