Mit Symbollisten arbeiten

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 Sie build.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> in ADDITIONAL_KMI_SYMBOL_LISTS in common/build.config.gki.aarch64 enthalten ist.

  • Sende Symbollistenaktualisierung an ACK.