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:
namePowinien mieć format
<kernel_build>_abi.kernel_buildPowinna zawierać nazwę urządzenia
kernel_buildtarget.
Możesz też skorzystać z tych opcji:
kernel_modulesLista 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_onlyTa 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_groupingJeś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:
vmlinuxMusi być częścią listy
FILES. Możesz to zrobić, dodającbuild.config.aarch64.KMI_SYMBOL_LISTMusi 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 wADDITIONAL_KMI_SYMBOL_LISTSwcommon/build.config.gki.aarch64.