Aby zmniejszyć powierzchnię symboli i typów, które muszą być utrzymywane jako stabilne, jądro GKI posiada funkcję ograniczającą 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 umożliwić ich eksport przez jądro GKI. Na przykład symbole używane przez moduły mątwy są przechowywane w android/abi_gki_aarch64_virtual_device
.
Dodaj cel do generowania listy symboli
Listy symboli są generowane przez cel kernel_abi
. Dodaj ten cel do urządzenia BUILD.bazel
z następującymi opcjami:
name
Powinien być w formacie
<kernel_build>_abi
.kernel_build
Powinien zawierać nazwę urządzenia docelowego
kernel_build
.
Możesz także skorzystać z następujących opcji:
kernel_modules
Lista celów dla modułów spoza drzewa . Moduły w drzewie nie powinny być tutaj uwzględniane. Zobacz Przygotowanie modułów w drzewie do ekstrakcji symboli .
kmi_symbol_list_add_only
Opcja ta zapobiega usuwaniu nieużywanych symboli. Usuwanie symboli jest dozwolone tylko w określonych momentach podczas stabilizacji KMI i nie jest dozwolone po zamrożeniu KMI.
Jest to również przydatne, gdy używasz tej samej listy symboli dla wielu różnych urządzeń. W ten sposób nie usunie symboli używanych przez urządzenie A, ale nie urządzenie B.
module_grouping
Jeśli ma
True
lub nie jest określona, lista symboli będzie grupować symbole na podstawie modułów jądra, które odwołują się do symbolu. W przeciwnym razie lista symboli będzie po prostu posortowaną listą symboli używanych przez wszystkie moduły jądra.
Zobacz 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,
)
Zobacz także dokumentację referencyjną dotyczącą celu kernel_abi
w Kleaf.
Przygotuj moduły w drzewie do ekstrakcji symboli
Aby przygotować moduły w drzewie do ekstrakcji symboli, wypisz moduły w drzewie specyficzne dla dostawcy w atrybucie module_outs
celu kernel_build
. Zobacz przykład _VIRT_COMMON_MODULES
i jego użycie . Nie umieszczaj na tej liście modułów GKI.
Skonfiguruj te moduły tak, aby były unsigned , w przeciwnym razie lista symboli może być pusta. Aby to zrobić, dodaj tę linię 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 .
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,
)
Utwórz i prześlij wstępną listę symboli
Utwórz pustą listę symboli pod common/android/abi_gki_<arch>_<device>
. W powyższym przykładzie polecenie wyglądałoby następująco:
touch common/android/abi_gki_aarch64_virtual_device
Dodaj ten plik do additional_kmi_symbol_lists
podstawowej kompilacji jądra GKI. Na przykład //common:android/abi_gki_aarch64_virtual_device
jest dodawany do grupy plików aarch64_additional_kmi_symbol_lists
, zadeklarowanej w common/BUILD.bazel .
Zaktualizuj listę symboli urządzeń , aby wypełnić nową listę symboli i wyślij ją do repozytorium wspólnego jądra systemu Android.
Zaktualizuj listę symboli urządzeń
Wszystkie podstawowe symbole jądra używane przez moduły w module_outs
z kernel_build
i kernel_modules
z kernel_abi
powinny zostać uwzględnione na liście symboli. Można to zrobić, uruchamiając cel kernel_abi
z przyrostkiem _update_symbol_list
. Na przykład następujące 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
Wyślij aktualizację listy symboli do ACK
Wyślij łatkę ze zmianą listy symboli do gerrit Common Kernel Androida , aby nowe symbole stały się częścią KMI.
Komunikat zatwierdzenia powinien zawierać listę dodanych lub usuniętych symboli. Możesz napisać tę listę ręcznie w celu aktualizacji małej listy symboli lub użyć raportu $DIST_DIR/abi.report.short
po aktualizacji referencyjnej reprezentacji ABI .
Chociaż aktualizacja referencyjnej reprezentacji ABI przed wysłaniem aktualizacji listy symboli nie jest wymagana, może wyeliminować dodatkowe etapy przed przesłaniem i sprawić, że zmiana będzie gotowa do szybszego przesłania. W każdym przypadku zostanie on sprawdzony i w razie potrzeby zaktualizowany podczas wstępnego składania wniosku.
Starsze wersje (Android 12 i starsze)
Użyj narzędzia build_abi.sh
w następujący 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ć następujące opcje konfiguracyjne:
vmlinux
Musi znajdować się na liście
FILES
. Można to zrobić, włączającbuild.config.aarch64
.KMI_SYMBOL_LIST
Aby zaktualizować, należy ustawić i wskazać listę symboli KMI.
Po zaktualizowaniu listy symboli urządzeń musisz także 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 zawarty wADDITIONAL_KMI_SYMBOL_LISTS
wcommon/build.config.gki.aarch64
.