上传 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)或更高版本才能继续向在运行高于您的应用目标 API 级别操作系统的设备上的新用户提供。面向 Android 12(API 级别 31)或更低版本(Wear OS 为 Android 10(API 级别 29)或更低版本,Android TV 为 Android 11(API 级别 30)或更低版本)的应用,将仅在运行与您的应用目标 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
权限。- 意图过滤器:如果您的应用包含使用活动、服务或广播接收器的意图过滤器,则必须为这些组件显式声明android:exported 属性。
- 休眠:如果一段时间内未使用应用,则应用可能会进入休眠模式。在休眠模式下,应用的运行时权限和缓存将被重置,并且您无法运行作业或警报。您可以检查您的应用的休眠状态。
- PendingIntent 可变性:您必须指定应用创建的每个 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 Cloud Messaging 消息。
-
权限更改
- 系统限制对应用专用目录的访问。
- 在应用外部公开
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 Cloud Messaging 需要10.2.1 版或更高版本的 Google Play 服务 SDK。
- 使用 Firebase Cloud Messaging 时,消息传递受后台执行限制。当消息收到后需要后台工作(例如执行后台数据同步)时,您的应用应使用 Firebase Job Dispatcher 或 JobIntentService 调度作业。有关更多信息,请参阅 Firebase Cloud Messaging 文档。
-
- 隐式广播
- 隐式广播受到限制。有关处理后台事件的信息,请参阅
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接口。有关已阻止的非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则需要额外调查。如果您使用的SDK不支持API 31,请优先与SDK提供商合作以解决此问题。
此外,请注意,您的应用或游戏的targetSdkVersion
可能会限制对私有Android平台库的访问;有关详细信息,请参阅NDK应用链接到平台库。
您还应该验证您使用的Android支持库版本中可能存在的任何限制。与以往一样,您必须确保Android支持库的主版本与您的应用的compileSdkVersion
之间兼容。
我们建议您选择一个targetSdkVersion
小于或等于支持库的主版本。我们鼓励您更新到最近的兼容支持库,以便利用最新的兼容性功能和错误修复。
测试您的应用
在根据需要更新应用的API级别和功能后,您应该测试一些核心用例。以下建议并非详尽无遗,但旨在指导您的测试过程。我们建议测试
- 您的应用是否可以编译到API 29,且没有错误或警告。
您的应用是否有针对用户拒绝权限请求的情况的策略,并提示用户授予权限。为此,
- 转到应用的应用信息屏幕,然后禁用每个权限。
- 打开应用并确保不会崩溃。
- 执行核心用例测试,并确保重新提示所需的权限。
以预期的结果处理Doze,且没有错误。
- 使用adb,在应用运行时将测试设备置于Doze模式。
- 测试任何触发Firebase Cloud Messaging消息的用例。
- 测试任何使用闹钟或作业的用例。
- 消除对后台服务的任何依赖。
- 将您的应用置于应用待机状态
- 测试任何触发Firebase Cloud Messaging消息的用例。
- 测试任何使用闹钟的用例。
- 使用adb,在应用运行时将测试设备置于Doze模式。
处理拍摄的新照片/视频
- 检查您的应用是否正确处理受限的
ACTION_NEW_PICTURE
和ACTION_NEW_VIDEO
广播(即,已移至JobScheduler作业)。 - 确保依赖于这些事件的任何关键用例仍然有效。
- 检查您的应用是否正确处理受限的
处理与其他应用共享文件 - 测试任何与任何其他应用(甚至是同一开发人员的另一个应用)共享文件数据的用例
- 测试内容在其他应用中是否可见,并且不会触发崩溃。
更多信息
在Google Play Console中选择接收电子邮件,以便我们可以向您发送来自Android和Google Play的重要更新和公告,包括我们的每月合作伙伴通讯。