Praca z listami symboli

Aby zmniejszyć liczbę symboli i typów, które muszą być utrzymywane jako stabilne, jądro GKI ma funkcje ograniczające eksportowane symbole tylko do tych, które są potrzebne modułom. W przypadku modułów skompilowanych zewnętrznie musisz mieć listę używanych symboli, aby można było je wyeksportować przez jądro GKI. Na przykład symbole używane przez moduły na potrzeby Cuttlefish są przechowywane w gki/aarch64/symbols/virtual_device.

Dodawanie celu do generowania listy symboli

Listy symboli są generowane przez środowisko docelowe kernel_abi. Dodaj ten cel do urządzenia BUILD.bazel, korzystając z tych opcji:

  • name

    Powinien mieć format <kernel_build>_abi.

  • kernel_build

    Powinna zawierać nazwę urządzenia kernel_build target.

Możesz też skorzystać z tych opcji:

  • kernel_modules

    Lista celów dla modułów zewnętrznych. Nie należy tu uwzględniać modułów wbudowanych. Więcej informacji znajdziesz w artykule Przygotowywanie modułów wbudowanych do wyodrębniania symboli.

  • kmi_symbol_list_add_only

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

    Jest to przydatne również wtedy, gdy używasz tej samej listy symboli na wielu różnych urządzeniach. Dzięki temu nie usuniesz symboli używanych przez urządzenie A, ale nie przez urządzenie B.

  • module_grouping

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

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

Zobacz też dokumentację dotyczącą kernel_abi w Kleaf.

Przygotowywanie modułów w drzewie do wyodrębniania symboli

Aby przygotować moduły w drzewie do wyodrębniania symboli, umieść listę modułów w drzewie specyficznych dla dostawcy w atrybucie module_outs elementu docelowego kernel_build. Przykład znajdziesz w sekcji _VIRT_COMMON_MODULESjego użycie. Nie uwzględniaj na tej liście modułów GKI.

Skonfiguruj te moduły jako 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

Zobacz na przykład 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 elementu docelowego kernel_build zdefiniowanego w BUILD.bazel urządzenia. Nazwa listy symboli powinna mieć format //common:gki/<arch>/symbols/<device>.

Zobacz na przykład: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 początkowej listy symboli

Utwórz pustą listę symboli w miejscu common/gki/<arch>/symbols/<device>. W przypadku powyższego przykładu 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 grupy plików aarch64_additional_kmi_symbol_lists zadeklarowanej w pliku common/BUILD.bazel.

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

Aktualizowanie listy symboli urządzeń

Wszystkie podstawowe symbole jądra używane przez moduły w module_outs kernel_buildkernel_modules kernel_abi powinny być uwzględnione na liście symboli. Możesz to zrobić, uruchamiając 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 do ACK aktualizacji listy symboli

Wyślij poprawkę ze zmianami na liście symboli do Android Common Kernel w Gerrit, aby nowe symbole stały się częścią interfejsu KMI.

Wiadomość o zatwierdzeniu powinna zawierać listę dodanych lub usuniętych symboli. Możesz napisać tę listę ręcznie, jeśli chcesz zaktualizować małą listę symboli, lub użyć $DIST_DIR/abi_stgdiff/abi.report.short raportu po zaktualizowaniu reprezentacji referencyjnego interfejsu 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ć przygotowanie zmiany do przesłania. W każdym przypadku jest on sprawdzany i w razie potrzeby aktualizowany podczas przesyłania.

Praca z listami symboli (Android 13)

Android 13 obsługuje skrypty kompilacji Kleaf i starsze, więc listami symboli możesz zarządzać w sposób opisany 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, która ma zostać zaktualizowana.

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

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

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

  • Wysyłanie aktualizacji listy symboli do ACK