Mit Symbollisten arbeiten

Um die Oberfläche von Symbolen und Typen zu reduzieren, die als stabil gehalten werden müssen, hat der GKI-Kernel die Möglichkeit, exportierte Symbole auf diejenigen zu 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 android/abi_gki_aarch64_virtual_device gespeichert.

Ziel für die Generierung der Symbolliste hinzufügen

Symbollisten werden vom kernel_abi-Ziel generiert. Fügen Sie das Ziel dem Gerät BUILD.bazel mit den folgenden Optionen hinzu:

  • name

    Er sollte das Format <kernel_build>_abi haben.

  • kernel_build

    Muss den Namen des Gerätes enthalten, das kernel_build als Ziel hat.

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 Symbolextraktion 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 KMI-Stabilisierung zulässig und nicht, wenn die 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 nichts angegeben ist, werden Symbole in der Symbolliste nach den Kernelmodulen gruppiert, die auf das Symbol verweisen. Andernfalls ist die Symbolliste eine sortierte Liste der Symbole, die von allen Kernelmodulen verwendet werden.

Weitere Informationen finden Sie unter common-modules/virtual-device/BUILD.bazel. Beispiel:

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 Symbolextraktion vorbereiten

Wenn Sie In-Tree-Module für die Symbolextraktion vorbereiten möchten, listen Sie Anbieterspezifische In-Tree-Module in einem module_outs-Attribut des kernel_build-Ziels auf. Ein Beispiel ist _VIRT_COMMON_MODULES und seine Verwendung. GKI-Module dürfen nicht in diese Liste aufgenommen werden.

Konfigurieren Sie diese Module als nicht signiert. Andernfalls ist die Symbolliste möglicherweise leer. Fügen Sie dazu folgende Zeile in die Kernel-Konfigurationsfragmente ein:

# CONFIG_MODULE_SIG_ALL is not set

Weitere Informationen finden Sie unter common-modules/virtual-device/virtual_device_core.fragment.

Dem Kernel-Build des Geräts eine Gerätesymbolliste hinzufügen

Fügen Sie dem kernel_build-Ziel, das im Gerät BUILD.bazel definiert ist, das Attribut kmi_symbol_list hinzu. Der Name der Symbolliste muss das Format //common:android/abi_gki_<arch>_<device> haben. Siehe common-modules/virtual-device/BUILD.bazel. Beispiel:

kernel_build(
    name = "virtual_device_aarch64",
    base_kernel = "//common:kernel_aarch64",
    kmi_symbol_list = "//common:android/abi_gki_aarch64_virtual_device",
    ...
    module_outs = _VIRT_COMMON_MODULES + _VIRT_AARCH64_MODULES,
)

Eine anfängliche Symbolliste erstellen und einreichen

Erstellen Sie unter common/android/abi_gki_<arch>_<device> eine leere Symbolliste. Für das Beispiel oben lautet der Befehl:

touch common/android/abi_gki_aarch64_virtual_device

Fügen Sie diese Datei additional_kmi_symbol_lists des GKI-Kernel-Builds hinzu. Beispiel: //common:android/abi_gki_aarch64_virtual_device wird der Dateigruppe aarch64_additional_kmi_symbol_lists hinzugefügt, die in common/BUILD.bazel deklariert ist.

Aktualisieren Sie die Gerätesymbolliste, um die neue Symbolliste zu füllen, und senden Sie sie an das Android Common Kernel-Repository.

Liste der Gerätesymbole 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

Aktualisierung der Symbolliste an ACK senden

Senden Sie einen Patch mit der Änderung der Symbolliste an das Android Common Kernel-gerrit, um die neuen Symbole Teil des KMI zu machen.

Die Commit-Nachricht sollte eine Liste der hinzugefügten oder entfernten Symbole enthalten. Sie können diese Liste entweder manuell erstellen, wenn Sie nur wenige Symbole aktualisieren möchten, oder den Bericht $DIST_DIR/abi.report.short 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. Dadurch können jedoch zusätzliche Schritte vor dem Einreichen vermieden und die Änderung schneller eingereicht werden. In jedem Fall wird sie vor dem Einreichen geprüft und bei Bedarf aktualisiert.

Ältere Versionen (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 können Sie build.config.aarch64 verwenden.

  • KMI_SYMBOL_LIST

    Muss festgelegt 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.

  • Aktualisierung der Symbolliste an ACK senden