Praca z listami symboli

Aby zmniejszyć liczbę symboli i typów, które muszą być stabilne, jądro GKI ma możliwość ograniczenia eksportowanych symboli tylko do tych, które są potrzebne modułom. W przypadku modułów kompilowanych zewnętrznie musisz mieć listę używanych symboli, aby umożliwić ich eksportowanie przez jądro GKI. Na przykład, symbole używane przez moduły dla Cuttlefish są przechowywane w gki/aarch64/symbols/virtual_device.

Dodawanie celu do generowania listy symboli

Listy symboli są generowane przez cel kernel_abi. Dodaj ten cel do pliku BUILD.bazel urządzenia z tymi opcjami:

  • name

    Powinien mieć format <kernel_build>_abi.

  • kernel_build

    Powinien zawierać nazwę celu kernel_build urządzenia.

Możesz też użyć tych opcji:

  • kernel_modules

    Lista celów dla modułów out-of-tree. Nie należy tu uwzględniać modułów in-tree. Zapoznaj się z artykułem Przygotowywanie modułów in-tree do wyodrębniania symboli.

  • kmi_symbol_list_add_only

    Ta opcja uniemożliwia usuwanie nieużywanych symboli. Usuwanie symboli jest dozwolone tylko w określonych momentach podczas stabilizacji KMI KMI i jest niedozwolone po zamrożeniu.

    Jest to też przydatne, gdy używasz tej samej listy symboli na kilku różnych urządzeniach. W ten sposób nie usuniesz symboli używanych przez urządzenie A, ale nie przez urządzenie B.

  • module_grouping

    Jeśli wartość to True lub nie została określona, lista symboli grupuje symbole na podstawie modułów jądra, które odwołują się do symbolu. W przeciwnym razie lista symboli jest posortowaną listą symboli używanych przez wszystkie moduły jądra.

Przykład znajdziesz w 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,
)

Zapoznaj się też z dokumentacją referencyjną dotyczącą kernel_abi celu w Kleaf.

Przygotowywanie modułów in-tree do wyodrębniania symboli

Aby przygotować moduły in-tree do wyodrębniania symboli, wymień moduły in-tree specyficzne dla dostawcy w atrybucie module_outs celu kernel_build. Przykład znajdziesz w _VIRT_COMMON_MODULES i jego użyciu. Nie uwzględniaj modułów GKI na tej liście.

Skonfiguruj te moduły tak, aby były niepodpisane, w przeciwnym razie lista symboli może być pusta. Aby to zrobić, dodaj ten wiersz do fragmentów konfiguracji jądra:

# CONFIG_MODULE_SIG_ALL is not set

Przykład znajdziesz w common-modules/virtual-device/virtual_device_core.fragment.

Dodawanie listy symboli urządzenia do kompilacji jądra urządzenia

Dodaj atrybut kmi_symbol_list do celu kernel_build zdefiniowanego w pliku BUILD.bazel urządzenia. Nazwa listy symboli powinna mieć format //common:gki/<arch>/symbols/<device>.

Przykład znajdziesz w 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,
)

Tworzenie i przesyłanie wstępnej listy symboli

Utwórz pustą listę symboli w common/gki/<arch>/symbols/<device>. W powyższym przykładzie polecenie będzie wyglądać tak:

touch common/gki/aarch64/symbols/virtual_device

Dodaj ten plik do additional_kmi_symbol_lists podstawowej kompilacji jądra GKI. Na przykład, //common:gki/aarch64/symbols/virtual_device jest dodawany do aarch64_additional_kmi_symbol_lists grupy plików, zadeklarowanej w common/BUILD.bazel.

Zaktualizuj listę symboli urządzenia, aby wypełnić nową listę symboli, i wyślij ją do repozytorium Android Common Kernel.

Aktualizowanie listy symboli urządzenia

Na liście symboli powinny się znajdować wszystkie symbole jądra używane przez moduły w module_outs w kernel_build i kernel_modules w kernel_abi. Możesz to zrobić, uruchamiając cel kernel_abi z sufiksem _update_symbol_list. Na przykład to polecenie aktualizuje listę symboli dla //common-modules/virtual-device:virtual_device_aarch64:

tools/bazel run //common-modules/virtual-device:virtual_device_aarch64_abi_update_symbol_list

Wysyłanie aktualizacji listy symboli do ACK

Wyślij poprawkę ze zmianą listy symboli do Gerrit Android Common Kernel , aby nowe symbole stały się częścią KMI.

W wiadomości o zatwierdzeniu powinna się znajdować lista dodanych lub usuniętych symboli. W przypadku niewielkiej aktualizacji listy symboli możesz ją utworzyć ręcznie lub użyć $DIST_DIR/abi_stgdiff/abi.report.short raportu po zaktualizowaniu referencyjnej reprezentacji ABI.

Aktualizowanie referencyjnej reprezentacji ABI przed wysłaniem aktualizacji listy symboli nie jest wymagane, ale może wyeliminować dodatkowe kroki przed przesłaniem i przyspieszyć przesłanie zmiany. W każdym przypadku jest ona sprawdzana i w razie potrzeby aktualizowana podczas sprawdzania przed przesłaniem.

Praca z listami symboli (Android 13)

Android 13 obsługuje zarówno Kleaf, jak i starsze skrypty kompilacji, więc możesz zarządzać listami symboli zgodnie z opisem w poprzednich sekcjach lub w sekcji poniżej.

Praca z listami symboli (Android 12 i starsze wersje)

Użyj narzędzia build_abi.sh w ten sposób:

BUILD_CONFIG=path/to/build.config.device build/build_abi.sh --update-symbol-list

W tym przykładzie build.config.device musi zawierać te opcje konfiguracji:

  • vmlinux

    Musi być częścią listy FILES. Możesz to zrobić, dodając build.config.aarch64.

  • KMI_SYMBOL_LIST

    Musi być ustawiona i wskazywać listę symboli KMI do zaktualizowania.

Po zaktualizowaniu listy symboli urządzenia musisz też odzwierciedlić te zmiany w kompilacji GKI (common/build.config.gki.aarch64):

  • Skopiuj zaktualizowaną listę symboli do common/android/abi_gki_aarch64_<device>.

  • Sprawdź, czy android/abi_gki_aarch64_<device> jest uwzględniony w ADDITIONAL_KMI_SYMBOL_LISTS w common/build.config.gki.aarch64.

  • Wyślij aktualizację listy symboli do ACK.