ضبط ميزات kernel على أنّها وحدات GKI

تتناول هذه الصفحة كيفية ضبط ميزة جديدة في kernel كوحدة GKI أو ضبط ميزة kernel مدمجة حالية كوحدة GKI.

ضبط ميزة جديدة كوحدة GKI

  1. بالنسبة إلى الميزة الجديدة، عدِّل gki_defconfig واضبط عنصر ضبط ميزة ملف kernel المطلوب من n إلى m (=m). اضبط هذا الإعداد في كلٍّ من arch/arm64/configs/gki_defconfig وarch/x86/configs/gki_defconfig.

  2. أضِف ملفات KO (.ko) التي تم إنشاؤها للميزة إلى قسم COMMON_GKI_MODULES_LIST في common/modules.bzl. أضِف الملفات بترتيب تصاعدي. إذا لم تكن متأكدًا من جميع الملفات التي تم إنشاؤها، يتعذّر إنشاء الحزمة ويتم إدراج جميع ملفات KO اللازمة لإضافتها إلى القائمة.

  3. بالنسبة إلى Android 14، أضِف المجموعة نفسها من ملفات KO من الخطوة 2، مرتَّبةً بترتيب تصاعدي للبحث الثنائي أثناء التشغيل، إلى common/android/gki_{ARCH}_protected_modules لتحديد الوحدة على أنّها وحدة GKI محمية.

  4. بالنسبة إلى الإصدارات من Android 14 إلى 16، عدِّل قائمة عمليات التصدير لتتضمّن عمليات التصدير التي تمت إضافتها حديثًا في common/android/abi_gki_protected_exports_ARCHITECTURE. على سبيل المثال، لتعديل القائمة، يمكنك تشغيل tools/bazel run //common:kernel_aarch64_abi_update_protected_exports ل aarch64.

  5. تأكَّد من نسخ ملفات KO التي تمت إضافتها حديثًا من الخطوة 2 إلى ملفَي ‎ out/<androidX-Y.Z>/dist/system_dlkm.img و‎ out/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz الخاصَّين بالنواة. يمكن استخدام الوحدات في أرشيف system_dlkm_staging_archive.tar.gz كข้อมูล لإنشاء system_dlkm.img في إصدار المنصة.

  6. أرسِل التغييرات لمراجعتها. وحدات GKI هي ميزة خاصة بالنواة في نظام التشغيل Android فقط، لذا لا يُشترط إرسال تصحيحات تحويل الوحدات إلى الإصدار العلني. ومع ذلك، عليك اتّباع إرشادات أخرى لإرسال تصحيحات "النواة الشائعة لنظام التشغيل Android" (ACK).

ضبط ميزة مضمّنة في النواة على أنّها وحدة GKI

  1. بالنسبة إلى ميزة مضمّنة حالية في kernel، عدِّل gki_defconfig واضبط عنصر إعدادات ميزة kernel المطلوبة من y إلى m (=m). اضبط هذا الإعداد في كل من arch/arm64/configs/gki_defconfig و arch/x86/configs/gki_defconfig.

  2. أضِف ملفات KO (.ko) التي تم إنشاؤها للميزة إلى القسم COMMON_GKI_MODULES_LIST في common/modules.bzl. أضِف الملفات بترتيب تصاعدي. إذا لم تكن متأكدًا من جميع الملفات التي تم إنشاؤها، يتعذّر إنشاء الحزمة ويتم إدراج جميع ملفات KO اللازمة لإضافتها إلى القائمة.

  3. بالنسبة إلى Android 14، أضِف المجموعة نفسها من ملفات KO من الخطوة 2، مرتّبةً بترتيب تصاعدي للبحث الثنائي أثناء التشغيل، إلى common/android/gki_{ARCH}_protected_modules لتحديد الوحدة على أنّها وحدة GKI محمية.

  4. بالنسبة إلى الإصدارات من 14 إلى 16 من نظام التشغيل Android، عدِّل قائمة عمليات التصدير المحمية لتشمل تلك الواردة من الوحدة التي تمت إضافتها حديثًا في ملف common/android/abi_gki_protected_exports_{ARCH} (أو common/gki/{ARCH}/protected_exports لنظام التشغيل Android 16) باستخدام tools/bazel run //common:kernel_aarch64_abi_update_protected_exports بدلاً من aarch64.

  5. تأكَّد من نسخ ملفات KO للوحدات التي تم تحويلها حديثًا من الخطوة 2 إلى out/<androidX-Y.Z>/dist/system_dlkm.img و out/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz في kernel. يمكن استخدام الوحدات في أرشيف system_dlkm_staging_archive.tar.gz كข้อมูล لإنشاء system_dlkm.img في إصدار المنصة.

  6. أرسِل التغييرات لمراجعتها. وحدات GKI هي ميزة خاصة بالنواة في نظام التشغيل Android فقط، لذا لا يُشترط إرسال تصحيحات تحويل الوحدات إلى الإصدار العلني. ومع ذلك، يجب اتّباع الإرشادات الأخرى لإرسال تصحيحات النواة المشتركة لنظام التشغيل Android (ACK).

تحويل وحدة GKI محمية إلى وحدة غير محمية

  1. بالنسبة إلى الإصدار 15 من نظام التشغيل Android والإصدارات الأحدث، أضِف الوحدة التي يتم تحويلها من محمية إلى غير محمية إلى قائمة COMMON_UNPROTECTED_MODULES_LIST فيملف common/modules.bzl.

  2. بالنسبة إلى Android 14، عليك إزالة الوحدة التي يتم تحويلها من محمية إلى غير محمية من قائمة الوحدات المحمية في common/android/gki_protected_modules.

  3. بالنسبة إلى الإصدارات من Android 14 إلى 16، عدِّل قائمة عمليات التصدير المحمية لتمتنع عن استبعاد عمليات التصدير من الوحدة غير المحمية التي تم تحويلها حديثًا فيملف ‎common/android/abi_gki_protected_exports_{ARCH} (أوملف ‎common/gki/{ARCH}/protected_exports لنظام التشغيل Android 16) باستخدام ‎tools/bazel run //common:kernel_aarch64_abi_update_protected_exports بدلاً من ‎aarch64.

  4. أرسِل التغييرات لمراجعتها. وحدات GKI هي ميزة خاصة بالنواة في نظام التشغيل Android فقط، لذا لا يُشترط إرسال تصحيحات تحويل الوحدات إلى الإصدار العلني. ومع ذلك، يجب اتّباع الإرشادات الأخرى لإرسال تصحيحات النواة المشتركة لنظام التشغيل Android (ACK).

دليل سريع لحلّ انتهاكات رموز وحدات GKI

عندما تنتهك الوحدات غير الموقَّعة حماية الرموز المُطبَّقة على وحدات GKI، قد تحدث نوعان من الأخطاء أثناء تحميل الوحدة، ما يؤدي إلى تعذُّر تحميلها.

‫1. وحدة غير موقَّعة تستخدم الرمز المحمي

الخطأ:

module: Protected symbol: some_kernel_function (err -13)

السبب:

ملف module.ko هو وحدة مورّد غير موقَّعة وتحاول حلّ رمز some_kernel_function الذي تم تصديره من وحدة GKI أثناء التحميل، بدون أن يتم إدراجه في قائمة رموز المورّدين.

الحل:

إذا لم تكن module.ko وحدة GKI محمية، سيؤدي تعديل قائمة الرموز إلى حلّ الخطأ عن طريق تضمين some_kernel_function في قائمة رموز المورّدين. يمكنك بدلاً من ذلك استخدام إصدار GKI من module.ko.

‫2- وحدة غير موقَّعة تصدِّر الرمز المحمي

الخطأ:

module: exports protected symbol some_kernel_function

السبب:

إنّ الوحدة التي تُصدِّر some_kernel_function هي وحدة GKI محمية، ومن المرجّح أنّmodule.ko هو إصدار مخصّص غير موقَّع من هذه الوحدة. عندما يحاول module.ko تصدير some_kernel_function، الذي لا يمكن تصديره إلا باستخدام وحدة GKI موقَّعة، يتعذّر التحميل مع ظهور هذه الرسالة.

الحل:

يمكن تصحيح ذلك باستخدام إصدار GKI من الوحدة التي تُصدِر some_kernel_function، إذا كانت الوحدة غير الموقَّعة هي إصدار مخصّص.