ساخت هسته ها

در این صفحه روند ساخت هسته های سفارشی برای دستگاه های اندرویدی توضیح داده شده است. این دستورالعمل‌ها شما را در فرآیند انتخاب منابع مناسب، ساختن هسته، و جاسازی نتایج در یک تصویر سیستمی که از پروژه منبع باز Android (AOSP) ساخته شده است، راهنمایی می‌کند.

با استفاده از Repo می توانید منابع هسته اخیر را بدست آورید. آنها را بدون پیکربندی بیشتر با اجرای build/build.sh از ریشه پرداخت منبع خود بسازید.

دانلود منابع و ابزارهای ساخت

برای هسته های اخیر، از repo برای دانلود منابع، زنجیره ابزار و اسکریپت های ساخت استفاده کنید. برخی از هسته ها (به عنوان مثال، هسته های پیکسل 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 6 (oriole)
پیکسل 6 پرو (راون)
device/google/raviole-kernel android-gs-raviole-5.10-android12L
Pixel 5a (باربت) device/google/barbet-kernel android-msm-barbet-4.19-android12L
پیکسل 5 (پر قرمز)
Pixel 4a (5G) (bramble)
دستگاه/google/redbull-kernel android-msm-redbull-4.19-android12L
Pixel 4a (ماهی خورشیدی) دستگاه/google/sunfish-kernel android-msm-sunfish-4.14-android12L
پیکسل 4 (شعله)
Pixel 4 XL (مرجانی)
device/google/coral-kernel android-msm-coral-4.14-android12L
Pixel 3a (sargo)
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
Pixel 2 (walleye)
Pixel 2 XL (taimen)
دستگاه/google/wahoo-kernel android-msm-wahoo-4.4-android10-qpr3
پیکسل (ماهی دریایی)
Pixel XL (مارلین)
دستگاه/گوگل/مارلین-کرنل android-msm-marlin-3.18-pie-qpr2
Hikey960 دستگاه/linaro/hikey-kernel hikey-linaro-android-4.14
hikey-linaro-android-4.19
مشترک-اندروید12-5.4
بیگل x15 device/ti/beagle_x15-kernel omap-beagle-x15-android-4.14
omap-beagle-x15-android-4.19
هسته مشترک اندروید N/A مشترک-اندروید-4.4
مشترک-اندروید-4.9
مشترک-اندروید-4.14
مشترک-اندروید-4.19
مشترک-اندروید-4.19-پایدار
مشترک-اندروید11-5.4
مشترک-اندروید12-5.4
مشترک-اندروید12-5.10
مشترک-اندروید-خط اصلی

ساختن هسته

سپس هسته را با این کار بسازید:

build/build.sh

هسته باینری، ماژول ها و تصویر مربوطه در فهرست راهنمای out/ BRANCH /dist قرار دارند.

ساخت ماژول های GKI

اندروید 11 GKI را معرفی کرد که هسته را به یک تصویر هسته نگهداری شده توسط گوگل و ماژول های نگهداری شده فروشنده که به طور جداگانه ساخته شده اند، جدا می کند.

این مثال پیکربندی تصویر هسته را نشان می دهد:

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 12 Cuttlefish و Goldfish همگرا می شوند، بنابراین هسته یکسانی دارند: virtual_device . برای ساخت ماژول های آن هسته، از این پیکربندی ساخت استفاده کنید:

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

اجرای کرنل

راه های مختلفی برای اجرای یک هسته سفارشی وجود دارد. در زیر راه های مناسب برای سناریوهای مختلف توسعه شناخته شده است.

جاسازی در ساخت تصویر اندروید

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

فلش و بوت کردن کرنل ها با فست بوت

اکثر دستگاه های اخیر دارای یک پسوند بوت لودر برای ساده کردن فرآیند تولید و راه اندازی یک تصویر بوت هستند.

برای بوت کردن کرنل بدون فلش کردن:

adb reboot bootloader
fastboot boot Image.lz4-dtb

با استفاده از این روش، هسته در واقع فلش نمی شود و در راه اندازی مجدد باقی نمی ماند.

سفارشی سازی ساخت هسته

فرآیند ساخت و نتیجه را می توان تحت تأثیر متغیرهای محیطی قرار داد. بسیاری از آنها اختیاری هستند و هر شاخه هسته باید دارای یک پیکربندی پیش فرض مناسب باشد. پرکاربردترین آنها در اینجا ذکر شده است. برای فهرست کامل (و به روز)، به 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 دایرکتوری خروجی پایه برای ساخت هسته. OUT_DIR=/path/to/my/out
SKIP_DEFCONFIG make defconfig SKIP_DEFCONFIG=1
SKIP_MRPROPER make mrproper SKIP_MRPROPER=1

پیکربندی هسته سفارشی برای ساخت های محلی

اگر به طور منظم نیاز به تغییر یک گزینه پیکربندی هسته دارید، به عنوان مثال، هنگام کار بر روی یک ویژگی، یا اگر نیاز به تنظیم گزینه ای برای اهداف توسعه دارید، می توانید با حفظ یک تغییر محلی یا کپی از پیکربندی ساخت، به این انعطاف دست پیدا کنید.

متغیر 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 نسخه صحیح را به عنوان بخشی از پیام commit نشان می دهد:

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

اگر نسخه هسته در گزارش git فهرست نشده است، آن را از تصویر سیستم، همانطور که در زیر توضیح داده شده است، دریافت کنید.

نسخه هسته از تصویر سیستم

برای تعیین نسخه هسته مورد استفاده در یک تصویر سیستم، دستور زیر را در برابر فایل هسته اجرا کنید:

file kernel

برای فایل های Image.lz4-dtb ، اجرا کنید:

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

ساختن یک تصویر بوت

امکان ساخت یک تصویر بوت با استفاده از محیط ساخت هسته وجود دارد. برای انجام این کار به یک باینری ramdisk نیاز دارید که می توانید با دانلود یک تصویر بوت GKI و باز کردن آن، آن را دریافت کنید. هر تصویر بوت GKI از نسخه اندروید مرتبط کار خواهد کرد.

tools/mkbootimg/unpack_bootimg.py --boot_img=boot-5.4-gz.img
mv tools/mkbootimg/out/ramdisk gki-ramdisk.lz4

پوشه هدف دایرکتوری سطح بالای درخت هسته (دایرکتوری فعلی کار) است.

اگر با AOSP master در حال توسعه هستید، می توانید در عوض مصنوع ساخت 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 قرار دارد.