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_buildtarget.
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 - Truenie 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_MODULES i jego 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_deviceDodaj 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_build i kernel_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_listWysył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-listW 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_LISTSw- common/build.config.gki.aarch64.
