Расширения SDK

Модуль 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 и может меняться со временем.