Android Q 平台做了一些行为变更,这些变更可能会影响您的应用。以下行为变更将影响在 Android Q 上运行的所有应用,无论其采用哪种“targetSdkVersion”都不例外。您应该测试您的应用,然后根据需要进行更改以适当地支持这些变更(如果适用)。
此外,请务必查看仅影响以 Android Q 为目标平台的应用的行为变更列表。
注意:除了此页面所列的变更以外,Android Q 还引入了大量变更和限制以增强用户隐私保护。有关详情,请参阅Google隐私权页面。
为了帮助确保应用稳定性和兼容性,Android 平台开始限制您的应用可在 Android 9(API 级别 28)中使用哪些非 SDK 接口。Android Q 包含更新后的受限非 SDK 接口列表(基于与 Android 开发者之间的协作以及最新的内部测试)。我们的目标是在限制使用非 SDK 接口之前确保有可用的公开替代方案。
如果您不打算以 Android Q 为目标平台,那么其中一些变更可能不会立即对您产生影响。虽然您目前可以使用灰名单中的一些非 SDK 接口(取决于您应用的目标 API 级别),但如果您使用任何非 SDK 方法或字段,则应用无法运行的风险终归较高。
如果您不确定自己的应用是否使用了非 SDK 接口,则可以测试该应用进行确认。如果您的应用依赖于非 SDK 接口,则应该开始计划迁移到 SDK 替代方案。不过,我们知道某些应用具有使用非 SDK 接口的有效用例。如果您无法为应用中的某项功能找到使用非 SDK 接口的替代方案,则应该请求新的公共 API。
有关详情,请参阅非 SDK 接口在 Android Q 中的受限情况出现变化以及对非 SDK 接口的限制。
Android Q 包含以下 NDK 方面的变更。
Android 6.0(API 级别 23)已禁止在共享对象中使用文本重定位。代码必须按原样加载,且不得修改。此变更可以减少应用的加载时间并提高安全性。
在 Android Q 测试版 1 和 2 中,SELinux 对以 Android 8.0(API 级别 26)及更高版本作为目标版本的应用强制执行此限制。如果此类应用继续使用包含文本重定位的共享对象,则出现故障的风险较高。
从 Android Q 开始,系统二进制文件和库会映射到只执行(不可读取)内存,作为应对代码重用攻击的安全强化技术。有意或意外读入已标记为只执行的内存段会抛出 SIGSEGV,无论此读入行为是来自错误、漏洞还是有意的内存自省都不例外。
您可以通过检查 /data/tombstones/
中的相关 tombstone 文件来确定崩溃是否由变更改所导致。与只执行相关的崩溃包含以下中止消息:
Cause: execute-only (no-read) memory access error; likely due to data in .text.
要解决此问题,开发者可以通过调用 mprotect()
将只执行内存段标记为“读取+执行”,例如用于执行内存检查。不过,我们强烈建议您事后将其重新设为只执行,因为这样可以更好地保护您的应用和用户。
对 ptrace
的调用不会受到影响,因此 ptrace
调试也不会受到影响。
在 Android Q 中,以下与 WLAN 直连相关的广播不再具有粘性。
如果您的应用依赖于在注册时接收这些广播(因为其之前一直具有粘性),请在初始化时使用适当的 get()
方法获取信息。
在 Android Q(Go 版本)设备上运行的应用无法获得 SYSTEM_ALERT_WINDOW 权限。这是因为绘制叠加层窗口会使用过多的内存,这对低内存 Android 设备的性能十分有害。
如果在搭载 Android 9 或更低版本的 Go 版本设备上运行的应用收到了 SYSTEM_ALERT_WINDOW
权限,则会保留此权限,即使设备升级到 Android Q 也不例外。不过,尚不具有此权限的应用在设备升级后便无法获得此权限了。
如果 Go 设备上的应用发送具有 ACTION_MANAGE_OVERLAY_PERMISSION 操作的 Intent,则系统会自动拒绝此请求,并将用户转到设置屏幕,上面会显示不允许授予此权限,原因是它会降低设备的速度。如果 Go 设备上的应用调用 Settings.canDrawOverlays(),则此方法始终返回 false。同样,这些限制不适用于在设备升级到 Android Q 之前便已收到 SYSTEM_ALERT_WINDOW
权限的应用。
在 Android Q 中,当用户首次运行以 Android 6.0(API 级别 23)以下的版本为目标平台的任何应用时,Android 平台会向用户发出警告。如果此应用要求用户授予权限,则系统会先向用户提供调整应用权限的机会,然后才会允许此应用首次运行。
由于 Google Play 的目标 API 方面的要求,用户只有在运行最近未更新的应用时才会看到这些警告。对于通过其他商店分发的应用,我们也将于 2019 年引入类似的目标 API 方面的要求。要详细了解这些要求,请参阅在 2019 年扩展目标 API 级别方面的要求。
以下 SHA-2 CBC 加密套件已从平台中移除:
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
这些加密套件不如使用 GCM 的类似加密套件安全,并且大多数服务器要么同时支持这些加密套件的 GCM 变体和 CBC 变体,要么二者均不支持。
注意:应用和库应该让其所需的加密套件集与 getSupportedCipherSuites() 中的返回值相互交叉,以便在未来提供有关加密套件选择的证明,从而防止未来被移除。
Android Q 引入了与应用使用情况相关的以下行为变更:
UsageStats 应用使用情况的改进 -- 当在分屏或画中画模式下使用应用时,Android Q 现在能够使用 UsageStats 准确地跟踪应用使用情况。此外,Android Q 现在可以跟踪免安装应用的使用情况。
按应用开启灰度模式 -- Android Q 现在可以将应用设为灰度显示模式。
按应用开启干扰模式 -- Android Q 现在可以选择性地将应用设为“干扰模式”,此时系统会禁止显示其通知,并且不会将其显示为推荐的应用。
暂停和播放 -- 在 Android Q 中,暂停的应用无法再播放音频。
android.preference
库现已弃用。开发者应该改为使用 AndroidX preference 库,这是 Android Jetpack 的一部分。要获取其他资源以帮助进行迁移和开发,请查看经过更新的设置指南,以及我们的公开示例应用和参考文档。