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

لتقليل سطح الرموز والأنواع التي يجب الحفاظ عليها كثابتة، توفر نواة GKI إمكانات لحصر الرموز التي يتم تصديرها على تلك التي مطلوبة للوحدات. بالنسبة إلى الوحدات التي يتم تجميعها خارجيًا، ستحتاج إلى قائمة من الرموز المستخدمة للسماح بتصديرها بواسطة نواة GKI. على سبيل المثال: الرموز التي تستخدمها الوحدات يتم تخزين الحبَّار بوصة 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 التي تشير إلى الرمز. وإلا فإن قائمة الرموز هي قائمة مرتبة من الرموز المستخدمة بواسطة جميع وحدات النواة.

عرض 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-consoles/virtual-device/virtual_device_core.segment على سبيل المثال.

إضافة قائمة رموز أجهزة إلى إصدار النواة للجهاز

أضِف السمة 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

إرسال رمز تصحيح مع تغيير قائمة الرموز إلى شائعة في Android النواة (kernel) جريت لجعل الرموز الجديدة جزءًا من خوارزمية KMI.

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

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

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