برای کاهش سطح نمادها و انواعی که باید پایدار نگه داشته شوند، هسته GKI قابلیتهایی دارد تا نمادهای صادر شده را فقط به آنهایی که توسط ماژولها مورد نیاز هستند محدود کند. برای ماژولهای کامپایل شده خارجی، باید لیستی از نمادهای استفاده شده داشته باشید تا بتوانید آنها را توسط هسته GKI صادر کنید. به عنوان مثال، نمادهای مورد استفاده توسط ماژولها برای Cuttlefish در gki/aarch64/symbols/virtual_device ذخیره میشوند.
یک هدف برای تولید لیست نمادها اضافه کنید
فهرست نمادها توسط هدف kernel_abi تولید میشوند. این هدف را با گزینههای زیر به BUILD.bazel دستگاه اضافه کنید:
nameباید به فرمت
<kernel_build>_abiباشد.kernel_buildباید حاوی نام دستگاه هدف
kernel_buildباشد.
همچنین میتوانید از گزینههای زیر استفاده کنید:
kernel_modulesفهرست اهداف ماژولهای خارج از درخت . ماژولهای درون درختی نباید در اینجا گنجانده شوند. به بخش آمادهسازی ماژولهای درون درختی برای استخراج نماد مراجعه کنید.
kmi_symbol_list_add_onlyاین گزینه از حذف نمادهای استفاده نشده جلوگیری میکند. حذف نماد فقط در زمانهای خاصی در طول تثبیت KMI مجاز است و پس از ثابت شدن KMI مجاز نیست.
این همچنین زمانی مفید است که از یک لیست نماد برای چندین دستگاه مختلف استفاده میکنید. به این ترتیب نمادهای استفاده شده توسط دستگاه A حذف نمیشوند اما نمادهای دستگاه B حذف نمیشوند.
module_groupingاگر
Trueیا نامشخص باشد، آنگاه فهرست نمادها، نمادها را بر اساس ماژولهای هسته که به آن نماد ارجاع میدهند، گروهبندی میکند. در غیر این صورت، فهرست نمادها، فهرستی مرتبشده از نمادهای مورد استفاده توسط همه ماژولهای هسته است.
برای مثال به 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,
)
همچنین به مستندات مرجع در مورد هدف kernel_abi در Kleaf مراجعه کنید.
آمادهسازی ماژولهای دروندرختی برای استخراج نماد
برای آمادهسازی ماژولهای دروندرختی برای استخراج نماد، ماژولهای دروندرختی مختص فروشنده را در ویژگی module_outs از هدف kernel_build فهرست کنید. برای مثال به _VIRT_COMMON_MODULES و کاربرد آن مراجعه کنید. ماژولهای GKI را در این فهرست لحاظ نکنید.
این ماژولها را طوری پیکربندی کنید که بدون علامت باشند، در غیر این صورت لیست نمادها ممکن است خالی باشد. برای انجام این کار، این خط را به قطعات پیکربندی هسته خود اضافه کنید:
# CONFIG_MODULE_SIG_ALL is not set
برای مثال به common-modules/virtual-device/virtual_device_core.fragment مراجعه کنید.
لیست نمادهای دستگاه را به ساختار هسته دستگاه اضافه کنید
ویژگی kmi_symbol_list به هدف kernel_build تعریف شده در فایل BUILD.bazel دستگاه اضافه کنید. نام لیست نمادها باید به فرمت //common:gki/<arch>/symbols/<device> باشد.
برای مثال به 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,
)
ایجاد و ارسال یک لیست نماد اولیه
یک لیست نماد خالی در common/gki/<arch>/symbols/<device> ایجاد کنید. برای مثال بالا، دستور به صورت زیر خواهد بود:
touch common/gki/aarch64/symbols/virtual_device این فایل را به additional_kmi_symbol_lists از ساختار هسته پایه GKI اضافه کنید. برای مثال، //common:gki/aarch64/symbols/virtual_device به گروه فایل aarch64_additional_kmi_symbol_lists که در common/BUILD.bazel تعریف شده است، اضافه میشود.
فهرست نمادهای دستگاه را بهروزرسانی کنید تا فهرست نمادهای جدید پر شود و آن را به مخزن هسته مشترک اندروید ارسال کنید.
بهروزرسانی فهرست نمادهای دستگاه
تمام نمادهای هسته هسته که توسط ماژولها در module_outs از kernel_build و kernel_modules از kernel_abi استفاده میشوند، باید در لیست نمادها گنجانده شوند. این کار را میتوان با اجرای هدف kernel_abi با پسوند _update_symbol_list انجام داد. به عنوان مثال، دستور زیر لیست نمادها را برای //common-modules/virtual-device:virtual_device_aarch64 بهروزرسانی میکند:
tools/bazel run //common-modules/virtual-device:virtual_device_aarch64_abi_update_symbol_listارسال بهروزرسانی فهرست نمادها به ACK
یک وصله حاوی تغییر فهرست نمادها به هسته مشترک اندروید ارسال کنید تا نمادهای جدید بخشی از KMI شوند.
پیام کامیت باید شامل فهرستی از نمادهای اضافه یا حذف شده باشد. میتوانید این فهرست را برای بهروزرسانی فهرست نمادهای کوچک به صورت دستی بنویسید یا پس از بهروزرسانی نمایش مرجع ABI $DIST_DIR/abi_stgdiff/abi.report.short report استفاده کنید.
اگرچه بهروزرسانی نمایش مرجع ABI قبل از ارسال بهروزرسانی لیست نمادها الزامی نیست، اما میتواند مراحل اضافی پیشارسال را حذف کرده و تغییر را سریعتر برای ارسال آماده کند. در هر صورت، در صورت لزوم، در طول پیشارسال بررسی و بهروزرسانی میشود.
کار با فهرست نمادها (اندروید ۱۳)
اندروید ۱۳ از هر دو اسکریپت Kleaf و legacy build پشتیبانی میکند، بنابراین میتوانید لیستهای نماد را یا همانطور که در بخشهای قبلی توضیح داده شده یا همانطور که در بخش بعدی توضیح داده شده است، مدیریت کنید.
کار با فهرست نمادها (اندروید ۱۲ و پایینتر)
از ابزار build_abi.sh به صورت زیر استفاده کنید:
BUILD_CONFIG=path/to/build.config.device build/build_abi.sh --update-symbol-list در این مثال، build.config.device باید شامل این گزینههای پیکربندی باشد:
vmlinuxباید بخشی از لیست
FILESباشد. این کار را میتوان با اضافه کردنbuild.config.aarch64انجام داد.KMI_SYMBOL_LISTبرای بهروزرسانی باید تنظیم و به فهرست نمادهای KMI اشاره شود.
پس از بهروزرسانی فهرست نمادهای دستگاه، باید این تغییرات را در ساختار GKI ( common/build.config.gki.aarch64 ) نیز اعمال کنید:
لیست نمادهای بهروزرسانیشده را در
common/android/abi_gki_aarch64_<device>کپی کنید.بررسی کنید که
android/abi_gki_aarch64_<device>درADDITIONAL_KMI_SYMBOL_LISTSدرcommon/build.config.gki.aarch64گنجانده شده باشد.