上传 APK 时,它必须符合 Google Play 的目标 API 级别要求。
自 2024 年 8 月 31 日起
- 新应用和应用更新必须以 Android 14(API 级别 34)或更高版本为目标才能提交到 Google Play;Wear OS 和 Android TV 应用除外,它们必须以 Android 13(API 级别 33)或更高版本为目标。
- 现有应用必须以 Android 13(API 级别 33)或更高版本为目标,才能在运行 Android OS 版本高于您应用目标 API 级别的设备上对新用户保持可用。目标为 Android 12(API 级别 31)或更低版本(Wear OS 为 Android 10 (API 级别 29) 或更低版本,Android TV 为 Android 11 (API 级别 30) 或更低版本)的应用,将仅在运行 Android OS 版本与您应用目标 API 级别相同或更低的设备上可用。
如果您需要更多时间来更新应用,可以申请延期至 2024 年 11 月 1 日。您将于今年晚些时候在 Play 管理中心访问您应用的延期表单。
这些要求的例外情况包括
- 永久私人应用,这些应用仅限于特定组织内的用户,并仅用于内部分发。
- 以 Android Automotive OS 为目标的应用,或与以 Android Automotive OS 为目标的 APK 一起打包的应用。
为什么要以较新的 SDK 为目标?
每个新 Android 版本都会引入更改,从而带来安全和性能改进并增强 Android 用户体验。其中一些更改仅适用于通过其 targetSdkVersion
清单属性(也称为目标 API 级别)明确声明支持的应用。
将您的应用配置为以最新的 API 级别为目标,可确保用户能够受益于这些改进,同时您的应用仍可在旧版 Android 上运行。以最新的 API 级别为目标还可让您的应用利用平台的最新功能,取悦您的用户。此外,从 Android 10(API 级别 29)开始,如果应用的目标是 Android 5.1(API 级别 22)或更低版本,用户在首次启动应用时会看到警告。
本文档重点介绍了在更新目标 API 级别以满足 Google Play 要求时需要了解的重要事项。根据您要迁移到的版本,请参阅以下部分中的说明。
从 Android 12 及更高版本(API 级别 31)迁移到最新版本
要更新您的应用以定位到较新版本的 Android,请遵循相关的行为变更列表
从 Android 11(API 级别 30)迁移到 Android 12(API 级别 31)
安全和权限
- 蓝牙:您必须将
BLUETOOTH
和BLUETOOTH_ADMIN
权限的声明替换为BLUETOOTH_SCAN
、BLUETOOTH_ADVERTISE
或BLUETOOTH_CONNECT
权限。您不再需要为蓝牙操作发出LOCATION
运行时权限请求。 - 位置:用户可以请求应用仅检索粗略位置信息。每当您请求
ACCESS_FINE_LOCATION
时,都必须请求ACCESS_COARSE_LOCATION
权限。- Intent 过滤器:如果您的应用包含使用 Intent 过滤器的 Activity、 Service 或广播接收器,您必须为这些组件明确声明 android:exported 属性。
- 休眠:如果应用长时间未使用,可能会进入休眠模式。在休眠模式下,您应用的运行时权限和缓存会被重置,并且您无法运行作业或警报。您可以检查应用的休眠状态。
- Pending Intent 可变性:您必须指定您的应用创建的每个 PendingIntent 对象的 mutability。
用户体验
- 自定义通知:具有自定义内容视图的通知将不再使用完整的通知区域;相反,系统会应用标准模板。此模板可确保自定义通知在所有状态下都具有与其他通知相同的装饰。此行为与
Notification.DecoratedCustomViewStyle
的行为几乎相同。 - Android App Link 验证变更:在使用 Android App Link 验证时,请确保您的 Intent 过滤器包含 BROWSABLE 类别并支持 HTTPS 方案。
性能
前台服务启动限制:若要以 Android 12 或更高版本为目标,您的应用在后台运行时无法启动前台服务,少数特殊情况除外。如果应用在后台运行时尝试启动前台服务,则会发生异常(少数特殊情况除外)。
考虑使用 WorkManager 安排和启动加速工作,同时您的应用在后台运行。要完成用户请求的对时间敏感的操作,请在精确闹钟内启动前台服务。
通知中转限制:当用户点按通知时,某些应用会通过启动一个应用组件来响应,该组件会启动用户看到并与之交互的 Activity。此应用组件被称为通知中转。
应用不得从用作通知中转的服务或广播接收器启动 Activity。用户点按通知或通知内的操作按钮后,您的应用不能在 Service 或 BroadcastReceiver 中调用
startActivity()
。
查看影响以 Android 12(API 级别 31)为目标的应用的完整变更集。
从低于 Android 11(API 级别 30)的版本迁移
选择您将从哪个 Android 版本迁移
迁移到 Android 5(API 级别 21)
请参阅以下每个版本的“行为变更”页面,以确保您的应用已考虑这些版本中引入的变更
继续遵循下一节中的说明。
迁移到 Android 6(API 级别 23)
以下注意事项适用于以 Android 6.0 及更高平台版本为目标的应用
-
-
危险权限仅在运行时授予。您的 UI 流程必须提供授予这些权限的途径。
-
尽可能确保您的应用已准备好处理权限请求的拒绝。例如,如果用户拒绝访问设备 GPS 的请求,请确保您的应用有其他方法继续。
-
有关 Android 6.0(API 级别 23)中引入的变更的完整列表,请参阅该平台版本的行为变更页面。
继续遵循下一节中的说明。
迁移到 Android 7(API 级别 24)
以下注意事项适用于以 Android 7.0 及更高平台版本为目标的应用
-
Doze 和应用待机
设计符合优化 Doze 和应用待机模式中描述的行为,这包含了多个平台版本中引入的增量更改。
当设备处于 Doze 和应用待机模式时,系统行为如下
- 限制网络访问
- 推迟闹钟、同步和作业
- 限制 GPS 和 Wi-Fi 扫描
- 限制普通优先级 Firebase Cloud Messaging 消息。
-
权限变更
- 系统限制对应用私有目录的访问。
- 在应用外部公开
file://
URI 会触发FileUriExposedException
。如果您需要在应用外部共享文件,请实现FileProvider
-
系统禁止链接到非 NDK 库。
有关 Android 7.0(API 级别 24)中引入的变更的完整列表,请参阅该平台版本的行为变更页面。
继续遵循下一节中的说明。
迁移到 Android 8(API 级别 26)
以下注意事项适用于以 Android 8.0 及更高平台版本为目标的应用
-
后台执行限制
- 系统限制了非前台运行应用的 Service。
-
startService()
现在在应用尝试在startService()
被禁止时调用它时会抛出异常。 - 要启动前台服务,应用必须使用
startForeground()
和startForegroundService()
。 - 请仔细查看对 JobScheduler API 所做的更改,如 Android 8.0(API 级别 26)行为变更页面中所述。
- Firebase Cloud Messaging 需要 10.2.1 版本或更高版本的 Google Play 服务 SDK。
- 使用 Firebase Cloud Messaging 时,消息传递受后台执行限制。当消息接收后需要执行后台工作(例如执行后台数据同步)时,您的应用应改用 Firebase Job Dispatcher 或 JobIntentService 调度作业。有关更多信息,请参阅 Firebase Cloud Messaging 文档。
-
- 隐式广播
- 隐式广播受到限制。有关处理后台事件的信息,请参阅
JobScheduler
API 的文档。
- 隐式广播受到限制。有关处理后台事件的信息,请参阅
- 后台位置限制
- 在后台运行的应用对位置数据的访问受到限制。
- 在安装了 Google Play 服务的设备上,使用 融合位置提供程序 获取定期位置更新。
- 在后台运行的应用对位置数据的访问受到限制。
- 系统限制了非前台运行应用的 Service。
-
通知渠道
- 您应该根据每个渠道定义通知中断属性。
- 您必须将通知分配给一个渠道,通知才能显示。
- 此平台版本支持
NotificationCompat.Builder
。
-
隐私
- ANDROID_ID 按应用签名密钥进行限定。
有关 Android 8.0(API 级别 26)中引入的变更的完整列表,请参阅该平台版本的行为变更页面。
从 Android 8 (API 26) 迁移到 Android 9 (API 28)
- 电源管理
-
前台服务权限
- 需要请求正常权限
FOREGROUND_SERVICE
(不是运行时权限)
- 需要请求正常权限
-
隐私变更
- 对后台传感器的访问受限
- 对通话记录的访问受限,现在位于
CALL_LOG
权限组中 - 对电话号码的访问受限,需要
READ_CALL_LOG
权限 - 对 Wi-Fi 信息的访问受限
有关 Android 9.0(API 级别 28)中引入的变更的完整列表,请参阅行为变更。
从 Android 9(API 级别 28)迁移到 Android 10(API 级别 29)
-
具有全屏 Intent 的通知
- 需要请求正常权限
USE_FULL_SCREEN_INTENT
(不是运行时权限)。
- 需要请求正常权限
- 支持折叠屏和大屏幕设备
- 现在可以有多个 Activity 同时处于“resumed”状态,但只有一个 Activity 实际获得焦点。
- 此变更会影响
onResume()
和onPause()
的行为。 - 新的生命周期概念“topmost resumed”,可以通过订阅
onTopResumedActivityChanged()
来检测。- 只有一个 Activity 可以是“topmost resumed”。
- 此变更会影响
- 当
resizeableActivity
设置为false
时,应用还可以指定minAspectRatio
,这会在更窄的宽高比上自动为应用添加黑边。
- 现在可以有多个 Activity 同时处于“resumed”状态,但只有一个 Activity 实际获得焦点。
-
隐私变更
-
分区存储
- 外部存储访问仅限于应用专属目录和应用已创建的特定媒体类型。
- 应用在后台时对位置的访问受限,需要
ACCESS_BACKGROUND_LOCATION
权限。 - 对不可重置标识符(例如 IMEI 和序列号)的访问受限。
- 对身体活动信息(例如用户的步数)的访问受限,需要
ACTIVITY_RECOGNITION
权限。 - 对某些电话、蓝牙和 Wi-Fi API 的访问受限,需要
ACCESS_FINE_LOCATION
权限。 - 对 Wi-Fi 设置的访问受限
- 应用不再能直接启用或禁用 Wi-Fi,需要使用设置面板进行操作。
- 限制发起 Wi-Fi 网络连接,需要使用
WifiNetworkSpecifier
或WifiNetworkSuggestion
。
-
分区存储
从 Android 10(API 级别 29)迁移到 Android 11(API 级别 30)
- 隐私
- 分区存储强制执行:应用应采用分区存储模型,其中应用专属、媒体和其他文件类型使用专用位置保存和访问。
- 权限自动重置:如果用户几个月没有与应用互动,系统会自动重置应用的敏感权限。这应该不会影响大多数应用。如果您的应用主要在后台工作而无需用户互动,您可能会考虑请求用户禁用自动重置。
- 后台位置访问:应用必须分别请求前台和后台位置权限。访问后台位置权限只能在应用设置中授予,而不是在运行时权限对话框中。
- 软件包可见性:当应用查询设备上已安装应用和服务的列表时,返回的列表会经过过滤。
- 安全
- 不再支持压缩的 `resource.arsc` 文件
- 现在需要 APK 签名方案 v2。出于向后兼容性原因,开发者还应继续使用 APK 签名方案 v1 进行签名。
- 非 SDK 接口限制。不建议以 API 级别 30 为目标的应用使用非 SDK 接口,因为其中一些非 SDK 接口现在已被阻止。有关已在 Android 11 中阻止的非 SDK 接口的完整列表,请参阅Android 11 中现已阻止的非 SDK 接口。
有关 Android 11(API 级别 30)中引入的变更的完整列表,请参阅行为变更页面。
按照上一节中的说明继续更新到 API 31。
现代化您的应用
在更新应用的目标 API 级别时,考虑采用最新的平台功能,以现代化您的应用并取悦用户。
- 考虑使用处于 Beta 阶段的 CameraX,以充分利用相机。
- 使用 Jetpack 组件可帮助您遵循最佳实践,让您免于编写样板代码,并简化复杂任务,从而让您专注于您关心的代码。
- 使用 Kotlin 以更少代码更快地编写更好的应用。
- 确保您遵循隐私要求和最佳实践。
- 为您的应用添加深色主题支持。
- 为您的应用添加手势导航支持。
- 将您的应用从 Google Cloud Messaging (GCM)迁移到最新版本的 Firebase Cloud Messaging。
- 利用高级窗口管理。
- 支持更大的宽高比(超过 16:9)以利用硬件的最新进展。确保您的应用能够调整大小以填充可用屏幕空间。仅在万不得已时才声明最大宽高比。有关最大宽高比的更多信息,请参阅声明受限屏幕支持。
- 添加多窗口支持,以帮助您的应用提高生产力,并管理多个显示屏。
- 如果出色的最小化应用体验能改善用户体验,请添加对画中画的支持。
- 针对带显示屏刘海的设备进行优化。
- 不要假设状态栏高度。而是使用
WindowInsets
和View.OnApplyWindowInsetsListener
。要了解更多信息,请参阅 droidcon NYC 2017 视频以获取解释。 - 不要假设应用拥有整个窗口。而是使用
View.getLocationInWindow()
而不是View.getLocationOnScreen()
来确认其位置。* 处理MotionEvent
时,使用MotionEvent.getX()
和MotionEvent.getY()
,而不是MotionEvent.getRawX()
、MotionEvent.getRawY()
。
检查并更新您的 SDK 和库
确保您的第三方 SDK 依赖项支持 API 31:一些 SDK 提供商在其清单中发布此信息;另一些则需要额外调查。如果您使用的 SDK 不支持 API 31,请优先与 SDK 提供商合作解决此问题。
此外,请注意您的应用或游戏的 targetSdkVersion
可能会限制对私有 Android 平台库的访问;有关详细信息,请参阅链接到平台库的 NDK 应用。
您还应该验证您正在使用的 Android Support Library 版本中可能存在的任何限制。一如既往,您必须确保 Android Support Library 的主要版本与您应用的 compileSdkVersion
之间的兼容性。
我们建议您选择小于或等于 Support Library 主要版本的 targetSdkVersion
。我们鼓励您更新到最新的兼容 Support Library,以便利用最新的兼容性功能和错误修复。
测试您的应用
在您适当更新应用的 API 级别和功能后,您应该测试一些核心用例。以下建议并非详尽无遗,但旨在指导您的测试过程。我们建议测试
- 您的应用能够编译到 API 29 而不出现错误或警告。
您的应用有一个策略来处理用户拒绝权限请求的情况,并提示用户授予权限。为此
- 转到您应用的“应用信息”屏幕,并禁用每个权限。
- 打开应用并确保没有崩溃。
- 执行核心用例测试,并确保重新提示所需的权限。
处理 Doze,结果符合预期且没有错误。
- 使用 adb,在您的应用运行时将测试设备置于 Doze 模式。
- 测试任何触发 Firebase Cloud Messaging 消息的用例。
- 测试任何使用闹钟或作业的用例。
- 消除对后台服务的任何依赖。
- 将您的应用设置为应用待机
- 测试任何触发 Firebase Cloud Messaging 消息的用例。
- 测试任何使用闹钟的用例。
- 使用 adb,在您的应用运行时将测试设备置于 Doze 模式。
处理新照片/视频的拍摄
- 检查您的应用是否正确处理受限的
ACTION_NEW_PICTURE
和ACTION_NEW_VIDEO
广播(即已移至 JobScheduler 作业)。 - 确保任何依赖这些事件的关键用例仍然有效。
- 检查您的应用是否正确处理受限的
处理向其他应用共享文件 - 测试任何与任何其他应用(即使是同一开发者的另一个应用)共享文件数据的用例
- 测试内容在其他应用中可见且不会触发崩溃。
更多信息
在 Google Play 管理中心选择接收电子邮件,以便我们向您发送来自 Android 和 Google Play 的重要更新和公告,包括我们的每月合作伙伴简报。