إصدار GKI

توضح هذه الصفحة نظام إصدار صور Kernel العامة (GKIs). تحتوي صورة Kernel العامة (GKI) على معرف فريد يسمى إصدار kernel. يتكون إصدار kernel من إصدار واجهة وحدة kernel (KMI) والمستوى الفرعي. إصدار kernel خاص بالصورة التي يتم إصدارها، في حين أن إصدار KMI يمثل الواجهة التي تم إنشاء الإصدار منها. يمكن لإصدار KMI دعم إصدارات kernel المتعددة. يرتبط إصدار kernel بإصدار KMI واحد فقط. في الحالة غير المحتملة التي تتطلب تغيير واجهة وحدة kernel، يتم تكرار إنشاء KMI ليعكس التغيير في إصدار KMI.

ملخص المصطلحات

يلخص الجدول التالي المصطلحات المهمة المستخدمة في هذه الصفحة ولتحديثات GKI.

اسم رمز مثال وصف
الافراج عن النواة wxy-zzz-k-suffix 5.4.42-android12-0-فو المعرف الفريد لإصدار GKI. هذه هي القيمة التي يتم إرجاعها بواسطة uname .
نسخة كمي wx-zzz-k 5.4-أندرويد12-0 يصف واجهة وحدة kernel (KMI) بين GKI ووحدات kernel القابلة للتحميل ديناميكيًا (DLKM).
المستوى الفرعي ذ 42 يصف ترتيب إصدار إصدارات kernel ضمن نفس إصدار KMI.

يسرد الجدول التالي المصطلحات الأخرى ذات الصلة كمرجع.

اسم رمز مثال وصف
com.wxy com.wxy 5.4.42

للحصول على تفاصيل، راجع Linux Kernel Makefiles (ابحث عن "KERNELRELEASE").

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

يُشار إلى هذا المتغير باسم kernel_version_tuple في libkver .

يجب ألا يتم تقليل هذا الصف بواسطة أي تحديثات، بما في ذلك OTA أو الخط الرئيسي.

فرع النواة zzz-wx android12-5.4 يُستخدم هذا المصطلح في أنواع فروع النواة الشائعة .
إصدار ث 5 لا يستخدم هذا المصطلح في هذه الوثيقة. يُشار إلى هذا المتغير بالإصدار في libkver .
مستوى التصحيح س 4 لا يستخدم هذا المصطلح في هذه الوثيقة. يُشار إلى هذا المتغير باسم patch_level في libkver .
إصدار أندرويد zzz android12

هذا هو رقم إصدار Android (الحلوى) الذي ترتبط به النواة.

عند مقارنة حقل AndroidRelease ، يتم استخراج الجزء الرقمي من السلسلة للمقارنة.

يجب ألا يتم تقليل رقم إصدار Android بواسطة أي تحديثات، بما في ذلك OTA أو التحديث الرئيسي.

جيل KMI ك 0

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

يبدأ رقم جيل KMI بالرقم 0.

تصميم الإصدار

الافراج عن النواة

تعريف

بالنسبة للأجهزة التي تأتي مع GKI، يتم تعريف إصدار kernel على النحو التالي:

KernelRelease :=
Version.PatchLevel.SubLevel-AndroidRelease-KmiGeneration-suffix
w      .x         .y       -zzz           -k            -something

لمزيد من المعلومات، راجع تحديد إصدار kernel من جهاز .

ما يلي هو مثال لإصدار النواة.

5.4.42-android12-0-00544-ged21d463f856

وصف

إصدار kernel هو المعرف الفريد لإصدار GKI. إذا كان لثنائيات GKI نفس إصدار النواة، فيجب أن تكون متطابقة من حيث البايت.

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

نسخة كمي

تعريف

يتم تعريف إصدار KMI على النحو التالي:

KmiVersion :=
Version.PatchLevel-AndroidRelease-KmiGeneration
w      .x         -zzz           -k

لاحظ أن المستوى الفرعي y ليس جزءًا من إصدار KMI. على سبيل المثال في إصدار Kernel ، إصدار KMI هو:

5.4-android12-0

وصف

يصف إصدار KMI واجهة وحدة kernel (KMI) بين GKI ووحدات kernel القابلة للتحميل ديناميكيًا (DLKM).

إذا كان هناك إصداران من إصدارات kernel لهما نفس إصدار KMI، فإنهما يقومان بتنفيذ نفس واجهة وحدة kernel. إن DLKMs المتوافقة مع أحدهما متوافقة أيضًا مع الآخر.

يجب ألا يتم تقليل إصدار KMI بواسطة أي تحديثات عبر الهواء.

المستوى الفرعي

يصف المستوى الفرعي y ترتيب إصدار إصدارات kernel ضمن نفس إصدار KMI.

بالنسبة لإصدارين من إصدارات kernel لهما نفس إصدار 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 عند استخراج معلومات kernel. وبشكل أكثر رسمية، يتم تحليل إخراج 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++ لتحليل إصدار kernel أو سلسلة إصدار KMI. للحصول على قائمة بواجهات برمجة التطبيقات التي يكشفها libkver، راجع packages/modules/Gki/libkver/include/kver .

عمليات فحص VINTF

بالنسبة لنظام التشغيل Android 11 أو الإصدارات الأقدم، يتم تحديد جزء إصدار Android من إصدار KMI يدويًا في بيان الجهاز بواسطة الشركات المصنعة للأجهزة. لمزيد من التفاصيل، راجع قواعد مطابقة kernel VINTF .

من Android S، يمكن استخراج جزء إصدار Android من إصدار KMI من kernel وإدخاله في بيان الجهاز في وقت الإنشاء.

نظرًا لأن متطلبات تكوين kernel لا تتغير عمومًا، فليست هناك حاجة لتشفير k ضمن مصفوفة التوافق. ومع ذلك، في الحالة غير المحتملة التي تتطلب تغيير متطلبات تكوين kernel، تأكد مما يلي:

  • تتم إزالة المتطلبات المقابلة من مصفوفة التوافق.
  • تمت إضافة اختبارات VTS إضافية للتحقق من المتطلبات الجديدة المشروطة بإنشاء KMI.

إصدار صورة التمهيد في بيانات تعريف OTA

حتى إذا تم تحديث صورة التمهيد من خلال تحديث OTA، فيجب تغليفها بتنسيق حمولة OTA، payload.bin . تقوم حمولة OTA بتشفير حقل version لكل قسم. عندما يتعامل update_engine مع حمولة OTA، فإنه يقارن هذا الحقل لضمان عدم خفض مستوى القسم.

لتجنب الارتباك، يُطلق على حقل version الخاص بقسم التمهيد في البيانات التعريفية لـ OTA اسم boot image version .

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

قبل تحديث OTA، يتحقق عميل OTA من إصدار صورة التمهيد بنفس طريقة أي قسم آخر.