العمل مع قوائم الرموز

لتقليل مساحة الرموز والأنواع التي يجب الحفاظ على ثباتها، تتوفّر في نواة 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 .

    يكون هذا الخيار مفيدًا أيضًا عند استخدام قائمة الرموز نفسها لأجهزة مختلفة متعدّدة. بهذه الطريقة، لن تتم إزالة الرموز المستخدَمة من قِبل الجهاز "أ" ولكن ليس من قِبل الجهاز "ب".

  • 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.

عدِّل قائمة رموز الجهاز لملء قائمة الرموز الجديدة و أرسِلها إلى مستودع Android Common Kernel.

تعديل قائمة رموز الجهاز

يجب تضمين جميع رموز النواة الأساسية المستخدَمة من قِبل الوحدات في 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

أرسِل تصحيحًا يتضمّن تغيير قائمة الرموز إلى Android Common Kernel gerrit لجعل الرموز الجديدة جزءًا من واجهة KMI.

يجب أن تتضمّن رسالة الالتزام قائمة بالرموز المُضافة أو المُزالة. يمكنك كتابة هذه القائمة يدويًا لتعديل قائمة رموز صغيرة أو استخدام $DIST_DIR/abi_stgdiff/abi.report.short التقرير بعد تعديل تمثيل واجهة ABI المرجعية.

على الرغم من أنّه ليس مطلوبًا تعديل تمثيل واجهة ABI المرجعية قبل إرسال تعديل قائمة الرموز، قد يؤدي ذلك إلى إزالة خطوات التحقق المسبق الإضافية وجعل التغيير جاهزًا للإرسال بشكل أسرع. في أي حال، يتم التحقق من ذلك وتعديله إذا لزم الأمر أثناء التحقق المسبق.

التعامل مع قوائم الرموز (Android 13)

يتوافق Android 13 مع كل من Kleaf ونصوص التجميع القديمة، لذا يمكنك إدارة قوائم الرموز إما كما هو موضّح في الأقسام السابقة أو كما هو موضّح في القسم التالي.

التعامل مع قوائم الرموز (Android 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.

  • أرسِل تعديل قائمة الرموز إلى ACK.