Aby ograniczyć liczbę symboli i typów, które muszą być stabilne, jądro GKI może ograniczyć eksportowane symbole tylko do tych, które są potrzebne modułom. W przypadku skompilowanych zewnętrznie modułów potrzebujesz listy używanych symboli, które pozwalają na ich wyeksportowanie przez jądro GKI. Na przykład symbole używane przez moduły Cuttlefish są przechowywane w android/abi_gki_aarch64_virtual_device
.
Dodawanie celu do generowania listy symboli
Listy symboli są generowane przez środowisko docelowe kernel_abi
. Dodaj to ustawienie do grupy odbiorców BUILD.bazel
, korzystając z tych opcji:
name
Powinna mieć format
<kernel_build>_abi
.kernel_build
Powinien zawierać nazwę urządzenia
kernel_build
docelowego.
Możesz też skorzystać z tych opcji:
kernel_modules
Lista celów dla modułów spoza drzewa. Moduły w drzewie nie powinny być uwzględniane w tym miejscu. Więcej informacji znajdziesz w artykule Przygotowywanie modułów w drzewie 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 nie jest dozwolone po zablokowaniu KMI.
Jest to przydatne, gdy używasz tej samej listy symboli na różnych urządzeniach. W ten sposób nie usunie symboli używanych przez urządzenie A, ale nie przez urządzenie B.
module_grouping
Jeśli
True
lub nie jest określony, lista symboli grupuje symbole na podstawie modułów jądra, które się do nich odwołują. W przeciwnym razie lista symboli to posortowana lista symboli używanych przez wszystkie moduły jądra.
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,
)
Zapoznaj się też z dokumentacją dotyczącą celu kernel_abi
w Kleaf.
Przygotowanie modułów w drzewie do wyodrębniania symboli
Aby przygotować moduły w drzewie do wyodrębniania symboli, podaj moduły w drzewie konkretnego dostawcy w atrybucie module_outs
celu kernel_build
. Przykładem jest _VIRT_COMMON_MODULES
i jego użycie. Nie uwzględniaj w tej liście modułów GKI.
Skonfiguruj te moduły jako bez sygnatury, 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: 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,
)
Tworzenie i przesyłanie początkowej listy symboli
Utwórz pustą listę symboli w miejscu common/android/abi_gki_<arch>_<device>
. W przykładzie powyżej polecenie będzie wyglądać tak:
touch common/android/abi_gki_aarch64_virtual_device
Dodaj ten plik do additional_kmi_symbol_lists
w wersji podstawowej jądra GKI. Na przykład do grupy plików aarch64_additional_kmi_symbol_lists
zadeklarowanej w pliku common/BUILD.bazel zostanie dodany komponent //common:android/abi_gki_aarch64_virtual_device
.
Zaktualizuj listę symboli urządzenia, aby wypełnić nową listę symboli i przesłać ją do repozytorium Android Common Kernel.
Aktualizowanie listy symboli urządzeń
Na liście symboli powinny się znaleźć wszystkie podstawowe symbole jądra używane przez moduły w module_outs
w kernel_build
i kernel_modules
w kernel_abi
. Można to zrobić, uruchamiając ustawienie docelowe 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 aktualizacji listy symboli do ACK
Prześlij poprawkę z zmianami listy symboli do gerritu Android Common Kernel, aby nowe symbole stały się częścią KMI.
Komunikat zatwierdzenia powinien zawierać listę dodanych lub usuniętych symboli. Możesz wpisać tę listę ręcznie w celu dokonania niewielkiej aktualizacji listy symboli lub użyć raportu $DIST_DIR/abi.report.short
po zaktualizowaniu referencyjnej reprezentacji interfejsu ABI.
Chociaż zaktualizowanie referencyjnej reprezentacji interfejsu ABI przed wysłaniem aktualizacji listy symboli nie jest wymagana, może to wyeliminować dodatkowe etapy wstępnego przesyłania i przyspieszyć wprowadzenie zmiany. W każdym przypadku przed przesłaniem treści sprawdzamy je i w razie potrzeby aktualizujemy.
Starsze wersje (Android 12 lub starszy)
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 element build.config.device
musi zawierać te opcje konfiguracji:
vmlinux
Musi być częścią listy
FILES
. Aby to zrobić, dodaj tagbuild.config.aarch64
.KMI_SYMBOL_LIST
Musi być ustawiony i wskazywać listę symboli KMI, którą chcesz zaktualizować.
Po zaktualizowaniu listy symboli urządzeń musisz też uwzględnić 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ędnione wADDITIONAL_KMI_SYMBOL_LISTS
w tabelicommon/build.config.gki.aarch64
.