إنشاء نواة

توضِّح هذه الصفحة بالتفصيل عملية إنشاء النواة المخصّصة لأجهزة Android. ترشدك هذه التعليمات خلال عملية اختيار المراجع المناسبة وإنشاء النواة وتضمين النتائج في صورة نظام تم إنشاؤها من مشروع Android Open Source Project ‏ (AOSP).

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

تنزيل المصادر وأدوات الإنشاء

بالنسبة إلى الإصدارات الحديثة من نواة Linux، استخدِم repo لتنزيل المصادر ومجموعة الأدوات والنصوص البرمجية لإنشاء البرامج. تتطلّب بعض النوى (مثل نوى Pixel 3) مصادر من مستودعات git متعددة، بينما تتطلّب النوى الأخرى (مثل النوى الشائعة) مصدرًا واحدًا فقط. يضمن استخدام أسلوب repo إعداد دليل مصدر بشكل صحيح.

نزِّل مصادر الفرع المناسب:

mkdir android-kernel && cd android-kernel
repo init -u https://android.googlesource.com/kernel/manifest -b BRANCH
repo sync

للحصول على قائمة بفروع المستودع (BRANCH) التي يمكن استخدامها مع الأمر السابق `repo init`، يُرجى الاطّلاع على فروع نواة Linux وأنظمة الإنشاء الخاصة بها.

للاطّلاع على تفاصيل حول تنزيل نواة نظام التشغيل وتجميعها لأجهزة Pixel، يُرجى الاطّلاع على مقالة إنشاء نواة نظام التشغيل لأجهزة Pixel.

إنشاء النواة

الإنشاء باستخدام Bazel (Kleaf)

أتاح الإصدار 13 من Android إنشاء نواة باستخدام Bazel.

لإنشاء إصدار من نواة GKI لبنية aarch64، يمكنك الاطّلاع على فرع "النواة المشتركة لنظام التشغيل Android" الذي لا يرجع تاريخه إلى ما قبل Android 13، ثم تنفيذ الأمر التالي:

tools/bazel run //common:kernel_aarch64_dist [-- --destdir=$DIST_DIR]

بعد ذلك، يمكن العثور على ملف kernel الثنائي والوحدات والصور المقابلة في الدليل $DIST_DIR. إذا لم يتم تحديد --destdir، اطّلِع على ناتج الأمر لمعرفة موقع العناصر. لمعرفة التفاصيل، يُرجى الرجوع إلى المستندات حول AOSP.

الإنشاء باستخدام build.sh (قديم)

بالنسبة إلى الفروع التي تعمل بالإصدار 12 من نظام التشغيل Android أو الإصدارات الأقدم، أو الفروع التي لا تتضمّن Kleaf:

build/build.sh

يمكن العثور على الملف الثنائي للنواة والوحدات والصورة المقابلة في الدليل out/BRANCH/dist.

إنشاء وحدات المورّد للجهاز الافتراضي

أتاح الإصدار 13 من Android إنشاء نواة باستخدام Bazel (Kleaf)، بدلاً من build.sh.

لإنشاء توزيع لمكوّنات virtual_device، يمكنك تنفيذ:

tools/bazel run //common-modules/virtual-device:virtual_device_x86_64_dist [-- --destdir=$DIST_DIR]

لمزيد من التفاصيل حول إنشاء نواة Android باستخدام Bazel، يُرجى الاطّلاع على. Kleaf - إنشاء نواة Android باستخدام Bazel

لمعرفة تفاصيل عن توافق Kleaf مع المعماريات الفردية، يُرجى الاطّلاع على مقالة توافق Kleaf مع الأجهزة والنواة.

إنشاء وحدات المورّد للجهاز الافتراضي باستخدام build.sh (الإصدار القديم)

في Android 12، تم دمج Cuttlefish وGoldfish، لذا يتشاركان النواة نفسها: virtual_device. لإنشاء وحدات هذا kernel، استخدِم إعدادات الإنشاء التالية:

BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64 build/build.sh

طرح نظام التشغيل Android 11 GKI الذي يفصل بين النواة وصورة النواة التي تديرها Google والوحدات التي يديرها المورّد، والتي يتم إنشاؤها بشكل منفصل.

يعرض هذا المثال إعدادات صورة نواة:

BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh

يعرض هذا المثال إعدادات وحدة (Cuttlefish وEmulator):

BUILD_CONFIG=common-modules/virtual-device/build.config.cuttlefish.x86_64 build/build.sh

تشغيل النواة

هناك عدة طرق لتشغيل نواة مُنشأة مخصّصة. في ما يلي طرق معروفة مناسبة لسيناريوهات التطوير المختلفة.

تضمين الرمز في إصدار صورة Android

انسخ Image.lz4-dtb إلى موقع ملف kernel الثنائي المعني ضمن شجرة AOSP وأعِد إنشاء صورة التشغيل.

بدلاً من ذلك، يمكنك تحديد المتغيّر TARGET_PREBUILT_KERNEL أثناء استخدام make bootimage (أو أي سطر أوامر make آخر ينشئ صورة تمهيد). يتوفّر هذا المتغيّر في جميع الأجهزة، لأنّه يتم إعداده من خلال device/common/populate-new-device.sh. مثلاً:

export TARGET_PREBUILT_KERNEL=DIST_DIR/Image.lz4-dtb

فلاش نواة التشغيل وبدء تشغيلها باستخدام fastboot

تحتوي معظم الأجهزة الحديثة على امتداد لبرنامج الإقلاع لتبسيط عملية إنشاء صورة التشغيل وبدء تشغيلها.

لتشغيل النواة بدون فلاش:

adb reboot bootloader
fastboot boot Image.lz4-dtb

باستخدام هذه الطريقة، لا يتم فلاش النواة في الواقع، ولن تظل مثبّتة بعد إعادة التشغيل.

تشغيل نواة على Cuttlefish

يمكنك تشغيل نواة النظام بالبنية التي تختارها على أجهزة Cuttlefish.

لتشغيل جهاز Cuttlefish باستخدام مجموعة معيّنة من عناصر kernel، شغِّل الأمر cvd create مع عناصر kernel المستهدفة كمَعلمات. يستخدِم المثال التالي للأمر عناصر نظام التشغيل الأساسية لاستهداف arm64 من بيان نظام التشغيل الأساسي common-android14-6.1.

cvd create \
    -kernel_path=/$PATH/$TO/common-android14-6.1/out/android14-6.1/dist/Image \
    -initramfs_path=/$PATH/$TO/common-android14-6.1/out/android14-6.1/dist/initramfs.img

لمزيد من المعلومات، يمكنك الاطّلاع على تطوير نواة على Cuttlefish.

تخصيص إصدار النواة

لتخصيص إصدارات kernel لإصدارات Kleaf، يُرجى الاطّلاع على مستندات Kleaf.

تخصيص عملية إنشاء النواة باستخدام build.sh (الإصدار القديم)

بالنسبة إلى build/build.sh، يمكن أن تتأثر عملية الإنشاء والنتيجة بمتغيّرات البيئة. ومعظمها اختياري، ومن المفترض أن يتضمّن كل فرع من فروع النواة إعدادًا أساسيًا مناسبًا. في ما يلي الإعدادات الأكثر استخدامًا. للحصول على قائمة كاملة (ومحدَّثة)، يُرجى الرجوع إلى build/build.sh.

متغيّر البيئة الوصف مثال
BUILD_CONFIG إنشاء ملف الإعداد من حيث تبدأ عملية إعداد بيئة الإنشاء يجب تحديد الموقع الجغرافي بالنسبة إلى دليل ملف الإصدار الأساسي. الإعداد التلقائي هو build.config.
سمة مطلوبة للنواة الشائعة
BUILD_CONFIG=common/build.config.gki.aarch64
CC إلغاء المُجمِّع المُستخدَم يتم الرجوع إلى المُجمِّع التلقائي الذي حدّده build.config. CC=clang
DIST_DIR الدليل الأساسي لإخراج توزيع النواة DIST_DIR=/path/to/my/dist
OUT_DIR الدليل الأساسي لإخراج تجميعة kernel OUT_DIR=/path/to/my/out
SKIP_DEFCONFIG التخطّي make defconfig SKIP_DEFCONFIG=1
SKIP_MRPROPER التخطّي make mrproper SKIP_MRPROPER=1

إعدادات مخصّصة للنواة لعمليات الإنشاء على الجهاز

في الإصدار 14 من Android والإصدارات الأحدث، يمكنك استخدام أجزاء من ملف defconfig لتخصيص إعدادات kernel. يُرجى الاطّلاع على مستندات Kleaf حول أجزاء ملف defconfig.

إعدادات مخصّصة للنواة لعمليات الإنشاء المحلية مع إعدادات الإنشاء (قديمة)

في Android 13 والإصدارات الأقدم، اتّبِع الخطوات التالية:

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

اضبط المتغيّر POST_DEFCONFIG_CMDS على تعبير يتم تقييمه مباشرةً بعد تنفيذ الخطوة make defconfig المعتادة. عندما يتم نقل ملفات build.config إلى بيئة الإنشاء ، يمكن استدعاء الدوال المحدّدة في build.config كجزء من أوامر ما بعد ملف defconfig.

ومن الأمثلة الشائعة على ذلك إيقاف ميزة تحسين وقت الربط (LTO) لبرامج التشغيل أثناء التطوير. على الرغم من أنّ ميزة LTO مفيدة لأنظمة التشغيل الأساسية التي تم إصدارها، يمكن أن تكون النفقات العامة في وقت الإنشاء كبيرة. يؤدي المقتطف التالي الذي تمت إضافته إلى build.config المحلي إلى إيقاف LTO بشكلٍ دائم عند استخدام build/build.sh.

POST_DEFCONFIG_CMDS="check_defconfig && update_debug_config"
function update_debug_config() {
    ${KERNEL_DIR}/scripts/config --file ${OUT_DIR}/.config \
         -d LTO \
         -d LTO_CLANG \
         -d CFI \
         -d CFI_PERMISSIVE \
         -d CFI_CLANG
    (cd ${OUT_DIR} && \
     make O=${OUT_DIR} $archsubarch CC=${CC} CROSS_COMPILE=${CROSS_COMPILE} olddefconfig)
}

تحديد إصدارات النواة

يمكنك تحديد الإصدار الصحيح الذي تريد إنشاءه من مصدرَين: شجرة AOSP وصورة النظام.

إصدار النواة من شجرة AOSP

تحتوي شجرة AOSP على إصدارات مُنشأة مسبقًا من النواة. يكشف سجلّ git عن الإصدار الصحيح كجزء من رسالة الإضافة:

cd $AOSP/device/VENDOR/NAME
git log --max-count=1

إذا لم يكن إصدار kernel مُدرَجًا في سجلّ git، يمكنك الحصول عليه من ملف ملف ‎system image، كما هو موضّح أدناه.

إصدار النواة من صورة النظام

لتحديد إصدار النواة المستخدَم في صورة نظام، نفِّذ الأمر التالي على ملف النواة:

file kernel

بالنسبة إلى ملفات Image.lz4-dtb، يمكنك تنفيذ ما يلي:

grep -a 'Linux version' Image.lz4-dtb

إنشاء صورة تشغيل

من الممكن إنشاء صورة تمهيد باستخدام بيئة إنشاء النواة.

إنشاء صورة تشغيل للأجهزة التي تستخدم init_boot

بالنسبة إلى الأجهزة التي تحتوي على قسم init_boot، يتم إنشاء صورة التمهيد مع النواة. لم يتم تضمين صورة initramfs في صورة التمهيد.

على سبيل المثال، باستخدام Kleaf، يمكنك إنشاء صورة التمهيد لـ GKI باستخدام:

tools/bazel run //common:kernel_aarch64_dist [-- --destdir=$DIST_DIR]

باستخدام build/build.sh (الإصدار القديم)، يمكنك إنشاء صورة التمهيد لـ GKI باستخدام:

BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh

يمكن العثور على صورة تشغيل GKI في $DIST_DIR.

إنشاء صورة تشغيل للأجهزة التي لا تتضمّن init_boot (قديمة)

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

tools/mkbootimg/unpack_bootimg.py --boot_img=boot-5.4-gz.img
mv $KERNEL_ROOT/out/ramdisk gki-ramdisk.lz4

المجلد المستهدَف هو الدليل في المستوى الأعلى من شجرة النواة (ملف العمل الحالي ).

إذا كنت تُجري عملية التطوير باستخدام AOSP main، يمكنك بدلاً من ذلك تنزيل ramdisk-recovery.img ملف الإنشاء من إصدار aosp_arm64 على ci.android.com واستخدامه كملف ثنائي لنظام التشغيل ramdisk.

عندما يكون لديك ملف ثنائي لشريحة ذاكرة الوصول العشوائي (RAM) ونسخته إلى gki-ramdisk.lz4 في الدليل root لإصدار kernel، يمكنك إنشاء صورة تمهيد من خلال تنفيذ:

BUILD_BOOT_IMG=1 SKIP_VENDOR_BOOT=1 KERNEL_BINARY=Image GKI_RAMDISK_PREBUILT_BINARY=gki-ramdisk.lz4 BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh

إذا كنت تستخدم بنية مستندة إلى x86، استبدِل Image بـ bzImage وaarch64 ب x86_64:

BUILD_BOOT_IMG=1 SKIP_VENDOR_BOOT=1 KERNEL_BINARY=bzImage GKI_RAMDISK_PREBUILT_BINARY=gki-ramdisk.lz4 BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh

يقع هذا الملف في دليل العناصر $KERNEL_ROOT/out/$KERNEL_VERSION/dist.

يمكن العثور على صورة التشغيل في out/<kernel branch>/dist/boot.img.