نواة البناء

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

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

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

بالنسبة للنوى الحديثة، استخدم 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 للنوى المتاحة من خلال هذه الطريقة.

جهاز المسار الثنائي في شجرة AOSP فروع الريبو
بكسل فولد (فيليكس) الجهاز/جوجل/فيليكس-kernel الروبوت-GS-فيليكس-5.10-android13-qpr3-c
بيكسل تابلت (تانجوربرو) الجهاز/google/tangorpro-kernel android-gs-tangorpro-5.10-android13-qpr3
بكسل 7 (النمر)
بكسل 7 برو (الفهد)
الجهاز/جوجل/pantah-kernel android-gs-pantah-5.10-android13-qpr3
بكسل 6a (بلوجاي) الجهاز/جوجل/بلوجاي-kernel android-gs-bluejay-5.10-android13-qpr3
بكسل 6 (الأوريول)
بكسل 6 برو (غراب أسود)
الجهاز/google/raviole-kernel android-gs-raviole-5.10-android13-qpr3
بكسل 5a (باربيت)
بكسل 5 (ريدفين)
بكسل 4a (5G) (العوسج)
الجهاز/جوجل/ريدبول-kernel android-msm-redbull-4.19-android13-qpr3
بكسل 4a (سمكة الشمس) جهاز/جوجل/sunfish-kernel android-msm-sunfish-4.14-android13-qpr3
بكسل 4 (لهب)
بكسل 4 XL (مرجاني)
جهاز/جوجل/كورال نواة أندرويد-msm-كورال-4.14-android13
بكسل 3a (سارجو)
بكسل 3a XL (بونيتو)
الجهاز/جوجل/bonito-kernel الروبوت-msm-بونيتو-4.9-android12L
بكسل 3 (الخط الأزرق)
بكسل 3 XL (تظليل متقاطع)
الجهاز/google/crosshatch-kernel android-msm-crosshatch-4.9-android12
بكسل 2 (عين رمادية فاتحة اللون)
بكسل 2 XL (تايمن)
الجهاز/جوجل/wahoo-kernel الروبوت-msm-wahoo-4.4-android10-qpr3
بكسل (سمكة أبو شراع)
بكسل XL (مارلين)
الجهاز/جوجل/مارلين-kernel الروبوت-msm-مارلين-3.18-فطيرة-qpr2
Hikey960 الجهاز/لينارو/hikey-kernel هايكي لينارو-android-4.14
هايكي لينارو-android-4.19
مشترك-android12-5.4
مشترك-android13-5.10
بيغل × 15 الجهاز/ti/beagle_x15-kernel omap-beagle-x15-android-4.14
omap-beagle-x15-android-4.19
نواة أندرويد المشتركة لا يوجد مشترك-أندرويد-4.4
مشترك-أندرويد-4.9
مشترك-أندرويد-4.14
مشترك-أندرويد-4.19
مشترك-أندرويد-4.19-مستقر
مشترك-android11-5.4
مشترك-android12-5.4
مشترك-android12-5.10
مشترك-android13-5.10
مشترك-android13-5.15
مشترك-android14-5.15
مشترك-android14-6.1
Common-android-mainline

بناء النواة

البناء مع بازل (كليف)

قدم Android 13 بناء النوى باستخدام Bazel .

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

tools/bazel build //common:kernel_aarch64_dist

لإنشاء توزيعة، قم بتشغيل:

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

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

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

بالنسبة للفروع التي تعمل بنظام Android 12 أو أقل منه، أو الفروع التي لا تحتوي على Kleaf:

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، يتلاقى Cuttlefish وGoldfish، لذا فهما يشتركان في نفس النواة: 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

يوضح هذا المثال تكوين الوحدة النمطية (Cuttlefish و Emulator):

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

دعم Kleaf للأجهزة والنوى

يسرد الجدول التالي دعم Kleaf لنواة الأجهزة الفردية. بالنسبة للأجهزة غير المدرجة، يرجى الاتصال بالشركة المصنعة للجهاز.

جهاز فروع الريبو دعم كليف دعم build/build.sh
نواة أندرويد المشتركة
db845c
الجهاز الظاهري (x86_64، Arm64)
الجهاز الظاهري (i686، الذراع)
روكبي4
مشترك-أندرويد-4.4
مشترك-أندرويد-4.9
مشترك-أندرويد-4.14
مشترك-أندرويد-4.19
مشترك-أندرويد-4.19-مستقر
مشترك-android11-5.4
مشترك-android12-5.4
مشترك-android12-5.10
نواة أندرويد المشتركة مشترك-android13-5.10
مشترك-android13-5.15
✅ (رسمي) ١
نواة أندرويد المشتركة مشترك-android14-5.15
مشترك-android14-6.1
مشترك-android15-6.1
Common-android-mainline
db845c مشترك-android13-5.10
db845c مشترك-android13-5.15 ✅ (رسمي) ١
db845c مشترك-android14-5.15
مشترك-android14-6.1
مشترك-android15-6.1
Common-android-mainline
الجهاز الظاهري (x86_64، Arm64) مشترك-android13-5.10
مشترك-android13-5.15
✅ (رسمي) ١ ⚠️ (غير مصان) ٢
الجهاز الظاهري (x86_64، Arm64) مشترك-android14-5.15
مشترك-android14-6.1
مشترك-android15-6.1
Common-android-mainline
الجهاز الظاهري (i686، الذراع) مشترك-android13-5.10
مشترك-android13-5.15
الجهاز الظاهري (i686، الذراع) مشترك-android14-5.15
مشترك-android14-6.1
مشترك-android15-6.1
Common-android-mainline
روكبي4 مشترك-android13-5.10
مشترك-android13-5.15
روكبي4 مشترك-android14-5.15
مشترك-android14-6.1
مشترك-android15-6.1
Common-android-mainline
Hikey960 هايكي-لينارو-android-4.14
هايكي لينارو-android-4.19
مشترك-android12-5.4
مشترك-android13-5.10
وحدة فيبس140 مشترك-android12-5.10
مشترك-android13-5.10
مشترك-android13-5.15
وحدة فيبس140 مشترك-android14-5.15

1 "الرسمية" تعني أن هذه هي الطريقة الرسمية لبناء النواة، على الرغم من إمكانية استخدام الطريقة البديلة أيضًا لبناء النواة.

2 "غير خاضع للصيانة" يعني أن بناء النواة بهذه الطريقة يجب أن يعمل، ولكن لا يتم اختبار طريقة البناء بشكل مستمر. وقد يتوقف عن البناء في المستقبل. استخدم الطريقة "الرسمية" للبناء بدلاً من ذلك.

تشغيل النواة

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

التضمين في بناء صورة 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 بمجموعة معينة من عناصر kernel ، قم بتشغيل الأمر cvd start مع عناصر kernel المستهدفة كمعلمات. يستخدم أمر المثال التالي عناصر kernel لهدف Arm64 من بيان kernel 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

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

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

لتخصيص إصدارات kernel لإصدارات 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

تكوين kernel مخصص للبنيات المحلية

في نظام التشغيل Android 14 والإصدارات الأحدث، يمكنك استخدام أجزاء إلغاء التكوين لتخصيص تكوينات kernel. راجع وثائق Kleaf حول أجزاء defconfig .

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

في نظام التشغيل 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 على إصدارات kernel مسبقة الصنع. يكشف سجل git عن الإصدار الصحيح كجزء من رسالة الالتزام:

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

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

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

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