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

للحدّ من عدد الرموز والأنواع التي يجب الحفاظ على ثباتها، تتضمّن نواة GKI إمكانات لحصر الرموز التي يتم تصديرها على تلك التي تحتاج إليها الوحدات فقط. بالنسبة إلى الوحدات التي تم تجميعها خارجيًا، يجب أن تتضمّن قائمة بالرموز المستخدَمة للسماح بتصديرها من خلال نواة GKI. على سبيل المثال، يتم تخزين الرموز التي تستخدمها الوحدات النمطية في Cuttlefish في gki/aarch64/symbols/virtual_device.

إضافة هدف لإنشاء قائمة الرموز

يتم إنشاء قوائم الرموز بواسطة الهدف kernel_abi. أضِف هذا الهدف إلى الجهاز BUILD.bazel باستخدام الخيارات التالية:

  • name

    يجب أن يكون بالتنسيق <kernel_build>_abi.

  • kernel_build

    يجب أن يحتوي على اسم الجهاز المستهدف kernel_build.

يمكنك أيضًا استخدام الخيارات التالية:

  • kernel_modules

    قائمة بأهداف الوحدات الخارجة عن الشجرة يجب عدم تضمين وحدات In-tree هنا. يُرجى الرجوع إلى إعداد الوحدات النمطية المضمّنة لاستخراج الرموز.

  • 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 المشتركة في Gerrit لجعل الرموز الجديدة جزءًا من واجهة KMI.

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

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

العمل باستخدام قوائم الرموز (Android 13)

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

العمل باستخدام قوائم الرموز (الإصدار 12 من نظام التشغيل Android والإصدارات الأقدم)

استخدِم أداة 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