نواة البناء

توضح هذه الصفحة تفاصيل عملية إنشاء نواة مخصصة لأجهزة 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 فروع الريبو
بكسل 7 (النمر)
Pixel 7 Pro (فهد)
device / google / pantah-kernel android-gs-pantah-5.10-android13-qpr2
Pixel 6a (بلوجاي) device / google / bluejay-kernel android-gs-bluejay-5.10-android13-qpr2
Pixel 6 (أوريول)
Pixel 6 Pro (غراب)
device / google / raviole-kernel android-gs-raviole-5.10-android13-qpr2
Pixel 5a (باربيت)
Pixel 5 (ذو زعنفة حمراء)
Pixel 4a (5G) (برامبل)
device / google / redbull-kernel android-msm-redbull-4.19-android13-qpr2
بكسل 4 أ (سمكة الشمس) device / google / sunfish-kernel android-msm-sunfish-4.14-android13-qpr2
Pixel 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 تحديث
hikey-linaro-android-4.19.0 تحديث
شائع android12-5.4
عام-android13-5.10
بيجل 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
عام android14-5.15
عام android14-6.1
مشترك-android-mainline

بناء النواة

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

build/build.sh

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

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

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

لإنشاء GKI kernel لبنية 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 .

بناء وحدات البائع للجهاز الظاهري

قدم 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: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 للأجهزة والنواة .

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

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

جهاز فروع الريبو دعم Kleaf build/build.sh
نواة Android المشتركة
db845c
جهاز افتراضي (x86_64 ، arm64)
جهاز افتراضي (i686 ، ذراع)
روكبي 4
عام-أندرويد-4.4
عام-android-4.9
عام-أندرويد 4.14.0
عام-أندرويد 4.19.0
مشترك-أندرويد-4.19-مستقر
عام-android11-5.4
شائع android12-5.4
عام-android12-5.10
نواة Android المشتركة عام-android13-5.10
عام android13-5.15
✅ (رسمي) 1
نواة Android المشتركة عام android14-5.15
عام android14-6.1
مشترك-android-mainline
db845c عام-android13-5.10
db845c عام android13-5.15 ✅ (رسمي) 1
db845c عام android14-5.15
عام android14-6.1
مشترك-android-mainline
جهاز افتراضي (x86_64 ، arm64) عام-android13-5.10
عام android13-5.15
✅ (رسمي) 1 ⚠️ (لم تتم صيانته) 2
جهاز افتراضي (x86_64 ، arm64) عام android14-5.15
عام android14-6.1
مشترك-android-mainline
جهاز افتراضي (i686 ، ذراع) عام-android13-5.10
عام android13-5.15
جهاز افتراضي (i686 ، ذراع) عام android14-5.15
عام android14-6.1
مشترك-android-mainline
روكبي 4 عام-android13-5.10
عام android13-5.15
روكبي 4 عام android14-5.15
عام android14-6.1
مشترك-android-mainline
هيكي 960 hikey-linaro-android-4.14.0 تحديث
hikey-linaro-android-4.19.0 تحديث
شائع android12-5.4
عام-android13-5.10
وحدة fips140 عام-android12-5.10
عام-android13-5.10
عام android13-5.15
وحدة fips140 عام 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

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

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

لتخصيص إصدارات kernel لإصدارات Kleaf ، راجع وثائق Kleaf .

بالنسبة 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 دليل الإخراج الأساسي لتوزيع 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

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

من الممكن بناء صورة تمهيد باستخدام بيئة بناء النواة.

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

بالنسبة للأجهزة التي تحتوي على قسم init_boot ، يتم إنشاء صورة التمهيد مع kernel. لم يتم تضمين صورة 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 master ، فيمكنك بدلاً من ذلك تنزيل أداة الإنشاء 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 .