إصدار GKI

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

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

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

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

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

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

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

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

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

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

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

هذا هو رقم إصدار 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 من جهاز .

فيما يلي مثال على إصدار kernel.

5.4.42-android12-0-00544-ged21d463f856

وصف

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

يتكون إصدار kernel من إصدار KMI ومستوى فرعي ولاحقة. لأغراض هذا المستند ، يتم تجاهل اللاحقة بعد إنشاء 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 بواسطة أي تحديثات OTA.

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

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

بالنسبة لإصدارين من kernel لهما نفس إصدار KMI لكن لهما المستوى الفرعي Y1 و Y2 على التوالي:

  • إذا كانت Y1 أقل من Y2 أو تساويها ، فيمكن للجهاز الذي يعمل بنظام Y1 أن يتلقى تحديثًا إلى Y2.
  • إذا كانت Y1 أكبر من Y2 ، فلا يمكن تحديث الجهاز الذي يعمل على Y1 إلى Y2.

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

تحديد إصدار kernel من جهاز

يمكن العثور على إصدار kernel الكامل عن طريق تنفيذ 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 باستخدام regex التالي (بافتراض أن 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 يدويًا في بيان الجهاز بواسطة الشركات المصنعة للجهاز. للحصول على التفاصيل ، راجع قواعد مطابقة VINTF kernel .

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

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

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

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

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

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

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

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