SDK 扩展模块决定设备的扩展 SDK 级别,并提供 API 以供应用查询扩展 SDK 级别。此模块是可更新的,这意味着它可以接收 Android 正常发布周期之外的功能更新。
SDK 扩展负责:
- 决定设备的扩展 SDK 级别。
- 提供 API 以供应用查询扩展 SDK 级别。
- (从 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 上,向应用公开 API 以查询扩展 SDK 级别。
派生扩展 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
中进行了描述,并且可能会随时间而变化。