در این صفحه روند ساخت کرنل های سفارشی برای دستگاه های اندرویدی توضیح داده شده است. این دستورالعملها شما را در فرآیند انتخاب منابع مناسب، ساختن هسته و جاسازی نتایج در یک تصویر سیستمی که از پروژه منبع باز 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 ) که میتوان با دستور قبلی «repo init» استفاده کرد، شاخههای هسته و سیستمهای ساخت آنها را ببینید.
برای جزئیات دانلود و کامپایل هستهها برای دستگاههای Pixel، به ساخت هستههای پیکسل مراجعه کنید. اندروید 13 هسته های ساختمانی را با Bazel معرفی کرد. برای ایجاد یک توزیع برای هسته GKI برای معماری aarch64، یک شاخه هسته مشترک Android را زودتر از Android 13 بررسی کنید و سپس دستور زیر را اجرا کنید: پس از آن باینری هسته، ماژول ها و تصاویر مربوطه در دایرکتوری برای شعبه هایی در اندروید 12 یا پایین تر، یا شاخه های بدون Kleaf: هسته باینری، ماژول ها و تصویر مربوطه در فهرست راهنمای اندروید 13 هسته های ساختمانی را با Bazel (Kleaf) معرفی کرد که جایگزین برای ایجاد توزیع برای ماژول های برای جزئیات بیشتر در مورد ساخت هسته های اندروید با Bazel، نگاه کنید. Kleaf - ساخت هسته های اندروید با Bazel . برای جزئیات بیشتر در مورد پشتیبانی Kleaf برای معماری های فردی، به پشتیبانی Kleaf برای دستگاه ها و هسته ها مراجعه کنید. در Android 12 Cuttlefish و Goldfish همگرا می شوند، بنابراین هسته یکسانی دارند: اندروید 11 GKI را معرفی کرد که هسته را به یک تصویر هسته نگهداری شده توسط گوگل و ماژول های نگهداری شده فروشنده که جداگانه ساخته شده اند، جدا می کند. این مثال پیکربندی تصویر هسته را نشان می دهد: این مثال پیکربندی ماژول (Cuttlefish and Emulator) را نشان می دهد: راه های مختلفی برای اجرای یک هسته سفارشی ساخته شده وجود دارد. در زیر روش های مناسب برای سناریوهای مختلف توسعه شناخته شده است. همچنین، متغیر بیشتر دستگاههای اخیر دارای یک پسوند بوت لودر برای سادهسازی فرآیند تولید و راهاندازی تصویر بوت هستند. برای بوت کردن کرنل بدون فلش کردن: با استفاده از این روش، هسته در واقع فلش نمی شود و در راه اندازی مجدد باقی نمی ماند. شما می توانید هسته ها را در معماری انتخابی خود در دستگاه های Cuttlefish اجرا کنید. برای راهاندازی دستگاه Cuttlefish با مجموعه خاصی از آرتیفکتهای هسته ، دستور برای اطلاعات بیشتر، به توسعه هستهها در Cuttlefish مراجعه کنید. برای سفارشی کردن ساختهای هسته برای ساختهای Kleaf، به مستندات Kleaf مراجعه کنید. برای در اندروید 14 و بالاتر، میتوانید از قطعات defconfig برای سفارشی کردن پیکربندیهای هسته استفاده کنید. به مستندات Kleaf در مورد قطعات defconfig مراجعه کنید. در اندروید 13 و پایین تر، موارد زیر را ببینید. اگر به طور منظم نیاز به تغییر یک گزینه پیکربندی هسته دارید، به عنوان مثال، هنگام کار بر روی یک ویژگی، یا اگر به یک گزینه برای اهداف توسعه نیاز دارید، می توانید با حفظ یک تغییر محلی یا کپی از پیکربندی ساخت، به این انعطاف دست پیدا کنید. متغیر POST_DEFCONFIG_CMDS را روی عبارتی تنظیم کنید که درست پس از انجام مرحله یک مثال رایج، غیرفعال کردن بهینه سازی زمان لینک (LTO) برای کرنل های متقاطع در طول توسعه است. در حالی که LTO برای هسته های منتشر شده مفید است، سربار در زمان ساخت می تواند قابل توجه باشد. قطعه زیر که به شما می توانید نسخه صحیح برای ساخت را از دو منبع شناسایی کنید: درخت AOSP و تصویر سیستم. درخت AOSP شامل نسخه های هسته از پیش ساخته شده است. گزارش git نسخه صحیح را به عنوان بخشی از پیام commit نشان می دهد: اگر نسخه کرنل در گزارش git فهرست نشده است، آن را از تصویر سیستم، همانطور که در زیر توضیح داده شده است، دریافت کنید. برای تعیین نسخه هسته مورد استفاده در یک تصویر سیستم، دستور زیر را در برابر فایل هسته اجرا کنید: برای فایل های امکان ساخت یک تصویر بوت با استفاده از محیط ساخت هسته وجود دارد. برای دستگاههای دارای پارتیشن به عنوان مثال، با Kleaf، می توانید تصویر بوت GKI را با موارد زیر بسازید: با تصویر بوت GKI در $DIST_DIR واقع شده است. برای دستگاههای بدون پارتیشن پوشه هدف دایرکتوری سطح بالای درخت هسته (دایرکتوری فعلی کار) است. اگر در حال توسعه با AOSP main هستید، می توانید در عوض مصنوع ساخت وقتی یک ramdisk باینری دارید و آن را در اگر با معماری مبتنی بر x86 کار میکنید، آن فایل در فهرست آرتیفکت تصویر راهاندازی در
tools/bazel run //common:kernel_aarch64_dist [-- --destdir=$DIST_DIR]
$DIST_DIR
قرار می گیرند. اگر --destdir
نامشخص است، خروجی دستور را برای مکان آرتیفکت ها ببینید. برای جزئیات، به مستندات مربوط به AOSP مراجعه کنید.build/build.sh
out/ BRANCH /dist
قرار دارند.build.sh
شد.virtual_device
، اجرا کنید:
tools/bazel run //common-modules/virtual-device:virtual_device_x86_64_dist [-- --destdir=$DIST_DIR]
virtual_device
. برای ساخت ماژول های آن هسته، از این پیکربندی ساخت استفاده کنید:BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64 build/build.sh
BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh
BUILD_CONFIG=common-modules/virtual-device/build.config.cuttlefish.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
cvd create
را با آرتیفکتهای هسته هدف به عنوان پارامتر اجرا کنید. دستور مثال زیر از آرتیفکتهای هسته برای هدف 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
build/build.sh
، فرآیند ساخت و نتیجه را می توان تحت تأثیر متغیرهای محیطی قرار داد. اکثر آنها اختیاری هستند و هر شاخه هسته باید دارای یک پیکربندی پیش فرض مناسب باشد. پرکاربردترین آنها در اینجا ذکر شده است. برای فهرست کامل (و به روز)، به 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
make defconfig
معمولی ارزیابی می شود. از آنجایی که فایل های build.config
در محیط ساخت منبع می شوند، توابع تعریف شده در build.config
را می توان به عنوان بخشی از دستورات post-defconfig فراخوانی کرد.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)
}
cd $AOSP/device/VENDOR/NAME
git log --max-count=1
file kernel
Image.lz4-dtb
، اجرا کنید:
grep -a 'Linux version' Image.lz4-dtb
init_boot
، تصویر بوت همراه با هسته ساخته میشود. تصویر initramfs
در تصویر بوت تعبیه نشده است.
tools/bazel run //common:kernel_aarch64_dist [-- --destdir=$DIST_DIR]
build/build.sh
(میراث)، می توانید تصویر بوت GKI را با استفاده از:
BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh
init_boot
، به یک باینری ramdisk نیاز دارید که میتوانید با دانلود یک تصویر بوت GKI و باز کردن آن، آن را دریافت کنید. هر تصویر بوت GKI از نسخه اندروید مرتبط کار خواهد کرد.
tools/mkbootimg/unpack_bootimg.py --boot_img=boot-5.4-gz.img
mv $KERNEL_ROOT/out/ramdisk gki-ramdisk.lz4
ramdisk-recovery.img
را از یک بیلد aosp_arm64 در ci.android.com دانلود کنید و از آن به عنوان باینری 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
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
قرار دارد.