SDK 扩展

SDK 扩展利用模块化系统组件,为某些先前发布的 API 级别向公共 SDK 添加 API。当最终用户通过Google Play 系统更新接收模块更新时,这些 API 会传送到设备上。应用开发者可以在其应用中利用这些 API,提供在这些先前版本的 Android 的 SDK 中原本不可用的额外功能。

API 版本控制

从 Android 11(API 级别 30)开始,Android 设备包含一组 SDK 扩展。添加新 API 时,它们会包含在某个 API 级别中,但也可能包含在特定版本的 SDK 扩展中。例如,用于照片选择器的 ACTION_PICK_IMAGES API 已添加到 Android 13(API 级别 33)的公共 SDK 中,但从 R Extensions Version 2 开始,也可通过 SDK 扩展使用。 SDK 扩展名称对应于一个整数常量,可以是 Build.VERSION_CODES 中的常量,也可以是 SdkExtensions 类中定义的常量(例如 SdkExtensions.AD_SERVICES)。

确定要使用的 SDK 扩展

在使用 SDK 扩展 API 之前,您首先需要确定哪些 SDK 包含支持您的应用用例的 API。

SDK 扩展 API 的 API 参考页面指定了您的应用可以用来访问 API 的最低 SDK 扩展版本。如果文档还指定了 Android 平台版本(由 API 级别引用),则该 API 也适用于运行该版本或更高版本 Android 的所有设备。

例如,ACTION_PICK_IMAGES 通常从 Android 13(API 级别 33)开始在公共 SDK 中可用,但也适用于低至 Android 11(API 级别 30)的设备,前提是设备至少具有 R Extensions Version 2

APIs that are part of SDK Extensions show their extension version in the API
reference
docs

要使用此 API,您需要针对至少 API 级别 33 或扩展级别至少 2 的 SDK 进行编译。

使用扩展 SDK 的步骤

  1. 通过查看您想使用的 API 的功能文档和 API 参考来查找您需要的最低扩展版本。
  2. 确定您的功能集所需的扩展版本后,在 Android Studio 中打开 SDK 管理器。
  3. 选择具有相应扩展版本(或更高版本,因为 API 是累加的)的 Android SDK Platform 条目。例如:Android SDK Platform 33,Extension Level 4。
  4. 在您应用的 build.gradle.ktsbuild.gradle 文件中声明这些值

    Groovy

    android {
        compileSdk 33
        compileSdkExtension 4
        ...
    }

    Kotlin

    android {
        compileSdk = 33
        compileSdkExtension = 4
        ...
    }

检查 SDK 扩展是否可用

您的应用可以在运行时检查可用的 SDK 扩展版本,并且在开发过程中可以使用 Android Debug Bridge (adb) 命令查找扩展版本,如下节所述。

在运行时检查

您的应用可以在运行时使用 getExtensionVersion() 方法检查给定平台版本是否支持 SDK 扩展。例如,以下代码会检查 Android 11(API 级别 30)SDK 扩展的版本是否为 2 或更高版本

Kotlin

fun isPhotoPickerAvailable(): Boolean {
    return SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2
    // Safely use extension APIs that are available with Android 11 (API level 30) Extensions Version 2, such as Photo Picker.
}

Java

public static final boolean isPhotoPickerAvailable() {
    return SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2;
}

这类似于根据 Build.VERSION.SDK_INT 进行检查

Kotlin

fun isPhotoPickerAvailable(): Boolean {
    return Build.VERSION.SDK_INT >= 33
}

Java

public static final boolean isPhotoPickerAvailable() {
    return Build.VERSION.SDK_INT >= 33;
}

SDK_INT 检查仍然安全有效,但在某些设备上,即使扩展 API 可用,isPhotoPickerAvailable 也会返回 false。因此,SDK_INT 检查不是最佳方法,扩展版本检查是检查 API 可用性的更好方法。所有 SDK_INT 大于或等于 33(Android 13 或更高版本)的设备都在公共 SDK 中包含照片选择器 API,但有些设备 SDK_INT 小于 33(例如 Android 11、12 和 12L),如果其 R 扩展版本至少为 2,则也可以访问这些 API。

在这种情况下,使用扩展版本检查可以帮助您的应用为更多用户提供额外功能。有关可用于在设备上检查某些 SDK 扩展的所有常量列表,请参阅SDK 扩展名称和常量

Ad Services 扩展

与一般的 SDK 扩展类似,AdServices API 参考有时会表明某个 API 是“Ad Services 扩展”版本的一部分。与一般的 SDK 扩展不同,Ad Services 扩展使用 SdkExtensions.AD_SERVICES 常量来确定设备上的版本

Kotlin

fun isAdServicesAvailable(): Boolean {
    return SdkExtensions.getExtensionVersion(SdkExtensions.AD_SERVICES) >= 4
}

Java

public static final boolean isAdServicesAvailable() {
    return SdkExtensions.getExtensionVersion(SdkExtensions.AD_SERVICES) >= 4;
}

要详细了解 Ad Services 扩展中的功能以及如何开始使用,请参阅Ad Services 扩展文档

实用方法

在某些情况下,SDK 扩展提供了 Jetpack 实用方法,用于检查其 SDK 扩展 API 的可用性。例如,您可以使用Jetpack 库函数来检查 PhotoPicker 是否可用,这抽象了条件版本检查。

工具支持

在 Android Studio Flamingo | 2022.2.1 或更高版本中,lint 工具可以作为其 NewAPI 检查的一部分扫描 SDK 扩展版本的问题。此外,Android Studio 可以自动生成使用 SDK 扩展发布的 API 的正确版本检查。

lint 工具会标记调用 API 所需的最低 SDK 扩展版本未满足的情况。

SDK 扩展名称和常量

下表描述了 API 参考文档中列出的不同 SDK 扩展集如何映射到您的应用可以在运行时检查 API 可用性时使用的常量。每个公共 SDK 的一般 SDK 扩展集映射到 Build.VERSION_CODES 的值。

SDK 扩展名称 常量 符合条件的设备
R 扩展 VERSION_CODES.R Android 11(API 级别 30)及更高版本
S 扩展 VERSION_CODES.S Android 12(API 级别 31)及更高版本
T 扩展 VERSION_CODES.TIRAMISU Android 13(API 级别 33)及更高版本
U 扩展 VERSION_CODES.UPSIDE_DOWN_CAKE Android 14(API 级别 34)及更高版本
V 扩展 VERSION_CODES.VANILLA_ICE_CREAM Android 15(API 级别 35)及更高版本
Ad Services 扩展 SdkExtensions.AD_SERVICES Android 13(API 级别 33)及更高版本

使用 adb 检查

要使用 adb 检查设备上可用的 SDK 扩展,请运行以下命令

adb shell getprop | grep build.version.extensions

运行命令后,您会看到类似于以下的输出

[build.version.extensions.r]: [3] # Android 11 (API level 30) and higher
[build.version.extensions.s]: [3] # Android 12 (API level 31) and higher
[build.version.extensions.t]: [3] # Android 13 (API level 33) and higher

每一行显示设备上存在的 SDK 扩展及其对应的扩展版本(在本例中为 3)。