SDK 扩展模块用于确定设备的扩展 SDK 级别,并提供供应用查询扩展 SDK 级别的 API。此模块可更新,意即该模块可在 Android 常规发布周期外的时间接收功能更新。
SDK 扩展负责:
- 确定设备的扩展 SDK 级别。
- 为应用提供用于查询扩展 SDK 级别的 API。
- (从 Android 12 开始)确定
BOOTCLASSPATH
、DEX2OATBOOTCLASSPATH
和SYSTEMSERVERCLASSPATH
环境变量的值。
模块格式
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
中介绍了用于确定类路径条目顺序的精确合并算法,算法可能会随时间改变。