توضّح هذه الصفحة نظام تحديد الإصدارات لـ "صور النواة العامة" (GKI). تحتوي صورة النواة العامة (GKI) على معرّف فريد يُعرف باسم إصدار النواة. يتألف إصدار النواة من إصدار واجهة وحدة النواة (KMI) والمستوى الفرعي. ويكون إصدار النواة خاصًا بصورة الإصدار، بينما يمثّل إصدار KMI الواجهة التي تم إنشاء الإصدار منها. يمكن أن يتوافق إصدار KMI مع عدة إصدارات من النواة. يرتبط إصدار النواة بإصدار واحد فقط من واجهة KMI. في حال حدوث تغيير في واجهة وحدة النواة، يتم تكرار عملية إنشاء واجهة وحدة النواة (KMI) لعكس التغيير في إصدار واجهة وحدة النواة.
ملخّص البنود
يلخّص الجدول التالي المصطلحات المهمة المستخدَمة في هذه الصفحة وفي تحديثات GKI.
الاسم | رمز | مثال | الوصف |
---|---|---|---|
إصدار النواة | w.x.y-zzz-k-suffix | 5.4.42-android12-0-foo | معرّف فريد لإصدار GKI. هذه هي القيمة التي تعرضها الدالة uname . |
إصدار KMI | w.x-zzz-k | 5.4-android12-0 | توضّح هذه الصفحة واجهة وحدة النواة (KMI) بين صورة النواة العامة (GKI) ووحدات النواة القابلة للتحميل بشكل ديناميكي (DLKM). |
المستوى الفرعي | y | 42 | توضّح هذه السمة ترتيب إصدارات النواة ضمن إصدار KMI نفسه. |
يسرد الجدول التالي مصطلحات أخرى ذات صلة كمرجع.
الاسم | رمز | مثال | الوصف |
---|---|---|---|
w.x.y | w.x.y | 5.4.42 |
لمزيد من التفاصيل، يُرجى الاطّلاع على ملفات Makefiles الخاصة بنواة Linux (ابحث عن "KERNELRELEASE"). يتم استخدام w.x.y مباشرةً في جميع أنحاء هذا المستند. يُشار إلى هذا الرقم أيضًا باسم رقم الإصدار المكوّن من ثلاثة أجزاء. قد يؤدي المصطلح المستخدَم في VINTF، وهو إصدار النواة، إلى حدوث لبس مع مصطلحات أخرى، خاصةً w. يُشار إلى هذا المتغيّر باسم kernel_version_tuple في libkver. يجب ألا يتم تقليل هذه المجموعة من خلال أي تحديثات، بما في ذلك تحديثات OTA أو تحديثات الإصدار الرئيسي. |
فرع النواة | zzz-w.x | android12-5.4 | يُستخدَم هذا المصطلح في أنواع فروع النواة الشائعة. |
الإصدار | w | 5 | هذا المصطلح غير مستخدَم في هذا المستند. يُشار إلى هذا المتغيّر باسم version في libkver. |
مستوى التصحيح | x | 4 | هذا المصطلح غير مستخدَم في هذا المستند. يُشار إلى هذا المتغيّر باسم patch_level في libkver. |
إصدار Android | zzz | android12 |
هذا هو رقم إصدار Android (الحلوى) المرتبط بالنواة.
عند مقارنة الحقل يجب ألا يتم خفض رقم إصدار Android من خلال أي تحديثات، بما في ذلك التحديثات عبر الأثير أو تحديثات نظام Android الأساسي. |
إنشاء مؤشرات الأداء الرئيسية | k | 0 |
هذا رقم إضافي تمت إضافته للتعامل مع الأحداث غير المحتملة. إذا كان إصلاح خطأ أمني يتطلّب إجراء تغييرات على واجهة KMI ضمن إصدار Android نفسه، يتم زيادة رقم إصدار واجهة KMI. يبدأ رقم إنشاء KMI بالرقم 0. |
تصميم تحديد الإصدار
إصدار النواة
التعريف
بالنسبة إلى الأجهزة التي يتم شحنها مع GKI، يتم تحديد إصدار النواة على النحو التالي:
KernelRelease :=
Version.PatchLevel.SubLevel-AndroidRelease-KmiGeneration-suffix
w .x .y -zzz -k -something
لمزيد من المعلومات، يُرجى الاطّلاع على تحديد إصدار النواة من جهاز.
في ما يلي مثال على إصدار نواة.
5.4.42-android12-0-00544-ged21d463f856
الوصف
إصدار النواة هو المعرّف الفريد لإصدار GKI. إذا كان هناك ملفان ثنائيان من GKI لهما إصدار النواة نفسه، يجب أن يكونا متطابقَين على مستوى البايت.
يتألف إصدار النواة من إصدار KMI ومستوى فرعي ولاحقة. لأغراض هذا المستند، يتم تجاهل اللاحقة بعد إنشاء KMI.
إصدار KMI
التعريف
يتم تحديد إصدار KMI على النحو التالي:
KmiVersion :=
Version.PatchLevel-AndroidRelease-KmiGeneration
w .x -zzz -k
يُرجى العِلم أنّ المستوى الفرعي y
ليس جزءًا من إصدار KMI. في المثال الوارد في إصدار النواة، يكون إصدار KMI كما يلي:
5.4-android12-0
الوصف
يصف إصدار KMI واجهة وحدة النواة (KMI) بين صورة النواة العامة (GKI) ووحدات النواة القابلة للتحميل بشكل ديناميكي (DLKM).
إذا كان إصداران من النواة يحملان رقم إصدار KMI نفسه، فهذا يعني أنّهما ينفّذان واجهة وحدة النواة نفسها. وتكون مفاتيح DLKM المتوافقة مع أحدهما متوافقة أيضًا مع الآخر.
يجب ألا يتم خفض إصدار KMI من خلال أي تحديثات عبر الأثير (OTA).
المستوى الفرعي
يصف المستوى الفرعي، y
، ترتيب إصدارات النواة ضمن إصدار KMI نفسه.
بالنسبة إلى إصدارَي النواة اللذين يتضمّنان إصدار KMI نفسه ولكن بمستويَين فرعيَّين Y1 وY2 على التوالي:
- إذا كان الإصدار Y1 أقل من أو يساوي الإصدار Y2، يمكن لجهاز يعمل بالإصدار Y1 تلقّي تحديث إلى الإصدار Y2.
- إذا كان Y1 أكبر من Y2، لا يمكن تحديث جهاز يعمل بنظام Y1 إلى Y2.
أي أنّه في حال عدم تغيير إصدار KMI، يجب ألا يتم خفض المستوى الفرعي بأي تحديث عبر الأثير.
تحديد إصدار النواة من جهاز
يمكن العثور على إصدار النواة الكامل من خلال تنفيذ uname -r
أو
uname(2)
باستخدام مقتطف الرمز التالي:
std::string get_kernel_release() {
struct utsname buf;
return uname(&buf) == 0 ? buf.release : "";
}
في ما يلي مثال على الناتج:
5.4.42-android12-0-00544-ged21d463f856
لأغراض هذا المستند، يتم تجاهل أي شيء بعد إنشاء KMI عند استخراج معلومات النواة. بشكل أكثر رسمية، يتم تحليل ناتج uname -r
باستخدام التعبير العادي التالي (بافتراض أنّ zzz يبدأ دائمًا بـ "android"):
^(?P<w>\d+)[.](?P<x>\d+)[.](?P<y>\d+)-(?P<z>android\d+)-(?P<k>\d+).*$
يمكن أن تتضمّن المعلومات التي يتم تجاهلها معلومات مثل رقم الإصدار ci.android.com وعدد حِزم التصحيح التي تم تطبيقها على النواة الأساسية وتجزئة SHA لعملية الإرسال في Git.
libkver
توفر المكتبة libkver واجهة C++ لتحليل إصدار النواة أو سلسلة إصدار KMI. للاطّلاع على قائمة بواجهات برمجة التطبيقات التي تعرضها libkver، يُرجى الرجوع إلى
packages/modules/Gki/libkver/include/kver
.
عمليات التحقّق من VINTF
في نظام التشغيل Android 11 أو الإصدارات الأقدم، يحدّد مصنّعو الأجهزة يدويًا جزء إصدار Android من إصدار KMI في بيان الجهاز. للحصول على التفاصيل، راجِع قواعد مطابقة نواة VINTF.
بدءًا من Android S، يمكن استخراج جزء إصدار Android من إصدار KMI من النواة وإضافته إلى بيان الجهاز في وقت الإنشاء.
بما أنّ متطلبات إعدادات النواة لا تتغيّر بشكل عام، ليس هناك حاجة إلى ترميز k
ضمن مصفوفة التوافق. ومع ذلك، في حال الحاجة إلى تغيير متطلبات إعدادات النواة، يجب التأكّد مما يلي:
- تتم إزالة المتطلبات المقابلة من مصفوفة التوافق.
- تتم إضافة اختبارات VTS إضافية للتحقّق من المتطلبات الجديدة المشروطة بإنشاء KMI.
إصدار صورة التشغيل في البيانات الوصفية للتحديث عبر الهواء
حتى إذا تم تعديل صورة التشغيل من خلال تحديث عبر اتصال لاسلكي، يجب أن يتم تضمينها في تنسيق حمولة التحديث عبر اتصال لاسلكي، payload.bin
. تحتوي حمولة OTA على حقل version
لكل قسم. عندما يتعامل update_engine
مع حمولة OTA،
يقارن هذا الحقل للتأكّد من عدم الرجوع إلى إصدار أقدم من القسم.
لتجنُّب حدوث أي التباس، يُطلق على الحقل version
الخاص بقسم التشغيل في البيانات الوصفية الخاصة بالتحديث عبر الهواء اسم boot image version
.
بما أنّه يتم إنشاء ramdisk دائمًا من البداية، يكفي استخدام الطابع الزمني لـ ramdisk لوصف صورة التمهيد بأكملها. ليست هناك حاجة إلى ترميز إصدار النواة في إصدار صورة التمهيد، إلا إذا كنت ستدمج صورة تمهيد قديمة مع ملف ثنائي جديد للنواة في المستقبل.
قبل إجراء تحديث عبر اتصال لاسلكي، يتحقّق برنامج OTA من إصدار صورة التشغيل بالطريقة نفسها التي يتم بها التحقّق من أي قسم آخر.