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 modułów skompilowanych zewnętrznie musisz mieć listę użytych symboli, aby umożliwić 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 z tymi opcjami:

  • name

    Powinna mieć format <kernel_build>_abi.

  • kernel_build

    Powinien zawierać nazwę urządzenia kernel_build docelowego.

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

  • kernel_modules

    Lista celów dla modułów poza drzewem. Moduły w drzewie nie powinny być uwzględniane w tym miejscu. Zapoznaj się z artykułem 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 możliwe po zamrożeniu 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 odwołują się do symbolu. 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ą referencyjną 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 może być _VIRT_COMMON_MODULES i sposób jego użycia. 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ądzenia 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 //common:android/abi_gki_aarch64_virtual_device jest dodawane 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 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 ukierunkowanie 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 zmianą listy symboli do Android Common Kernel na Gerricie, aby nowe symbole stały się częścią KMI.

Komunikat zatwierdzenia powinien zawierać listę dodanych lub usuniętych symboli. Możesz ją napisać ręcznie, aby zaktualizować małą listę symboli, lub użyć raportu $DIST_DIR/abi.report.short po zaktualizowaniu referencyjnej reprezentacji ABI.

Aktualizacja odwołania do ABI przed wysłaniem aktualizacji listy symboli nie jest wymagana, ale może wyeliminować dodatkowe czynności przed przesłaniem i przyspieszyć proces przesyłania. W każdym przypadku przed przesłaniem treści są one sprawdzane i w razie potrzeby aktualizowane.

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 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 pliku 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.

  • Wyślij zaktualizowaną listę symboli do ACK.