Aby zmniejszyć liczbę symboli i typów, które muszą być stabilne, jądro GKI ma możliwość ograniczenia eksportowanych symboli tylko do tych, które są potrzebne modułom. W przypadku modułów kompilowanych zewnętrznie musisz mieć listę używanych symboli, aby umożliwić ich eksportowanie przez jądro GKI. Na przykład,
symbole używane przez moduły dla
Cuttlefish są przechowywane
w
gki/aarch64/symbols/virtual_device.
Dodawanie celu do generowania listy symboli
Listy symboli są generowane przez cel kernel_abi. Dodaj ten cel do pliku BUILD.bazel urządzenia z tymi opcjami:
namePowinien mieć format
<kernel_build>_abi.kernel_buildPowinien zawierać nazwę celu
kernel_buildurządzenia.
Możesz też użyć tych opcji:
kernel_modulesLista celów dla modułów out-of-tree. Nie należy tu uwzględniać modułów in-tree. Zapoznaj się z artykułem Przygotowywanie modułów in-tree do wyodrębniania symboli.
kmi_symbol_list_add_onlyTa opcja uniemożliwia usuwanie nieużywanych symboli. Usuwanie symboli jest dozwolone tylko w określonych momentach podczas stabilizacji KMI KMI i jest niedozwolone po zamrożeniu.
Jest to też przydatne, gdy używasz tej samej listy symboli na kilku różnych urządzeniach. W ten sposób nie usuniesz symboli używanych przez urządzenie A, ale nie przez urządzenie B.
module_groupingJeśli wartość to
Truelub nie została określona, lista symboli grupuje symbole na podstawie modułów jądra, które odwołują się do symbolu. W przeciwnym razie lista symboli jest posortowaną listą symboli używanych przez wszystkie moduły jądra.
Przykład znajdziesz w
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ą kernel_abi celu w Kleaf.
Przygotowywanie modułów in-tree do wyodrębniania symboli
Aby przygotować moduły in-tree do wyodrębniania symboli, wymień moduły in-tree specyficzne dla dostawcy w atrybucie module_outs celu kernel_build. Przykład znajdziesz w
_VIRT_COMMON_MODULES
i
jego użyciu. Nie uwzględniaj modułów GKI na tej liście.
Skonfiguruj te moduły tak, aby były 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
Przykład znajdziesz w
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 celu kernel_build zdefiniowanego w pliku BUILD.bazel urządzenia. Nazwa listy symboli powinna mieć format
//common:gki/<arch>/symbols/<device>.
Przykład znajdziesz w
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 wstępnej listy symboli
Utwórz pustą listę symboli w common/gki/<arch>/symbols/<device>. W powyższym przykładzie 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
aarch64_additional_kmi_symbol_lists grupy plików, zadeklarowanej w
common/BUILD.bazel.
Zaktualizuj listę symboli urządzenia, aby wypełnić nową listę symboli, i wyślij ją do repozytorium Android Common Kernel.
Aktualizowanie listy symboli urządzenia
Na liście symboli powinny się znajdować wszystkie symbole jądra używane przez moduły w module_outs w kernel_build i kernel_modules w kernel_abi. Możesz to zrobić, uruchamiając cel 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 aktualizacji listy symboli do ACK
Wyślij poprawkę ze zmianą listy symboli do Gerrit Android Common Kernel , aby nowe symbole stały się częścią KMI.
W wiadomości o zatwierdzeniu powinna się znajdować lista dodanych lub usuniętych symboli. W przypadku niewielkiej aktualizacji listy symboli możesz ją utworzyć ręcznie lub użyć
$DIST_DIR/abi_stgdiff/abi.report.short raportu po
zaktualizowaniu referencyjnej reprezentacji 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ć przesłanie zmiany. W każdym przypadku jest ona sprawdzana i w razie potrzeby aktualizowana podczas sprawdzania przed przesłaniem.
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 zgodnie z opisem 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 do zaktualizowania.
Po zaktualizowaniu listy symboli urządzenia musisz też 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 uwzględniony wADDITIONAL_KMI_SYMBOL_LISTSwcommon/build.config.gki.aarch64.