SDK-Erweiterungen

Das SDK-Erweiterungsmodul bestimmt die Erweiterungs-SDK-Ebene des Geräts und stellt APIs für Apps bereit, um die Erweiterungs-SDK-Ebene abzufragen. Dieses Modul kann aktualisiert werden, d. h. es kann außerhalb des normalen Android-Releasezyklus Updates für Funktionen erhalten.

SDK-Erweiterungen sind verantwortlich für:

  • Die SDK-Ebene der Erweiterung für das Gerät festlegen
  • APIs für Apps bereitstellen, um die Erweiterung auf SDK-Ebene abzufragen.
  • (Ab Android 12) Festlegen der Werte für die Umgebungsvariablen BOOTCLASSPATH, DEX2OATBOOTCLASSPATH und SYSTEMSERVERCLASSPATH

Modulformat

Das Modul für SDK-Erweiterungen (com.android.sdkext) liegt im APEX-Format vor und ist für Geräte mit Android 11 oder höher verfügbar.

Paketformat

Das SDK-Erweiterungsmodul (com.google.android.sdkext) ist im APEX-Format und enthält die folgenden Komponenten:

  • (Ab Android 12) bin/derive_classpath: Ein nativer Binärcode, der früh im Bootvorgang des Geräts ausgeführt wird. Es liest einzelne Classpath-Konfigurationsdateien aus dem System und anderen Modulen, führt sie zusammen und definiert die Definition der Umgebungsvariablen CLASSPATH.

  • bin/derive_sdk: Ein nativer Binärcode, der zu Beginn des Gerätestartvorgangs ausgeführt wird und Metadaten anderer Module liest, um Systemeigenschaften im Zusammenhang mit dem Erweiterungs-SDK festzulegen (z. B. build.version.extensions.r).

  • javalib/framework-sdkextension.jar: Diese Datei befindet sich in der Boot-Klassenbibliothek, die APIs für Apps freigibt, um die Erweiterungs-SDK-Ebene abzufragen.

SDK-Level für Erweiterungen ableiten

Das derive_sdk-Programm liest Metadaten, die als binäre protobuf-Dateien im Unterpfad etc/sdkinfo.binarypb jedes APEX-Moduls gespeichert sind. Weitere Informationen zur protobuf-Struktur finden Sie in der Datei protobuf.

Lesezugriff auf SDK-Ebene der Erweiterung

Das SDK-Erweiterungsmodul stellt eine Java-Klasse SdkExtensions im android.os.ext-Paket bereit. Mit der Methode getExtensionVersion(int) kannst du die Version einer SDK-Erweiterung lesen (z. B. getExtensionVersion(Build.VERSION_CODES.R)).

Klassenpfade ableiten

Der Dienst derive_classpath liest und kombiniert einzelne Konfigurationsdateien in /system/etc/classpaths/ und /apex/*/etc/classpaths/. In jeder Konfiguration wird die protobuf-Nachricht von classpaths.proto in einem proto-Binärformat gespeichert. Der genaue Algorithmus zum Zusammenführen, der die Reihenfolge der Classpath-Einträge bestimmt, wird in derive_classpath.cpp beschrieben und kann sich im Laufe der Zeit ändern.