Praca z listami symboli

Aby ograniczyć liczbę symboli i typów, które muszą być stabilne, jądro GKI może ograniczyć eksportowane symbole tylko do tych, które są potrzebne modułom. W przypadku skompilowanych zewnętrznie modułów potrzebujesz listy używanych symboli, które pozwalają na ich wyeksportowanie przez jądro GKI. Na przykład symbole używane przez moduły Cuttlefish są przechowywane w android/abi_gki_aarch64_virtual_device.

Dodawanie celu do generowania listy symboli

Listy symboli są generowane przez środowisko docelowe kernel_abi. Dodaj to ustawienie do grupy odbiorców BUILD.bazel, korzystając z tych opcji:

  • name

    Powinna mieć format <kernel_build>_abi.

  • kernel_build

    Powinien zawierać nazwę urządzenia kernel_build docelowego.

Możesz też skorzystać z tych opcji:

  • kernel_modules

    Lista celów dla modułów spoza drzewa. Moduły w drzewie nie powinny być uwzględniane w tym miejscu. Więcej informacji znajdziesz w artykule Przygotowywanie modułów w drzewie 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 nie jest dozwolone po zablokowaniu KMI.

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

  • module_grouping

    Jeśli True lub nie jest określony, lista symboli grupuje symbole na podstawie modułów jądra, które się do nich odwołują. W przeciwnym razie lista symboli to posortowana lista symboli używanych przez wszystkie moduły jądra.

Na przykład: 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ą dotyczącą celu kernel_abi w Kleaf.

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

Aby przygotować moduły w drzewie do wyodrębniania symboli, podaj moduły w drzewie konkretnego dostawcy w atrybucie module_outs celu kernel_build. Przykładem jest _VIRT_COMMON_MODULES i jego użycie. Nie uwzględniaj w tej liście modułów GKI.

Skonfiguruj te moduły jako bez sygnatury, 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: common-modules/virtual-device/virtual_device_core.fragment.

Dodaj listę symboli urządzeń do kompilacji jądra urządzenia

Dodaj atrybut kmi_symbol_list do celu kernel_build zdefiniowanego w urządzeniu BUILD.bazel. Nazwa listy symboli powinna mieć format //common:android/abi_gki_<arch>_<device>. Zobacz common-modules/virtual-device/BUILD.bazel, na przykład:

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,
)

Tworzenie i przesyłanie początkowej listy symboli

Utwórz pustą listę symboli w miejscu common/android/abi_gki_<arch>_<device>. W przykładzie powyżej polecenie będzie wyglądać tak:

touch common/android/abi_gki_aarch64_virtual_device

Dodaj ten plik do additional_kmi_symbol_lists w wersji podstawowej jądra GKI. Na przykład do grupy plików aarch64_additional_kmi_symbol_lists zadeklarowanej w pliku common/BUILD.bazel zostanie dodany komponent //common:android/abi_gki_aarch64_virtual_device.

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

Aktualizowanie listy symboli urządzeń

Na liście symboli powinny się znaleźć wszystkie podstawowe symbole jądra używane przez moduły w module_outskernel_buildkernel_moduleskernel_abi. Można to zrobić, uruchamiając ustawienie docelowe 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

Prześlij poprawkę z zmianami listy symboli do gerritu Android Common Kernel, aby nowe symbole stały się częścią KMI.

Komunikat zatwierdzenia powinien zawierać listę dodanych lub usuniętych symboli. Możesz wpisać tę listę ręcznie w celu dokonania niewielkiej aktualizacji listy symboli lub użyć raportu $DIST_DIR/abi.report.short po zaktualizowaniu referencyjnej reprezentacji interfejsu ABI.

Chociaż zaktualizowanie referencyjnej reprezentacji interfejsu ABI przed wysłaniem aktualizacji listy symboli nie jest wymagana, może to wyeliminować dodatkowe etapy wstępnego przesyłania i przyspieszyć wprowadzenie zmiany. W każdym przypadku przed przesłaniem treści sprawdzamy je i w razie potrzeby aktualizujemy.

Starsze wersje (Android 12 lub starszy)

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 element build.config.device musi zawierać te opcje konfiguracji:

  • vmlinux

    Musi być częścią listy FILES. Aby to zrobić, dodaj tag build.config.aarch64.

  • KMI_SYMBOL_LIST

    Musi być ustawiony i wskazywać listę symboli KMI, którą chcesz zaktualizować.

Po zaktualizowaniu listy symboli urządzeń musisz też uwzględnić 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ędnione w ADDITIONAL_KMI_SYMBOL_LISTS w tabeli common/build.config.gki.aarch64.

  • Aktualizacja listy symboli do opcji POTWIERDZENIE.