بناء النواة

توضح هذه الصفحة بالتفصيل عملية إنشاء النواة لأجهزة 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 build //common:kernel_aarch64_dist

لإنشاء توزيع، شغِّل:

tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$DIST_DIR

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

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

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

build/build.sh

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

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

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

لإنشاء وحدات "virtual_device"، شغِّل:

tools/bazel build //common-modules/virtual-device:virtual_device_x86_64_dist

لإنشاء توزيع، شغِّل:

tools/bazel run //common-modules/virtual-device:virtual_device_x86_64_dist -- --dist_dir=$DIST_DIR

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

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

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

في Android 12، يتلاقى الحبّار والسمك الذهبي، لذا يتشاركان النواة نفسها: virtual_device. لإنشاء وحدات تلك النواة، استخدم هذا الإصدار التكوين:

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

يوضح هذا المثال تهيئة وحدة (سمك الحبّار والمحاكي):

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

تشغيل النواة (kernel)

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

التضمين في إصدار 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

نواة الفلاش والتشغيل مع Fastboot

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

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

adb reboot bootloader
fastboot boot Image.lz4-dtb

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

تشغيل النواة على حبَّار

يمكنك تشغيل النواة في البنية التي تختارها أجهزة الحبار:

تمهيد جهاز حبَّار بمجموعة معينة من النواة ، شغِّل الأمر cvd start مع عناصر النواة المستهدَفة المعلَمات. يستخدم المثال التالي عناصر النواة لهدف Arm64 من بيان النواة common-android14-6.1.

cvd start \
    -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

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

تخصيص بنية النواة

لتخصيص إصدارات النواة لإصدارات 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 دليل الإخراج الأساسي لإصدار النواة (kernel) OUT_DIR=/path/to/my/out
SKIP_DEFCONFIG تخطّي make defconfig SKIP_DEFCONFIG=1
SKIP_MRPROPER تخطّي make mrproper SKIP_MRPROPER=1

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

في الإصدار 14 من نظام Android والإصدارات الأحدث، يمكنك استخدام أجزاء طريقة defconfig. لتخصيص تهيئات النواة. الرؤية مستندات Kleaf حول أجزاء defconfig

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

في نظام التشغيل Android 13 والإصدارات الأقدم، يمكنك الاطّلاع على ما يلي:

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

اضبط المتغير POST_DEFCONFIG_CMDS على عبارة تكون يتم تقييمه مباشرةً بعد خطوة make defconfig المعتادة تم. استنادًا إلى مصدر ملفات build.config في الإصدار بيئة، يمكن استدعاء الدوال المحددة في build.config كجزء من أوامر post-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، يمكنك الحصول عليه من النظام. كما هو موضح أدناه.

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

لتحديد إصدار الكيرنل (النواة) المستخدم في صورة نظام، قم بتشغيل ما يلي الأمر ضد ملف الكيرنل (kernel):

file kernel

بالنسبة إلى Image.lz4-dtb ملف، شغِّل:

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

إنشاء صورة تمهيد

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

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

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

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

tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$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 الرئيسي، يمكنك تنزيل 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.