上传 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)或更低版本)为目标的应用,仅在运行与您的应用目标 API 级别相同或更低版本的 Android OS 的设备上可用。
如果您需要更多时间更新应用,可以请求将截止日期延长至 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
权限。- 意图过滤器:如果您的应用包含使用 意图过滤器 的 活动、服务 或 广播接收器,则必须为这些组件显式声明 android:exported 属性。
- 休眠:如果一段时间内未使用应用,则应用可能会进入休眠模式。在休眠模式下,应用的运行时权限和缓存将被重置,并且您无法运行作业或警报。您可以查看 应用的休眠状态。
- 待处理意图的可变性:您必须指定应用创建的每个 PendingIntent 对象的可变性。
用户体验
- 自定义通知:具有自定义内容视图的通知将不再使用完整的通知区域;相反,系统将应用标准模板。此模板确保自定义通知在所有状态下都具有与其他通知相同的装饰。此行为与
Notification.DecoratedCustomViewStyle
的行为几乎相同。 - Android 应用链接验证更改:使用 Android 应用链接验证时,请确保您的意图过滤器包含 BROWSABLE 类别并支持 HTTPS 方案。
性能
前台服务启动限制:要以面向 Android 12 或更高版本,您的应用不能在后台运行时启动前台服务,除了少数特殊情况。如果应用尝试在后台运行时启动前台服务,则会发生异常(除了少数特殊情况)。
考虑使用 WorkManager 在应用在后台运行时调度和启动 快速工作。要完成用户请求的时间敏感操作,请在精确的闹钟内启动前台服务。
通知跳板限制:当用户点击通知时,某些应用会通过启动启动用户看到和交互的活动的应用组件来响应。此应用组件称为通知跳板。
应用不得从用作通知跳板的服务或广播接收器中启动活动。在用户点击通知或通知内的操作按钮后,您的应用不能在服务或广播接收器内调用
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 及更高版本的平台的应用
-
休眠和应用待机
设计用于 针对休眠和应用待机进行优化 中描述的行为,这包括在几个平台版本中引入的增量更改。
当设备处于休眠和应用待机模式时,系统将按如下方式运行
- 限制网络访问
- 推迟闹钟、同步和作业
- 限制 GPS 和 Wi-Fi 扫描
- 限制普通优先级 Firebase 云消息传递 消息。
-
权限更改
- 系统限制对应用私有目录的访问。
- 在应用外部公开
file://
URI 会触发FileUriExposedException
。如果您需要在应用外部共享文件,请实现FileProvider
-
系统 禁止链接 到非 NDK 库。
有关 Android 7.0 (API 级别 24) 中引入的更改的详尽列表,请参阅该版本的平台的 行为更改 页面。
继续按照下一节中的说明操作。
迁移到 Android 8 (API 级别 26)
以下注意事项适用于以面向 Android 8.0 及更高版本的平台的应用
-
后台执行限制
- 系统限制未在前台运行的应用的服务。
-
startService()
现在在应用尝试在禁止startService()
时调用它时会抛出异常。 - 要启动前台服务,应用必须使用
startForeground()
和startForegroundService()
。 - 仔细查看对 JobScheduler API 所做的更改,如 Android 8.0 (API 级别 26) 行为更改页面 上所述。
- Firebase 云消息传递 需要 版本 10.2.1 或更高版本的 Google Play 服务 SDK。
- 使用 Firebase 云消息传递 时,消息传递受后台执行限制。当消息接收后需要后台工作时(例如,执行后台数据同步),您的应用应使用 Firebase 作业调度程序或 JobIntentService 来调度作业。有关更多信息,请参阅 Firebase 云消息传递文档。
-
- 隐式广播
- 隐式广播受到限制。有关处理后台事件的信息,请参阅
JobScheduler
API 的文档。
- 隐式广播受到限制。有关处理后台事件的信息,请参阅
- 后台位置限制
- 在后台运行的应用对位置数据的访问有限。
- 在具有 Google Play 服务的设备上,使用 融合位置提供程序 获取定期位置更新。
- 在后台运行的应用对位置数据的访问有限。
- 系统限制未在前台运行的应用的服务。
-
通知通道
- 您应该在每个通道的基础上定义 通知中断属性。
- 您必须将通知分配到一个通道,才能使通知显示。
- 此版本的平台支持
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)
-
具有全屏意图的通知
- 需要请求普通权限
USE_FULL_SCREEN_INTENT
(不是运行时权限)。
- 需要请求普通权限
- 支持 可折叠设备 和大屏幕设备
- 现在多个活动可以同时处于“已恢复”状态,但只有一个活动实际上获得了焦点。
- 此更改会影响
onResume()
和onPause()
的行为。 - 新的生命周期概念“最顶层已恢复”,可以通过订阅
onTopResumedActivityChanged()
来检测。- 只有一个活动可以是“最顶层已恢复”。
- 此更改会影响
- 当
resizeableActivity
设置为false
时,应用还可以另外指定minAspectRatio
,这会在较窄的纵横比上自动给应用添加字母框。
- 现在多个活动可以同时处于“已恢复”状态,但只有一个活动实际上获得了焦点。
-
隐私更改
-
作用域存储
- 外部存储访问仅限于应用特定的目录以及应用创建的特定类型的媒体。
- 限制应用在后台时对位置的访问,需要
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 接口,获取已阻止的非 SDK 接口的完整列表。
有关 Android 11(API 级别 30)中引入的所有更改的完整列表,请参阅 行为更改 页面。
按照 上一节 中的说明继续更新到 API 31。
使您的应用程序现代化
在更新应用程序的目标 API 级别时,请考虑采用最新的平台功能,使您的应用程序现代化并让用户满意。
- 考虑使用 CameraX(处于 Beta 阶段),充分利用相机功能。
- 使用 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 则需要进行额外调查。如果您使用的 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 消息的用例。
- 测试任何使用 Alarm 或 Job 的用例。
- 消除对后台服务的任何依赖项。
- 将应用程序设置为应用程序待机模式
- 测试任何触发 Firebase Cloud Messaging 消息的用例。
- 测试任何使用 Alarm 的用例。
- 使用 adb,在应用程序运行时将测试设备置于 Doze 模式。
处理拍摄的新照片/视频
- 检查您的应用程序是否 正确处理受限制的
ACTION_NEW_PICTURE
和ACTION_NEW_VIDEO
广播(即,移动到 JobScheduler 作业)。 - 确保任何依赖于这些事件的关键用例仍然有效。
- 检查您的应用程序是否 正确处理受限制的
处理与其他应用程序共享文件 - 测试任何与任何其他应用程序(即使是同一开发人员的另一个应用程序)共享文件数据的用例
- 测试内容是否在其他应用程序中可见,并且不会触发崩溃。
更多信息
在 Google Play Console 中选择接收电子邮件,以便我们可以向您发送 Android 和 Google Play 的重要更新和公告,包括我们每月发布的合作伙伴通讯。