كيف تعمل مع قوائم الرموز

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

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

  • module_grouping

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

راجع 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 في هذه القائمة.

قم بتكوين هذه الوحدات لتكون غير موقعة ، وإلا فقد تكون قائمة الرموز فارغة. للقيام بذلك، أضف هذا السطر إلى أجزاء تكوين kernel الخاصة بك:

# 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 الخاصة ببناء kernel الأساسي لـ GKI. على سبيل المثال، تتم إضافة //common:android/abi_gki_aarch64_virtual_device إلى مجموعة ملفات aarch64_additional_kmi_symbol_lists ، المُعلن عنها في common/BUILD.bazel .

قم بتحديث قائمة رموز الجهاز لملء قائمة الرموز الجديدة وإرسالها إلى مستودع Android Common Kernel.

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

يجب تضمين جميع رموز 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.report.short بعد تحديث تمثيل ABI المرجعي .

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

الإصدارات الأقدم (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 .