Android9.0新功能和行为变更

275 阅读4分钟

新功能

刘海屏支持

Android 9 引入了对刘海屏的支持,包含摄像头和扬声器的全面屏。通过 DisplayCutout 类,可以确定不应显示内容的非功能区域的位置和形状。使用 getDisplayCutout() 方法可以检测这些刘海区域是否存在及其位置。

动画

Android 9 引入了 AnimatedImageDrawable 类,用于绘制和显示 GIF 和 WebP 动画图片。AnimatedImageDrawable 类似于 AnimatedVectorDrawable,由渲染线程驱动动画,并使用工作器线程进行解码,确保解码不会干扰渲染线程上的其他操作。这样可以在显示动画图片时,不必管理图片的更新,也不会干扰应用界面线程中的其他事件。

@Throws(IOException::class)
private fun decodeImage() {
    val decodedAnimation = ImageDecoder.decodeDrawable(
        ImageDecoder.createSource(resources, R.drawable.my_drawable)
    )

    // 在 start() 之前,显示第一帧。
    (decodedAnimation as? AnimatedImageDrawable)?.start()
}

APK 签名方案

Android 9 增加了对 APK 签名方案 v3 的支持。使用该方案时,可以在每个签名证书的签名分块中添加 proof-of-rotation 记录。这样可以将 APK 文件过去的签名证书与现在用于签名的证书关联,从而使用新的签名证书为应用签名。

注意:搭载 Android 8.1(API 级别 27)或更低版本的设备不支持更改签名证书。如果应用的 minSdkVersion 为 27 或更低,除了新签名之外,还需要使用旧的签名证书为应用签名。

更多

更多功能请参考 Android 9 功能和 API

行为变更

所有应用的行为变更

Android 9(API 级别 28)引入了多项系统行为变更。以下行为变更将影响在 Android 9 平台上运行的所有应用,无论这些应用以哪个 API 级别为目标平台。开发者应查看这些变更,并修改应用以正确支持这些变更(如果适用)。

限制在后台访问传感器

Android 9 限制后台应用访问用户输入和传感器数据的能力。如果应用在 Android 9 设备上在后台运行,系统会对应用施加以下限制:

  • 应用无法使用麦克风或摄像头。
  • 使用连续报告模式的传感器(如加速度计和陀螺仪)不会收到事件。
  • 使用变化或单次报告模式的传感器不会接收事件。

如果应用需要在后台检测传感器事件,请使用前台服务。

通话记录访问权限

Android 9 引入了 CALL_LOG 权限组,并将 READ_CALL_LOG、WRITE_CALL_LOG 和 PROCESS_OUTGOING_CALLS 权限移至该组中。在以前的 Android 版本中,这些权限位于 PHONE 权限组中。

需要访问通话敏感信息(如读取通话记录和识别电话号码)的应用,应明确请求 CALL_LOG 权限组的权限,否则会发生 SecurityException

电话号码访问权限

在 Android 9 上运行的应用,如果没有 READ_CALL_LOG 权限,无法读取电话号码或电话状态。电话号码显示在电话状态广播(如来电和去电)中,并可通过 PhoneStateListener 类访问。若没有 READ_CALL_LOG 权限,PHONE_STATE_CHANGED 广播和 PhoneStateListener 提供的电话号码字段将为空。

WLAN 位置信息和连接信息访问权限

在 Android 9 中,应用执行 Wi-Fi 扫描的权限要求更严格。详情请参阅 Wi-Fi 扫描限制

更多

更多行为变更请参考 所有应用的行为变更

以 API 28+ 为目标的应用的行为变更

Android 9(API 级别 28)引入了对以 API 级别 28 或更高级别为目标平台的应用的多项行为变更。将 targetSdkVersion 设为 API 级别 28 或更高级别的应用,必须修改以正确支持这些行为(如果适用)。

前台服务

以 Android 9 或更高版本为目标平台并使用前台服务的应用,必须请求 FOREGROUND_SERVICE 权限。系统会自动授予此权限。若未请求此权限便尝试创建前台服务,系统会抛出 SecurityException

构建序列号弃用

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

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

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

适配措施

  • 网络安全配置:在res/xml目录中创建一个network_security_config.xml文件,并在AndroidManifest.xml中引用它。
<!-- res/xml/network_security_config.xml -->
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
    <!-- Android 9.0 上部分域名时使用 http -->
    <!--    <domain-config cleartextTrafficPermitted="true">-->
    <!--        <domain includeSubdomains="true">secure.example.com</domain>-->
    <!--        <domain includeSubdomains="true">cdn.example1.com</domain>-->
    <!--    </domain-config>-->
</network-security-config>
<!-- AndroidManifest.xml -->
<application android:networkSecurityConfig="@xml/network_security_config"... ></application>

更多配置请参考网络安全配置

更多

更多行为变更请参考 以 API 28+ 为目标的应用的行为变更