Jak pracować z listami symboli

Aby zmniejszyć powierzchnię symboli i typów, które muszą być utrzymywane jako stabilne, jądro GKI posiada funkcję ograniczającą 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 umożliwić ich eksport przez jądro GKI. Na przykład symbole używane przez moduły mątwy są przechowywane w android/abi_gki_aarch64_virtual_device .

Dodaj cel do generowania listy symboli

Listy symboli są generowane przez cel kernel_abi . Dodaj ten cel do urządzenia BUILD.bazel z następującymi opcjami:

  • name

    Powinien być w formacie <kernel_build>_abi .

  • kernel_build

    Powinien zawierać nazwę urządzenia docelowego kernel_build .

Możesz także skorzystać z następujących opcji:

  • kernel_modules

    Lista celów dla modułów spoza drzewa . Moduły w drzewie nie powinny być tutaj uwzględniane. Zobacz Przygotowanie modułów w drzewie do ekstrakcji symboli .

  • kmi_symbol_list_add_only

    Opcja ta zapobiega usuwaniu nieużywanych symboli. Usuwanie symboli jest dozwolone tylko w określonych momentach podczas stabilizacji KMI i nie jest dozwolone po zamrożeniu KMI.

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

  • module_grouping

    Jeśli ma True lub nie jest określona, ​​lista symboli będzie grupować symbole na podstawie modułów jądra, które odwołują się do symbolu. W przeciwnym razie lista symboli będzie po prostu posortowaną listą symboli używanych przez wszystkie moduły jądra.

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

Zobacz także dokumentację referencyjną dotyczącą celu kernel_abi w Kleaf.

Przygotuj moduły w drzewie do ekstrakcji symboli

Aby przygotować moduły w drzewie do ekstrakcji symboli, wypisz moduły w drzewie specyficzne dla dostawcy w atrybucie module_outs celu kernel_build . Zobacz przykład _VIRT_COMMON_MODULES i jego użycie . Nie umieszczaj na tej liście modułów GKI.

Skonfiguruj te moduły tak, aby były unsigned , w przeciwnym razie lista symboli może być pusta. Aby to zrobić, dodaj tę linię 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 .

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

Utwórz i prześlij wstępną listę symboli

Utwórz pustą listę symboli pod common/android/abi_gki_<arch>_<device> . W powyższym przykładzie polecenie wyglądałoby następująco:

touch common/android/abi_gki_aarch64_virtual_device

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

Zaktualizuj listę symboli urządzeń , aby wypełnić nową listę symboli i wyślij ją do repozytorium wspólnego jądra systemu Android.

Zaktualizuj listę symboli urządzeń

Wszystkie podstawowe symbole jądra używane przez moduły w module_outs z kernel_build i kernel_modules z kernel_abi powinny zostać uwzględnione na liście symboli. Można to zrobić, uruchamiając cel kernel_abi z przyrostkiem _update_symbol_list . Na przykład następujące 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

Wyślij aktualizację listy symboli do ACK

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

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

Chociaż aktualizacja referencyjnej reprezentacji ABI przed wysłaniem aktualizacji listy symboli nie jest wymagana, może wyeliminować dodatkowe etapy przed przesłaniem i sprawić, że zmiana będzie gotowa do szybszego przesłania. W każdym przypadku zostanie on sprawdzony i w razie potrzeby zaktualizowany podczas wstępnego składania wniosku.

Starsze wersje (Android 12 i starsze)

Użyj narzędzia build_abi.sh w następujący 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ć następujące opcje konfiguracyjne:

  • vmlinux

    Musi znajdować się na liście FILES . Można to zrobić, włączając build.config.aarch64 .

  • KMI_SYMBOL_LIST

    Aby zaktualizować, należy ustawić i wskazać listę symboli KMI.

Po zaktualizowaniu listy symboli urządzeń musisz także 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 zawarty w ADDITIONAL_KMI_SYMBOL_LISTS w common/build.config.gki.aarch64 .

  • Wyślij aktualizację listy symboli do ACK .