Модуль SDK Extensions определяет уровень SDK расширений устройства и предоставляет приложениям API для запроса этого уровня. Этот модуль можно обновлять, то есть его функции могут обновляться вне обычного цикла выпуска Android.
Расширения SDK отвечают за:
- Определение уровня 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: этот файл находится в пути загрузки, который предоставляет приложениям API для запроса уровня SDK расширения.
Как определить уровень SDK расширения
Программа derive_sdk считывает метаданные, хранящиеся в виде двоичных файлов protobuf в подпути 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 и может меняться со временем.