إنشاء نواة

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

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

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

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

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

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

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

إنشاء النواة

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

في Android 13، تم تقديم ميزة إنشاء النوى باستخدام Bazel.

لإنشاء حزمة توزيع لنواة GKI لبنية aarch64، عليك سحب فرع من Android Common Kernel لا يكون أقدم من Android 13 و ثم شغِّل الأمر التالي:

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

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

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

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

build/build.sh

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

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

في Android 13، تم تقديم ميزة إنشاء النوى باستخدام 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. لإنشاء وحدات هذه النواة، استخدِم إعداد الإنشاء هذا:

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 والمحاكي):

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

تشغيل النواة

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

التضمين في عملية إنشاء صورة Android

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

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

export TARGET_PREBUILT_KERNEL=DIST_DIR/Image.lz4-dtb

تثبيت ذاكرة ROM ونوى التشغيل باستخدام Fastboot

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

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

adb reboot bootloader
fastboot boot Image.lz4-dtb

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

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

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

لتشغيل جهاز Cuttlefish باستخدام مجموعة معيّنة من عناصر النواة، شغِّل الأمر cvd create مع عناصر النواة المستهدَفة كمعلَمات. يستخدم مثال الأمر التالي عناصر النواة لهدف 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.

تخصيص عملية إنشاء النواة

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

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

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

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

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

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

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

في Android 13 والإصدارات الأقدم، يُرجى الاطّلاع على ما يلي.

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

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

أحد الأمثلة الشائعة هو إيقاف ميزة تحسين وقت الربط (LTO) لنِوى crosshatch أثناء التطوير. في حين أنّ ميزة 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

إذا لم يكن إصدار النواة مدرَجًا في سجلّ git، يمكنك الحصول عليه من صورة النظام، كما هو موضّح أدناه.

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

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

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، تحتاج إلى ملف ثنائي لـ ramdisk، يمكنك الحصول عليه من خلال تنزيل صورة تشغيل GKI وفك ضغطها. ستعمل أي صورة تشغيل GKI من إصدار Android المرتبط.

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

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

إذا كنت تطوّر باستخدام أحدث فرع من إصدار مشروع Android المفتوح المصدر (AOSP)، يمكنك بدلاً من ذلك تنزيل ramdisk-recovery.img إصدار من إصدار aosp_arm64 على ci.android.com واستخدامه كبرنامج ثنائي لـ ramdisk.

عند توفّر ملف ثنائي لـ ramdisk ونسخه إلى gki-ramdisk.lz4 في دليل جذر إنشاء النواة، يمكنك إنشاء صورة تشغيل من خلال تنفيذ:

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.