نواة البناء

تنظيم صفحاتك في مجموعات يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.

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

يمكنك الحصول على مصادر kernel أحدث باستخدام 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 فروع الريبو
Pixel 6a (بلوجاي) device / google / bluejay-kernel android-gs-bluejay-5.10-android13.0-android
Pixel 6 (أوريول)
Pixel 6 Pro (غراب)
device / google / raviole-kernel android-gs-raviole-5.10-android13.0-android
Pixel 5a (باربيت) device / google / barbet-kernel android-msm-barbet-4.19-android13.0-mod.apk
Pixel 5 (ذو زعنفة حمراء)
Pixel 4a (5G) (برامبل)
device / google / redbull-kernel android-msm-redbull-4.19-android13.0-android13.0-mod.apk
بكسل 4 أ (سمكة الشمس) device / google / sunfish-kernel android-msm-sunfish-4.14-android13.0-android-msm-sunfish-4.14-android13.0 "
بكسل 4 (لهب)
Pixel 4 XL (مرجاني)
device / google / coral-kernel android-msm-coral-4.14-android13.0.0-mod.apk
Pixel 3a (سارجو)
Pixel 3a XL (بونيتو)
device / google / bonito-kernel android-msm-bonito-4.9-android12L
Pixel 3 (أزرق أزرق)
Pixel 3 XL (التظليل المتقاطع)
device / google / crosshatch-kernel android-msm-crosshatch-4.9-android12
بكسل 2 (العين رمادية فاتحة اللون)
Pixel 2 XL (تايمن)
device / google / wahoo-kernel android-msm-wahoo-4.4-android10-qpr3
بكسل (سمكة ابوشراع)
Pixel XL (مارلين)
device / google / marlin-kernel android-msm-marlin-3.18-pie-qpr2.0.0-mod.apk
هيكي 960 الجهاز / لينارو / نواة هيكي hikey-linaro-android-4.14.0.0 تحديث
hikey-linaro-android-4.19.0 تحديث
عام android12-5.4
بيجل x15 الجهاز / ti / beagle_x15-kernel omap-beagle-x15-android-4.14.0 تحديث
omap-beagle-x15-android-4.19.0 تحديث
نواة Android المشتركة غير متاح عام-أندرويد-4.4
عام-android-4.9
عام-أندرويد 4.14.0
عام-أندرويد 4.19.0
مشترك-أندرويد-4.19-مستقر
عام-android11-5.4
عام android12-5.4
عام-android12-5.10
عام-android13-5.10
عام android13-5.15
مشترك-android-mainline

بناء النواة

ثم قم ببناء النواة بهذا:

build/build.sh

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

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

قدم Android 13 نواة البناء مع Bazel ، لتحل محل build/build.sh .

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

tools/bazel build //common:kernel_aarch64_dist

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

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

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

بناء وحدات GKI

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

يوضح هذا المثال تكوين صورة kernel:

BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh

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

BUILD_CONFIG=common-modules/virtual-device/build.config.cuttlefish.x86_64 build/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 13 نواة البناء باستخدام Bazel (Kleaf) ، لتحل محل build.sh .

لإنشاء الوحدات النمطية virtual_device ، قم بتشغيل:

tools/bazel build //common-modules:virtual_device_x86_64_dist

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

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

لمزيد من التفاصيل حول Kleaf - بناء النوى باستخدام Bazel - ، راجع الوثائق الموجودة على AOSP .

تشغيل النواة

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

التضمين في بناء صورة Android

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

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

export TARGET_PREBUILT_KERNEL=DIST_DIR/Image.lz4-dtb

امض وتمهيد الحبات باستخدام fastboot

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

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

adb reboot bootloader
fastboot boot Image.lz4-dtb

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

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

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

متغيرات البيئة وصف مثال
BUILD_CONFIG إنشاء ملف التكوين من حيث تقوم بتهيئة بيئة البناء. يجب تحديد الموقع بالنسبة إلى دليل جذر الريبو. افتراضات إلى build.config .
إلزامي للنواة المشتركة.
BUILD_CONFIG=common/build.config.gki.aarch64
CC تجاوز مترجم لاستخدامها. العودة إلى المترجم الافتراضي المحدد بواسطة build.config . CC=clang
DIST_DIR دليل الإخراج الأساسي لتوزيع kernel. 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 بانتظام ، على سبيل المثال ، عند العمل على ميزة ، أو إذا كنت بحاجة إلى خيار لتعيينه لأغراض التطوير ، فيمكنك تحقيق هذه المرونة من خلال الحفاظ على تعديل محلي أو نسخة من تكوين الإنشاء.

اضبط المتغير 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)
}

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

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

نسخة النواة من شجرة AOSP

تحتوي شجرة AOSP على إصدارات نواة تم إنشاؤها مسبقًا. يكشف سجل git عن الإصدار الصحيح كجزء من رسالة التنفيذ:

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

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

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

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

file kernel

بالنسبة Image.lz4-dtb ، قم بتشغيل:

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

بناء صورة التمهيد

من الممكن بناء صورة تمهيد باستخدام بيئة بناء النواة. للقيام بذلك ، تحتاج إلى ملف ثنائي 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 master ، فيمكنك بدلاً من ذلك تنزيل الأداة ramdisk-recovery.img build artifact من 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 .