إنشاء نواة

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

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

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

مع النواة الأخيرة، يمكنك استخدام repo. تنزيل المصادر وسلسلة الأدوات وإنشاء النصوص البرمجية تتطلّب بعض النواة (مثل نواة Pixel 3) مصادر من مصادر متعددة. بينما تتطلب المستودعات الأخرى (على سبيل المثال، النواة الشائعة) مستودعًا واحدًا المصدر. يضمن استخدام أسلوب 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

إنشاء النواة

Build with Bazel (Kleaf)

طرح Android 13 نواة تصميم باستخدام Bazel

لإنشاء توزيع لنواة GKI لبنية aarch64، اطلع على فرع Kernel مشترك في Android 13 على الأقل ثم قم بتشغيل الأمر التالي:

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

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

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

للفروع التي تعمل بالإصدار 12 من نظام التشغيل Android أو الإصدارات الأقدم منه الفروع التي لا تحتوي على كليف:

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. لإنشاء وحدات هذا kernel، استخدِم إعدادات الإنشاء التالية:

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

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

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

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 باستخدام مجموعة معيّنة من عناصر 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

لمزيد من المعلومات، يُرجى مراجعة تطوير حبات الحبوب على الحبار

تخصيص إصدار kernel

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

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

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

متغيّر البيئة الوصف مثال
BUILD_CONFIG إنشاء ملف إعداد يمكنك من خلاله إعداد بيئة الإصدار. يجب تحديد الموقع الجغرافي بالنسبة إلى جذر Repo الدليل. وتكون القيمة التلقائية هي 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

ضبط نواة مخصصة للإصدارات المحلية

في الإصدار 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)
}

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

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

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

تحتوي شجرة AOSP على إصدارات نواة مسبقة الإنشاء. أطلِق العنان لقدراتك يكشف السجل عن النسخة الصحيحة كجزء من رسالة التنفيذ:

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

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

إذا كنت تُجري عملية التطوير باستخدام AOSP main، يمكنك بدلاً من ذلك تنزيل 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.