برای کاهش سطح نمادها و انواعی که باید ثابت نگه داشته شوند، هسته GKI قابلیت محدود کردن نمادهای صادر شده را فقط به موارد مورد نیاز ماژول ها دارد. برای ماژولهای کامپایلشده خارجی، باید فهرستی از نمادهای استفاده شده داشته باشید تا به آنها اجازه داده شود توسط هسته GKI صادر شوند. به عنوان مثال، نمادهای استفاده شده توسط ماژول ها برای Cuttlefish در android/abi_gki_aarch64_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
target در 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:android/abi_gki_<arch>_<device>
باشد. به عنوان مثال به common-modules/virtual-device/BUILD.bazel مراجعه کنید:
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,
)
یک لیست نماد اولیه ایجاد و ارسال کنید
یک لیست نماد خالی در common/android/abi_gki_<arch>_<device>
ایجاد کنید. برای مثال بالا دستور به صورت زیر خواهد بود:
touch common/android/abi_gki_aarch64_virtual_device
این فایل را به additional_kmi_symbol_lists
ساخت هسته پایه GKI اضافه کنید. به عنوان مثال، //common:android/abi_gki_aarch64_virtual_device
به گروه فایل aarch64_additional_kmi_symbol_lists
اضافه میشود که در common/BUILD.bazel اعلام شده است.
لیست نمادهای دستگاه را برای پر کردن لیست نمادهای جدید به روز کنید و آن را به مخزن هسته مشترک Android ارسال کنید.
لیست نماد دستگاه را به روز کنید
تمام نمادهای هسته هسته مورد استفاده ماژول ها در 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 ارسال کنید
یک وصله با تغییر لیست نمادها به Gerrit Android Common Kernel ارسال کنید تا نمادهای جدید بخشی از KMI باشند.
پیام commit باید شامل لیستی از نمادهای اضافه یا حذف شده باشد. میتوانید این فهرست را بهصورت دستی برای بهروزرسانی فهرست نمادهای کوچک بنویسید یا از گزارش $DIST_DIR/abi.report.short
پس از بهروزرسانی نمایش ABI مرجع استفاده کنید.
در حالی که بهروزرسانی نمایندگی ABI مرجع قبل از ارسال بهروزرسانی فهرست نمادها لازم نیست، ممکن است مراحل اضافی پیشارسال را حذف کرده و تغییرات را برای ارسال سریعتر آماده کند. در هر صورت در حین ارسال اولیه بررسی و در صورت لزوم به روز می شود.
نسخه های قدیمی تر (اندروید 12 و پایین تر)
از ابزار 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
موجود باشد.
برای کاهش سطح نمادها و انواعی که باید ثابت نگه داشته شوند، هسته GKI قابلیت محدود کردن نمادهای صادر شده را فقط به موارد مورد نیاز ماژول ها دارد. برای ماژولهای کامپایلشده خارجی، باید فهرستی از نمادهای استفاده شده داشته باشید تا به آنها اجازه داده شود توسط هسته GKI صادر شوند. به عنوان مثال، نمادهای استفاده شده توسط ماژول ها برای Cuttlefish در android/abi_gki_aarch64_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
target در 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:android/abi_gki_<arch>_<device>
باشد. به عنوان مثال به common-modules/virtual-device/BUILD.bazel مراجعه کنید:
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,
)
یک لیست نماد اولیه ایجاد و ارسال کنید
یک لیست نماد خالی در common/android/abi_gki_<arch>_<device>
ایجاد کنید. برای مثال بالا دستور به صورت زیر خواهد بود:
touch common/android/abi_gki_aarch64_virtual_device
این فایل را به additional_kmi_symbol_lists
ساخت هسته پایه GKI اضافه کنید. به عنوان مثال، //common:android/abi_gki_aarch64_virtual_device
به گروه فایل aarch64_additional_kmi_symbol_lists
اضافه میشود که در common/BUILD.bazel اعلام شده است.
لیست نمادهای دستگاه را برای پر کردن لیست نمادهای جدید به روز کنید و آن را به مخزن هسته مشترک Android ارسال کنید.
لیست نماد دستگاه را به روز کنید
تمام نمادهای هسته هسته مورد استفاده ماژول ها در 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 ارسال کنید
یک وصله با تغییر لیست نمادها به Gerrit Android Common Kernel ارسال کنید تا نمادهای جدید بخشی از KMI باشند.
پیام commit باید شامل لیستی از نمادهای اضافه یا حذف شده باشد. میتوانید این فهرست را بهصورت دستی برای بهروزرسانی فهرست نمادهای کوچک بنویسید یا از گزارش $DIST_DIR/abi.report.short
پس از بهروزرسانی نمایش ABI مرجع استفاده کنید.
در حالی که بهروزرسانی نمایندگی ABI مرجع قبل از ارسال بهروزرسانی فهرست نمادها لازم نیست، ممکن است مراحل اضافی پیشارسال را حذف کرده و تغییرات را برای ارسال سریعتر آماده کند. در هر صورت در حین ارسال اولیه بررسی و در صورت لزوم به روز می شود.
نسخه های قدیمی تر (اندروید 12 و پایین تر)
از ابزار 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
موجود باشد.