هسته‌های مشترک Android

هسته‌های مشترک AOSP (که به‌عنوان هسته‌های مشترک Android یا ACKs نیز شناخته می‌شوند) پایین‌دست هسته‌های kernel.org هستند و شامل وصله‌های موردعلاقه انجمن Android هستند که در هسته‌های اصلی یا هسته‌های پشتیبانی بلندمدت (LTS) ادغام نشده‌اند. این وصله‌ها می‌تواند شامل موارد زیر باشد:

  • انتقال‌های معکوس و انتخاب‌های دقیق از عملکرد بالادستی موردنیاز برای ویژگی‌های Android
  • ویژگی‌هایی که برای دستگاه‌های Android آماده‌اند اما هنوز درحال توسعه در بالادست هستند
  • ویژگی‌های فروشنده/سازنده اصلی محصول که برای سایر شرکای زیست‌بوم مفید است

android-mainline شاخه توسعه اصلی برای ویژگی‌های Android است. هرگاه لینوس توروالدز نسخه یا نسخه نامزد منتشر کند، خط اصلی Linux در android-mainline ادغام می‌شود. قبل‌از سال ۲۰۱۹، هسته‌های مشترک Android با شبیه‌سازی هسته LTS که اخیراً اعلام شده بود و افزودن وصله‌های مختص Android ساخته می‌شدند. این فرایند در سال ۲۰۱۹ تغییر کرد تا هسته مشترک Android جدید از android-mainline منشعب شود. این مدل جدید با دستیابی تدریجی به همان نتیجه، از تلاش قابل‌توجه برای انتقال و آزمایش وصله‌های Android جلوگیری می‌کند. ‫android-mainline تحت آزمایش‌های مداوم قابل‌توجهی قرار می‌گیرد، این مدل از روز انتشارش دارای هسته با کیفیت بالا است.

وقتی LTS جدیدی در بالادست اعلام می‌شود، هسته مشترک مربوطه از android-mainline شاخه‌بندی می‌شود. این به شرکا امکان می‌دهد با ادغام از android-mainline، پروژه‌ای را قبل‌از اعلام نسخه LTS شروع کنند. پس‌از ایجاد شاخه هسته مشترک جدید، شرکا می‌توانند منبع ادغام را به‌طور یکپارچه به شاخه جدید تغییر دهند.

شاخه‌های هسته رایج دیگر به‌طور منظم از هسته LTS مرتبط خود ادغام دریافت می‌کنند. این ادغام‌ها معمولاً بلافاصله پس‌از انتشار نسخه LTS انجام می‌شوند. برای مثال، وقتی Linux 6.1.75 پست شد، در هسته مشترک 6.1 (android14-6.1) ادغام شد. به شرکا اکیداً توصیه می‌شود هسته‌هایشان را به‌روز کنند تا با LTS و رفع اشکال‌های مختص Android به‌روز بمانند.

شاخه هسته ACK KMI

هسته‌های GKI دارای «میانای واحد هسته» پایداری هستند. ‫KMI با نسخه هسته و نسخه پلاتفرم Android به‌طور یکتا شناسایی می‌شود، بنابراین شاخه‌ها با نام‌های ANDROID_RELEASE-KERNEL_VERSION نام‌گذاری می‌شوند. برای مثال، نام هسته GKI نسخه ۶.۱ برای Android 14،‏ android14-6.1 است. برای Android 15، هسته GKI android15-6.6 معرفی شد.

سلسله مراتب هسته مشترک

انشعاب از android-mainline

بالاترین سطح سلسله‌مراتب هسته مشترک در شکل ۱ نشان داده شده است.

درحال ایجاد هسته‌های مشترک از هسته android-mainline

شکل ۱. درحال ایجاد هسته‌های مشترک از هسته android-mainline

توجه داشته باشید که هسته مشترک Android جدید android14-6.1 در سال ۲۰۲۲ از android-mainline منشعب شده است. در سال ۲۰۲۳، وقتی «پشتیبانی بلندمدت» بعدی اعلام شد، android15-6.6 از android-mainline انشعاب یافت.

همان‌طور که در «شکل ۱» نشان داده شده است، هر نسخه هسته می‌تواند پایه دو هسته GKI باشد. برای مثال، دو هسته v5.15 عبارت‌اند از android13-5.15 و android14-5.15، که هر دو هسته‌های ویژگی برای نسخه‌های پلاتفرم مربوطه هستند. این مورد برای نسخه ۵.۱۰ نیز صادق بود؛ android12-5.10 زمانی ایجاد شد که LTS اعلام شد و android13-5.10 در بهار ۲۰۲۱ در نقطه عطف تکمیل ویژگی هسته از android12-5.10 انشعاب یافت تا توسعه ویژگی‌ها برای Android 13 امکان‌پذیر شود. از Android 15 (سال ۲۰۲۴) شروع می‌شود، فقط یک هسته GKI جدید در هر نسخه هسته وجود دارد (هسته android15-6.1 وجود ندارد).

چرخه حیات شعبه ACK KMI

چرخه عمر شاخه ACK KMI در شکل ۲ نشان داده شده است.

چرخه حیات شاخه 6.6 ACK KMI

شکل ۲. ‫۶.۶ چرخه حیات شاخه KMI مربوط به ACK

برای شفاف‌سازی فرایند توسعه و چرخه حیات شاخه، شکل ۲ روی شاخه‌های ACK KMI برای نسخه ۶.۶ تمرکز می‌کند.

هر شاخه ACK KMI از سه مرحله که در شکل ۲ با رنگ‌های مختلف در هر شاخه نشان داده شده است، عبور می‌کند. همان‌طور که نشان داده شده است، LTS صرف‌نظر از مرحله به‌طور منظم ادغام می‌شود.

مرحله توسعه

وقتی شاخه ACK KMI ایجاد می‌شود، وارد فاز توسعه می‌شود (در شکل ۲ با برچسب dev مشخص شده است) و برای مشارکت‌های ویژگی برای نسخه بعدی پلاتفرم Android باز است. در «شکل ۲»، android15-6.6 زمانی ایجاد شد که نسخه ۶.۶ به‌عنوان هسته LTS بالادستی جدید اعلام شد.

مرحله تثبیت

وقتی شاخه ACK KMI به‌عنوان تکمیل ویژگی اعلام می‌شود، وارد فاز تثبیت (در شکل ۲ با برچسب پایدار مشخص شده است) می‌شود. ویژگی‌های شریک و رفع اشکال‌ها همچنان پذیرفته می‌شوند، اما ردیابی KMI برای شناسایی هرگونه تغییری که بر میانای کاربری تأثیر می‌گذارد فعال است. در این مرحله، تغییرات شکننده KMI پذیرفته می‌شود و تعریف KMI در یک آهنگ ازپیش‌تعریف‌شده (معمولاً هر دو هفته یک‌بار) به‌روز می‌شود. برای جزئیات نظارت بر KMI، نمای کلی GKI را ببینید.

مرحله ثابت KMI

قبل‌از اینکه نسخه جدید پلاتفرم به AOSP ارسال شود، شاخه ACK KMI منجمد می‌شود و تا پایان عمر شاخه منجمد باقی می‌ماند. این یعنی هیچ تغییر KMI-breaking پذیرفته نمی‌شود، مگر اینکه مشکل امنیتی جدی‌ای شناسایی شود که بدون تأثیر گذاشتن بر KMI پایدار قابل‌رفع نباشد. برای جلوگیری از خرابی‌های KMI، برخی وصله‌های ادغام‌شده از LTS ممکن است اصلاح یا حذف شوند اگر اصلاح برای دستگاه‌های Android لازم نباشد.

وقتی شاخه ACK KMI مسدود می‌شود، رفع اشکال‌ها و ویژگی‌های شریک را می‌توان پذیرفت به‌شرطی که هسته مشترک KMI موجود خراب نشود. تا زمانی که میاناهای تشکیل‌دهنده KMI فعلی تحت‌تأثیر قرار نگیرند، KMI را می‌توان با نمادهای صادرشده جدید گسترش داد. وقتی میاناهای جدید به KMI اضافه می‌شوند، بلافاصله پایدار می‌شوند و تغییرات آینده نمی‌تواند آن‌ها را خراب کند.

برای مثال، تغییری که فیلدی را به ساختار مورداستفاده هسته مشترک میانای KMI اضافه می‌کند مجاز نیست زیرا تعریف میانجی را تغییر می‌دهد:

struct foo {
  int original_field1;
  int original_field2;
  int new_field;  // Not allowed
};

int do_foo(struct foo &myarg)
{
  do_stuff(myarg);
}
EXPORT_SYMBOL_GPL(do_foo);

اما افزودن تابع جدید مشکلی ندارد:

struct foo2 {
  struct foo orig_foo;
  int new_field;
};

int do_foo2(struct foo2 &myarg)
{
  do_stuff2(myarg);
}
EXPORT_SYMBOL_GPL(do_foo2);

در طول عمر هسته GKI، سازگاری با فضای کاربر حفظ می‌شود تا بتوان از هسته به‌طور ایمن برای نسخه پلاتفرم Android که دستگاه با آن راه‌اندازی شده است استفاده کرد. آزمایش مداوم با نسخه‌های قبلی سازگاری را حفظ می‌کند. بنابراین در «شکل ۲»، از android15-6.6 هسته می‌توان برای دستگاه‌های Android 15 و دستگاه‌های جدیدتر استفاده کرد. ازآنجایی‌که نسخه پلاتفرم Android با نسخه‌های قبلی نیز سازگار است، می‌توان از هسته android14-6.1 برای دستگاه‌های Android 15 هم برای راه‌اندازی و هم برای ارتقا استفاده کرد.

شماره تولید KMI

اگر درطول مرحله تثبیت ادغام LTS یا مشکل امنیتی یا رویداد دیگری پس‌از این اتفاق بیفتد که نیاز به پذیرش وصله تغییر KMI داشته باشد، شماره تولید KMI ثبت‌شده در build.config.common افزایش می‌یابد. نسل فعلی KMI را می‌توان بااستفاده از فرمان uname پیدا کرد:

$ uname -r
6.6.30-android15-6-g86d10b30f51f

عدد بعداز نسخه پخش پلاتفرم نسل KMI است (در این مورد 6).

اگر تولید KMI تغییر کند، هسته با واحدهای فروشنده سازگار نیست که با نسل قبلی KMI مطابقت دارند، بنابراین واحدها باید بازسازی شوند و هم‌زمان با هسته به‌روزرسانی شوند. پس‌از توقف KMI، انتظار می‌رود تغییرات تولید KMI بسیار نادر باشد.

سازگاری بین هسته‌ها

الزامات سازگاری بین هسته‌ها در یک خانواده LTS با شروع هسته‌های جدید GKI تغییر می‌کند.

هسته‌های GKI

هسته‌های GKI سازگاری با نسخه‌های قدیمی‌تر را با همه نسخه‌های پلاتفرم Android که از نسخه هسته پشتیبانی می‌کردند حفظ می‌کنند. علاوه‌براین، نسخه‌های پخش پلاتفرم Android با هسته‌های GKI از نسخه‌های پخش قبلی سازگار با نسخه قدیمی هستند. بنابراین می‌توانید با اطمینان از هسته android14-6.1 که برای Android 14 (2023) توسعه یافته است در دستگاه‌های دارای Android 15 (2024) استفاده کنید. سازگاری ازطریق آزمایش‌های مداوم VTS و CTS هسته‌های GKI با همه نسخه‌های پشتیبانی‌شده تأیید می‌شود.

‫KMI پایدار است تا هسته بتواند بدون نیاز به بازسازی واحدهای هسته در تصویر فروشنده به‌روز شود.

سازگاری KMI بین هسته‌های GKI مختلف حفظ نمی‌شود. بنابراین، برای مثال، یک هسته android14-6.1 را نمی‌توان بدون بازسازی همه واحدها با هسته android15-6.6 جایگزین کرد.

هسته‌های GKI فقط برای نسخه‌های اولیه و بعدی آن‌ها پشتیبانی می‌شوند. این ویژگی‌ها برای نسخه‌های قدیمی‌تر پشتیبانی نمی‌شوند. بنابراین، هسته android15-6.6 برای دستگاه‌های دارای Android 14 (2023) پشتیبانی نمی‌شود.

ماتریس سازگاری

این جدول نسخه‌های هسته پشتیبانی‌شده و آزمایش‌شده با هر نسخه پلاتفرم Android را نشان می‌دهد.

نسخه پخش پلاتفرم Android هسته‌های پشتیبانی‌شده
Android 17 (2026) android17-6.18
android16-6.12
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10 (در Android 17 QPR1 یا بالاتر پشتیبانی نمی‌شود)
android12-5.10 (در Android 17 QPR1 یا بالاتر پشتیبانی نمی‌شود)
‫Android 16‏ (۲۰۲۵) android16-6.12
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
Android 15 (2024) android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
Android 14 (2023) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
‫Android 13 (‏۲۰۲۲) android13-5.15
android13-5.10
android12-5.10
‫Android 12 (2021) android12-5.10

طول عمر پشتیبانی و وصله‌های امنیتی

‫ACKها ادغام‌های LTS از بالادست و رفع اشکال برای کد مختص Android را دریافت می‌کنند. این اصلاحات شامل همه وصله‌های امنیتی هسته است که در اعلامیه‌های امنیتی Android ماهانه مربوط به ACK ذکر شده است.

ممکن است از ACKها برای مدت طولانی‌تری نسبت‌به هسته پایدار بالادستی مربوطه در kernel.org پشتیبانی شود. در این مورد، Google تا تاریخ پایان عمر (EOL) که در این بخش نشان داده شده است پشتیبانی گسترده ارائه می‌دهد. وقتی هسته‌ها به پایان عمر خود می‌رسند، دیگر ازسوی Google پشتیبانی نمی‌شوند و دستگاه‌هایی که از آن‌ها استفاده می‌کنند آسیب‌پذیر درنظر گرفته می‌شوند.

از هسته ۶.۶، طول عمر پشتیبانی برای هسته‌های پایدار ۴ سال است.

این جدول طول عمر ACKهای پشتیبانی‌شده را نشان می‌دهد:

شاخه رسیدگی تاریخ
راه‌اندازی
پشتیبانی
مادام‌العمر
(سال)
EOL
android12-5.10 2020-12-13 6 2027-07-01
android13-5.10 2020-12-13 6 2027-07-01
android13-5.15 2021-10-31 6 2028-07-01
android14-5.15 2021-10-31 6 2028-07-01
android14-6.1 2022-12-11 6 2029-07-01
android15-6.6 2023-10-29 4 2028-07-01
android16-6.12 2024-11-17 4 2029-07-01
android17-6.18 2025-11-30 4 2030-07-01

آزمایش هسته مشترک

هسته‌های مشترک علاوه‌بر آزمایش پایین‌دستی توسط فروشندگان، با چندین سیستم CI آزمایش می‌شوند.

آزمایش KernelCI

آزمایش‌های ساخت و راه‌اندازی KernelCI هر زمان که وصله جدیدی به شاخه هسته مشترک اضافه می‌شود، آغاز می‌شوند. چند صد پیکربندی ساخت در بردهای مختلف آزمایش و راه‌اندازی می‌شوند. نتایج اخیر برای هسته‌های Android را می‌توانید در سایت KernelCL پیدا کنید.

آزمایش پیش‌ارسال و پس‌ارسال Android

از آزمایش‌های پیش‌از ارسال برای جلوگیری از وارد شدن خرابی‌ها به هسته‌های مشترک Android استفاده می‌شود. خلاصه نتیجه آزمایش را می‌توانید در برگه «بررسی‌ها» در تغییر کد در gerrit هسته مشترک Android پیدا کنید.

آزمایش پس‌از ارسال Android روی ساخت‌های منتشرشده جدید در شاخه‌های هسته مشترک Android وقتی وصله‌های جدید در شاخه هسته مشترک Android در ci.android.com تعهد داده می‌شود انجام می‌شود. با وارد کردن aosp_kernel به‌عنوان نام شاخه جزئی در ci.android.com، فهرستی از شاخه‌های هسته با نتایج دردسترس را می‌بینید. برای مثال، نتایج مربوط به android-mainline را می‌توانید در داشبورد ادغام ساخت مداوم Android (Android CI) پیدا کنید. روی ساخت خاصی کلیک کنید تا وضعیت آزمایش را در برگه Test Results پیدا کنید.

آزمایش‌های تعریف‌شده توسط test-mapping با گروه آزمایشی kernel-presubmit در درخت منبع پلاتفرم Android به‌عنوان پیش‌ارسال برای شاخه‌های هسته Android اجرا می‌شوند. برای مثال، پیکربندی زیر در test/vts/tests/kernel_proc_file_api_test/TEST_MAPPING vts_kernel_proc_file_api_test را به‌عنوان آزمون پیش‌از ارسال در ثبت کد هسته مشترک Android فعال می‌کند.

{
  "kernel-presubmit": [
    {
      "name": "vts_kernel_proc_file_api_test"
    }
  ]
}

آزمایش روز صفر

آزمایش 0-day آزمایش وصله‌به‌وصله را روی همه شاخه‌های هسته مشترک Android هنگام اعمال وصله‌های جدید انجام می‌دهد. آزمایش‌های مختلفی برای راه‌اندازی، عملکرد، و کارایی اجرا می‌شود. به گروه عمومی cros-kernel-buildreports بپیوندید.

ماتریس آزمایش

هسته مشترک Android نسخه‌های پخش «پلاتفرم Android» مجموعه‌های آزمون
اصلی 17 16 15 14 13 KernelCI پیش‌ارسال ارسال پست ‫۰ روزه
android-mainline ✅ ❌ ❌ ❌ ❌ ❌ ✅ ✅ ✅ ✅
android17-6.18 ✅ ✅ ❌ ❌ ❌ ❌ ✅ ✅ ✅ ✅
android16-6.12 ✅ ✅ ✅ ❌ ❌ ❌ ✅ ✅ ✅ ✅
android15-6.6 ✅ ✅ ✅ ✅ ❌ ❌ ✅ ✅ ✅ ✅
android14-6.1
android14-5.15
✅ ✅ ✅ ✅ ✅ ❌ ✅ ✅ ✅ ✅
android13-5.15
android13-5.10
✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅
android12-5.10 ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅

همیاری در هسته‌های مشترک Android

به‌طور کلی، توسعه ویژگی باید در Linux اصلی انجام شود و نه در هسته‌های مشترک Android. توسعه بالادستی به‌شدت توصیه می‌شود و پس‌از پذیرفته شدن توسعه در آنجا، می‌توان آن را درصورت نیاز به شاخه ACK خاصی منتقل کرد. تیم هسته Android خوشحال است که از تلاش‌های بالادستی به نفع بوم‌سازگان Android پشتیبانی کند.

وصله‌ها را به Gerrit ارسال کنید و از این رهنمودهای همیاری پیروی کنید.