بناء النواة

توضِّح هذه الصفحة بالتفصيل عملية إنشاء النواة المخصّصة لأجهزة 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 والوحدات التي يديرها المورّد، والتي يتم إنشاؤها بشكل منفصل.

يوضح هذا المثال إعدادات صورة 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

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

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

لمزيد من المعلومات، راجِع تطوير حبات الفطر على الحبار.

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

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

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

بالنسبة إلى build/build.sh، يمكن أن تتأثر عملية التصميم والنتائج بمتغيرات البيئة. معظمها اختيارية ويجب أن يأتي كل فرع من فروع kernel بإعدادات تلقائية مناسبة. في ما يلي الإعدادات الأكثر استخدامًا. للحصول على قائمة كاملة (ومحدَّثة)، يُرجى الرجوع إلى 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 دليل الإخراج الأساسي لإنشاء نواة النظام OUT_DIR=/path/to/my/out
SKIP_DEFCONFIG التخطّي make defconfig SKIP_DEFCONFIG=1
SKIP_MRPROPER تخطّي make mrproper SKIP_MRPROPER=1

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

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

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

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

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

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

ومن الأمثلة الشائعة على ذلك إيقاف ميزة تحسين وقت الربط (LTO) لبرامج التشغيل أثناء التطوير. على الرغم من أنّ ميزة LTO مفيدة لأنظمة التشغيل الأساسية التي تم إصدارها، يمكن أن تكون النفقات العامة في وقت الإنشاء كبيرة. يؤدي المقتطف التالي الذي تمت إضافته إلى build.config المحلي إلى إيقاف ميزة "التوفّر عند الطلب" بشكل دائم عند استخدام 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

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

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

إنشاء صورة لبدء التشغيل للأجهزة التي تستخدم 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 في الدليل الجذري من إصدار 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.