Модуль SDK Extensions определяет уровень расширения SDK устройства и предоставляет API-интерфейсы для приложений, чтобы запрашивать уровень расширения SDK. Этот модуль является обновляемым, то есть он может получать обновления функциональности за пределами обычного цикла выпуска Android.
SDK Extensions отвечает за:
- Определение уровня расширения SDK для устройства.
- Предоставление API-интерфейсов для приложений для запроса уровня расширения SDK.
- (Начиная с Android 12) Определение значений переменных среды
BOOTCLASSPATH
,DEX2OATBOOTCLASSPATH
иSYSTEMSERVERCLASSPATH
.
Формат модуля
Модуль SDK Extensions ( com.android.sdkext
) имеет формат APEX и доступен для устройств под управлением Android 11 или выше.
Формат пакета
Модуль SDK Extensions ( com.google.android.sdkext
) имеет формат APEX и содержит следующие компоненты:
(Начиная с Android 12)
bin/derive_classpath
: собственный двоичный файл, который запускается в начале процесса загрузки устройства. Он считывает отдельные файлы конфигурации classpath из системы и других модулей, объединяет их и определяет определение переменных средыCLASSPATH
.bin/derive_sdk
: собственный двоичный файл, который запускается в начале процесса загрузки устройства и считывает метаданные других модулей для установки системных свойств, связанных с расширением SDK (например,build.version.extensions.r
).javalib/framework-sdkextension.jar
: этот файл находится в пути bootclasspath, который предоставляет API-интерфейсы приложениям для запроса уровня расширения SDK.
Получение уровня расширения SDK
Программаderive_sdk считывает метаданные, хранящиеся в виде двоичных файлов derive_sdk
во вложенном пути etc/sdkinfo.binarypb
внутри каждого модуля APEX. Подробнее о структуре protobuf см. в файле protobuf
.
Чтение уровня SDK расширения
Модуль SDK Extensions предоставляет класс Java SdkExtensions
в пакете android.os.ext
. Используйте метод getExtensionVersion(int)
для чтения версии расширения SDK (например, getExtensionVersion(Build.VERSION_CODES.R)
).
Получение путей к классам
Служба derive_classpath
считывает и объединяет отдельные файлы конфигурации в /system/etc/classpaths/
и /apex/*/etc/classpaths/
. Каждая конфигурация хранит сообщение protobuf из classpaths.proto
в двоичном формате proto. Точный алгоритм слияния, определяющий порядок записей пути к классам, описан в derive_classpath.cpp
и может меняться со временем.