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