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_build
target.
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
True
nie 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_device
Dodaj 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_list
Wysył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-list
W tym przykładzie build.config.device
musi zawierać te opcje konfiguracji:
vmlinux
Musi być częścią listy
FILES
. Możesz to zrobić, dodającbuild.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 wADDITIONAL_KMI_SYMBOL_LISTS
wcommon/build.config.gki.aarch64
.