DLKM-Partitionen von Anbietern und ODMs

Mit Android 11 werden das generische Kernel-Image und die Vendor-Boot-Partition eingeführt. In der Vendor-Bootpartition werden Kernelmodule gespeichert, die mit GKI kompatibel sind. Sie wird von der Initialisierung der ersten Phase geladen. Kernelmodule vor der Veröffentlichung von Android 11 werden auch in Vendor- und ODM-Partitionen gespeichert und von Vendor-Prozessen geladen.

Unter Android 11 oder höher können der Kernel und alle Kernelmodule unabhängig von den anderen Partitionen aktualisiert werden. Wenn Sie Updates für Kernelmodule aktivieren möchten, die in der Anbieterpartition gespeichert sind (ohne Update der Anbieterpartition), verschieben Sie alle Module der Anbieterpartition in eine neue Partition namens Vendor DLKM (dynamisch ladbares Kernelmodul). Sie können diese Partition dann unabhängig aktualisieren. Ebenso können Sie alle Kernelmodule, die auf der ODM-Partition gespeichert sind, auf eine neue Partition namens ODM DLKM verschieben. Diese Partition kann auch unabhängig aktualisiert werden.

Partitionsort

Die Partitionen vendor_dlkm und odm_dlkm befinden sich in der Superpartition als weitere dynamische Partition.

vendor_dlkm-Inhalte in /vendor/lib/modules

  • Anbieter-Kernelmodule
  • modprobe-Konfigurationsdateien
  • Eine modules.load-Datei

odm_dlkm-Inhalte in /odm/lib/modules

  • ODM-Kernelmodule
  • modprobe-Konfigurationsdateien
  • Eine modules.load-Datei

Weitere Informationen zu Konfigurationsdateien für Kernelmodule finden Sie unter Unterstützung von Kernelmodulen.

Unterstützung gewinnen

Das Erstellen von vendor_dlkm und odm_dlkm ähnelt dem Erstellen anderer dynamischer Partitionen.

Beispiel für den Build von „vendor_dlkm“

Erstellen Sie vendor_dlkm, wie in den folgenden Beispielen gezeigt.

BoardConfig.mk

BOARD_USES_VENDOR_DLKMIMAGE := true
BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_COPY_OUT_VENDOR_DLKM := vendor_dlkm
BOARD_<GROUP_NAME>_PARTITION_LIST += vendor_dlkm

Ersetzen Sie <GROUP_NAME> durch den entsprechenden Namen der Updategruppe. Die Update-Gruppe sollte die Gruppe sein, in der sich die Anbieterpartition befindet.

Für A/B- und virtuelle A/B-Geräte: device.mk

AB_OTA_PARTITIONS += vendor_dlkm

fstab

Fügen Sie fstab den folgenden Eintrag für vendor_dlkm hinzu. Ändern Sie die Flags entsprechend dem Gerät. Verwenden Sie die CL Add vendor_dlkm to CF als Beispiel.

vendor_dlkm /vendor_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb

Beispiel für ODM-DLKM-Build

Erstellen Sie odm_dlkm, wie in den folgenden Beispielen gezeigt.

BoardConfig.mk

BOARD_USES_ODM_DLKIMAGE := true
BOARD_ODM_DLKIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_COPY_OUT_ODM_DLKM := odm_dlkm
BOARD_<group_name>_PARTITION_LIST += odm_dlkm

Für A/B- und virtuelle A/B-Geräte: device.mk

AB_OTA_PARTITIONS += odm_dlkm

fstab

Fügen Sie fstab den folgenden Eintrag für odm_dlkm hinzu. Ändern Sie die Flags entsprechend dem Gerät. Verwenden Sie die CL Add odm_dlkm to CF als Beispiel.

odm_dlkm /odm_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb

Kernelmodule in eine Partition kopieren

Wenn Sie die Kernelmodule auswählen möchten, die in die Partition vendor_dlkm kopiert werden sollen, listen Sie sie in BOARD_VENDOR_KERNEL_MODULES auf.

Wenn Sie den Inhalt von modules.load überschreiben möchten, können Sie ihn in BOARD_VENDOR_KERNEL_MODULES_LOAD angeben.

Zur Build-Zeit werden die in BOARD_VENDOR_KERNEL_MODULES aufgeführten Module in $ANDROID_PRODUCT_OUT/vendor_dlkm/lib/modules installiert. Unter /vendor/lib/modules wird ein symbolischer Link erstellt, der zu /vendor_dlkm/lib/modules führt.

Wenn Sie die Kernelmodule auswählen möchten, die in die Partition odm_dlkm kopiert werden sollen, listen Sie sie in BOARD_ODM_KERNEL_MODULES auf. Beim Plattformbuild wird depmod für die Module ausgeführt und die depmod-Ausgabedateien werden in das Image kopiert. Beim Build wird eine modules.load-Datei erstellt und im Image gespeichert. Diese Datei enthält alle in BOARD_ODM_KERNEL_MODULES aufgeführten Module.

Wenn Sie den Inhalt von modules.load überschreiben möchten, können Sie ihn in BOARD_ODM_KERNEL_MODULES_LOAD angeben.

Zur Build-Zeit werden die in BOARD_ODM_KERNEL_MODULES aufgeführten Module in $ANDROID_PRODUCT_OUT/odm_dlkm/lib/modules installiert. Ein symbolischer Link wird unter /odm/lib/modules erstellt, der zu /odm_dlkm/lib/modules führt.

Verwenden Sie immer /vendor/lib/modules und /odm/lib/modules für Kernelmodule von Anbietern und ODMs.

Verwenden Sie niemals /vendor_dlkm/lib/modules. Auf Geräten ohne vendor_dlkm-Partition wird BOARD_VENDOR_KERNEL_MODULES direkt in /vendor/lib/modules installiert. Das ist problematisch, da /vendor_dlkm/lib/modules nicht existiert.

Verwenden Sie /odm_dlkm/lib/modules niemals. Auf Geräten ohne odm_dlkm-Partition wird BOARD_ODM_KERNEL_MODULES direkt in /odm/lib/modules installiert. Das ist problematisch, da /odm_dlkm/lib/modules nicht vorhanden ist.

Partitionen einhängen und Module laden

Während first_stage_init werden die Partitionen vendor_dlkm und odm_dlkm in den Verzeichnissen /vendor_dlkm bzw. /odm_dlkm bereitgestellt. In diesem Fall sind Symlinks unter /vendor/lib/modules und /odm/lib/modules verfügbar.

Ein Anbieterprozess (z. B. ein .rc-Skript) kann dann die Kernelmodule in der in modules.load angegebenen Reihenfolge laden. Der Anbietervorgang kann die Module bei Bedarf auch später laden.

Die Dokumentation zum Erstellen einer Vendor-Boot-Partition (die die Vendor-RAMDisk enthält) finden Sie unter Unterstützung von Kernelmodulen.