SDK 扩展

SDK 扩展模块用于确定设备的扩展 SDK 级别,并提供供应用查询扩展 SDK 级别的 API。此模块可更新,意即该模块可在 Android 常规发布周期外的时间接收功能更新。

SDK 扩展负责:

  • 确定设备的扩展 SDK 级别。
  • 为应用提供用于查询扩展 SDK 级别的 API。
  • (从 Android 12 开始)确定 BOOTCLASSPATHDEX2OATBOOTCLASSPATHSYSTEMSERVERCLASSPATH 环境变量的值。

模块格式

SDK 扩展模块 (com.android.sdkext) 采用 APEX 格式,适用于搭载 Android 11 或更高版本的设备。

软件包格式

SDK 扩展模块 (com.google.android.sdkext) 采用 APEX 格式,包含以下组件:

  • (从 Android 12 开始)bin/derive_classpath:在设备启动过程早期运行的原生二进制文件。它会读取系统和其他模块中的各个类路径配置文件,进行合并,然后确定 CLASSPATH 环境变量的定义。

  • bin/derive_sdk:此原生二进制文件在设备启动过程的早期运行,会读取其他模块的元数据,以设置与扩展 SDK 相关的系统属性(例如 build.version.extensions.r)。

  • javalib/framework-sdkextension.jar:此文件位于 bootclasspath 中,用于向应用公开用于查询扩展 SDK 级别的 API。

派生扩展 SDK 级别

derive_sdk 程序可读取作为二进制 protobuf 文件存储在每个 APEX 模块内的 etc/sdkinfo.binarypb 子路径中的元数据。如需详细了解 protobuf 结构,请参阅 protobuf 文件。

读取扩展 SDK 级别

SDK 扩展模块在 android.os.ext 软件包中公开了 SdkExtensions Java 类。使用 getExtensionVersion(int) 方法可读取 SDK 扩展的版本(例如 getExtensionVersion(Build.VERSION_CODES.R))。

派生类路径

derive_classpath 服务会读取 /system/etc/classpaths//apex/*/etc/classpaths/ 中的各个配置文件并进行合并。每个配置都以 proto 二进制文件格式存储来自 classpaths.proto 的 protobuf 消息。derive_classpath.cpp 中介绍了用于确定类路径条目顺序的精确合并算法,算法可能会随时间改变。