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 modułów skompilowanych zewnętrznie musisz mieć listę użytych symboli, aby umożliwić ich wyeksportowanie przez jądro GKI. Na przykład symbole używane przez moduły 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 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 poza drzewem. Moduły w drzewie nie powinny być uwzględniane w tym miejscu. Zapoznaj się z artykułem 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 możliwe po zamrożeniu 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 odwołują się do symbolu. 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ą referencyjną 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 może być _VIRT_COMMON_MODULES
i sposób jego użycia. Nie uwzględniaj w niej 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
Na przykład:common-modules/virtual-device/virtual_device_core.fragment
.
Dodaj listę symboli urządzenia 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:gki/<arch>/symbols/<device>
.
common-modules/virtual-device/BUILD.bazel
, na przykład:
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 na stronie common/gki/<arch>/symbols/<device>
. W przykładzie powyżej polecenie będzie wyglądać tak:
touch common/gki/aarch64/symbols/virtual_device
Dodaj ten plik do additional_kmi_symbol_lists
w wersji podstawowej jądra GKI. Na przykład //common:gki/aarch64/symbols/virtual_device
jest dodawane 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 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
Przesyłanie aktualizacji listy symboli do ACK
Prześlij poprawkę z zmianą listy symboli do Android Common Kernel w systemie Gerrit, aby nowe symbole stały się częścią KMI.
Komunikat zatwierdzenia powinien zawierać listę dodanych lub usuniętych symboli. Możesz ją napisać ręcznie, aby zaktualizować małą listę symboli, lub użyć raportu $DIST_DIR/abi_stgdiff/abi.report.short
po zaktualizowaniu referencyjnej reprezentacji ABI.
Aktualizacja odwołania do ABI przed wysłaniem aktualizacji listy symboli nie jest wymagana, ale może wyeliminować dodatkowe czynności przed przesłaniem i przyspieszyć proces przesyłania. W każdym przypadku przed przesłaniem treści są one sprawdzane i w razie potrzeby aktualizowane.
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 w sposób opisany w poprzednich sekcjach lub w następującej sekcji.
Praca z listami symboli (Android 12 i starsze)
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ć, dodajbuild.config.aarch64
.KMI_SYMBOL_LIST
Musi być ustawiony i wskazywać listę symboli KMI, która ma zostać zaktualizowana.
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 pliku
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
.