نحوه کار با لیست نمادها

برای کاهش سطح نمادها و انواعی که باید ثابت نگه داشته شوند، هسته 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 ):