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 gki/aarch64/symbols/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 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 niej 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

Na 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:gki/<arch>/symbols/<device>.

common-modules/virtual-device/BUILD.bazel, na przykład:

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 na stronie common/gki/<arch>/symbols/<device>. W przykładzie powyżej polecenie będzie wyglądać tak:

touch common/gki/aarch64/symbols/virtual_device

Dodaj ten plik do additional_kmi_symbol_lists w wersji podstawowej jądra GKI. Na przykład //common:gki/aarch64/symbols/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 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

Przesyłanie aktualizacji listy symboli do ACK

Prześlij poprawkę z zmianą listy symboli do Android Common Kernel w systemie Gerrit, 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_stgdiff/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.

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 w sposób opisany w poprzednich sekcjach lub w następującej sekcji.

Praca z listami symboli (Android 12 i starsze)

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óra ma zostać zaktualizowana.

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.