Um die Anzahl der Symbole und Typen zu reduzieren, die stabil gehalten werden müssen, kann der GKI-Kernel exportierte Symbole auf diejenigen beschränken, die von Modulen benötigt werden. Für extern kompilierte Module benötigen Sie eine Liste der verwendeten Symbole, damit sie vom GKI-Kernel exportiert werden können. Symbole, die von Modulen für Cuttlefish verwendet werden, werden beispielsweise in gki/aarch64/symbols/virtual_device
gespeichert.
Ziel für die Symbollistengenerierung hinzufügen
Symbollisten werden vom Ziel kernel_abi
generiert. Fügen Sie dieses Ziel dem Gerät BUILD.bazel
mit den folgenden Optionen hinzu:
name
Er sollte das Format
<kernel_build>_abi
haben.kernel_build
Sollte den Namen des Geräts
kernel_build
enthalten.
Sie haben auch die folgenden Möglichkeiten:
kernel_modules
Liste der Ziele für Out-of-Tree-Module. In-Tree-Module sollten hier nicht enthalten sein. Weitere Informationen finden Sie unter In-Tree-Module für die Symbolerstellung vorbereiten.
kmi_symbol_list_add_only
Mit dieser Option wird verhindert, dass nicht verwendete Symbole entfernt werden. Das Entfernen von Symbolen ist nur zu bestimmten Zeiten während der Stabilisierung des KMI zulässig und nicht, sobald der KMI eingefroren ist.
Das ist auch nützlich, wenn Sie dieselbe Symbolliste für mehrere verschiedene Geräte verwenden. So werden keine Symbole entfernt, die von Gerät A, aber nicht von Gerät B verwendet werden.
module_grouping
Wenn
True
oder nicht angegeben, werden die Symbole in der Symbolliste nach den Kernelmodulen gruppiert, die auf das Symbol verweisen. Andernfalls ist die Symbolliste eine sortierte Liste der von allen Kernelmodulen verwendeten Symbole.
Beispiel: common-modules/virtual-device/BUILD.bazel
kernel_abi(
name = "virtual_device_aarch64_abi",
kernel_build = ":virtual_device_aarch64",
kernel_modules = [":virtual_device_aarch64_external_modules"],
kmi_symbol_list_add_only = True,
)
Weitere Informationen finden Sie in der Referenzdokumentation zum kernel_abi
-Ziel in Kleaf.
In-Tree-Module für die Symbol-Extraktion vorbereiten
Um In-Tree-Module für die Symbol-Extraktion vorzubereiten, listen Sie anbieterspezifische In-Tree-Module in einem module_outs
-Attribut des kernel_build
-Ziels auf. Ein Beispiel finden Sie unter _VIRT_COMMON_MODULES
und Verwendung. GKI-Module dürfen nicht in dieser Liste enthalten sein.
Konfigurieren Sie diese Module als nicht signiert, da die Symbolliste sonst leer sein könnte. Fügen Sie dazu diese Zeile in Ihre Kernelkonfigurationsfragmente ein:
# CONFIG_MODULE_SIG_ALL is not set
Siehe beispielsweise common-modules/virtual-device/virtual_device_core.fragment
.
Gerätesymbolliste zum Geräte-Kernel-Build hinzufügen
Fügen Sie dem in der Geräte-BUILD.bazel
definierten kernel_build
-Ziel das Attribut kmi_symbol_list
hinzu. Der Name der Symbolliste muss das Format //common:gki/<arch>/symbols/<device>
haben.
Beispiel: common-modules/virtual-device/BUILD.bazel
kernel_build(
name = "virtual_device_aarch64",
base_kernel = "//common:kernel_aarch64",
kmi_symbol_list = "//common:gki/aarch64/symbols/virtual_device",
...
module_outs = _VIRT_COMMON_MODULES + _VIRT_AARCH64_MODULES,
)
Erste Symbolliste erstellen und einreichen
Erstelle eine leere Symbolliste unter common/gki/<arch>/symbols/<device>
. Für das obige Beispiel lautet der Befehl so:
touch common/gki/aarch64/symbols/virtual_device
Fügen Sie diese Datei dem additional_kmi_symbol_lists
des Basis-GKI-Kernel-Build hinzu. Beispiel: //common:gki/aarch64/symbols/virtual_device
wird der in common/BUILD.bazel
deklarierten Dateigruppe aarch64_additional_kmi_symbol_lists
hinzugefügt.
Aktualisieren Sie die Liste der Gerätesymbole, um die neue Symbolliste zu füllen und an das Android Common Kernel-Repository zu senden.
Gerätesymbolliste aktualisieren
Alle Kernelsymbole, die von Modulen in module_outs
von kernel_build
und kernel_modules
von kernel_abi
verwendet werden, sollten in der Symbolliste enthalten sein. Dazu können Sie das Ziel kernel_abi
mit dem Suffix _update_symbol_list
ausführen. Mit dem folgenden Befehl wird beispielsweise die Symbolliste für //common-modules/virtual-device:virtual_device_aarch64
aktualisiert:
tools/bazel run //common-modules/virtual-device:virtual_device_aarch64_abi_update_symbol_list
Senden einer Symbollistenaktualisierung an ACK
Senden Sie einen Patch mit der Änderung der Symbolliste an das Android Common Kernel-Gerrit, damit die neuen Symbole Teil des KMI werden.
Die Commit-Nachricht sollte eine Liste der hinzugefügten oder entfernten Symbole enthalten. Sie können diese Liste entweder manuell für eine kleine Symbollistenaktualisierung schreiben oder den $DIST_DIR/abi_stgdiff/abi.report.short
-Bericht verwenden, nachdem Sie die Referenz-ABI-Darstellung aktualisiert haben.
Es ist zwar nicht erforderlich, die Referenz-ABI-Darstellung zu aktualisieren, bevor Sie eine Symbollistenaktualisierung senden, aber dadurch können zusätzliche Pre-Submit-Schritte vermieden werden und die Änderung kann schneller eingereicht werden. In jedem Fall wird sie während der Vorabprüfung geprüft und bei Bedarf aktualisiert.
Mit Symbollisten arbeiten (Android 13)
Android 13 unterstützt sowohl Kleaf als auch Legacy-Build-Skripts. Sie können Symbollisten also entweder wie in den vorherigen Abschnitten oder wie im folgenden Abschnitt beschrieben verwalten.
Mit Symbollisten arbeiten (Android 12 und niedriger)
So verwenden Sie das build_abi.sh
-Tool:
BUILD_CONFIG=path/to/build.config.device build/build_abi.sh --update-symbol-list
In diesem Beispiel muss build.config.device
die folgenden Konfigurationsoptionen enthalten:
vmlinux
Muss Teil der
FILES
-Liste sein. Dazu müssen Siebuild.config.aarch64
einfügen.KMI_SYMBOL_LIST
Muss festgelegt werden und auf die zu aktualisierende KMI-Symbolliste verweisen.
Nachdem Sie die Liste der Gerätesymbole aktualisiert haben, müssen Sie diese Änderungen auch im GKI-Build (common/build.config.gki.aarch64
) berücksichtigen:
Kopieren Sie die aktualisierte Symbolliste in
common/android/abi_gki_aarch64_<device>
.Prüfen Sie, ob
android/abi_gki_aarch64_<device>
inADDITIONAL_KMI_SYMBOL_LISTS
incommon/build.config.gki.aarch64
enthalten ist.