Çekirdek oluşturma

Bu sayfada, Android cihazlar için özel çekirdek oluşturma süreci ayrıntılı olarak açıklanmıştır. Bu talimatlar doğru kaynakları seçme, çekirdeği oluşturma ve sonuçları Android Açık Kaynak Projesi'nden (AOSP) oluşturulan bir sistem görüntüsüne yerleştirme sürecinde size yol gösterir.

Repo'yu kullanarak daha güncel çekirdek kaynaklarını edinebilir ve kaynak kontrolünün kökünden build/build.sh'yi çalıştırarak bunları başka bir yapılandırma yapmadan derleyebilirsiniz.

Kaynakları indirme ve oluşturma araçları

Son çekirdekler için kaynakları, araç zincirini ve derleme komut dosyalarını indirmek üzere repo kullanın. Bazı çekirdekler (ör. Pixel 3 çekirdekleri) birden fazla git deposundan kaynak gerektirirken diğerleri (ör. ortak çekirdekler) yalnızca tek bir kaynak gerektirir. repo yaklaşımı, kaynak dizin ayarının doğru olmasını sağlar.

İlgili dalın kaynaklarını indirin:

mkdir android-kernel && cd android-kernel
repo init -u https://android.googlesource.com/kernel/manifest -b BRANCH
repo sync

Önceki "repo init" komutuyla kullanılabilen repo dallarının (BRANCH) listesi için Çekirdek dalları ve derleme sistemleri başlıklı makaleyi inceleyin.

Pixel cihazlar için çekirdekleri indirme ve derleme hakkında ayrıntılı bilgi edinmek isterseniz Pixel Çekirdeklerini Derleme başlıklı makaleyi inceleyin.

Çekirdeği oluşturma

Bazel ile derleme (Kleaf)

Android 13, Bazel ile çekirdek oluşturma özelliğini kullanıma sundu.

aarch64 mimarisi için GKI çekirdeği dağıtımı oluşturmak amacıyla, Android 13 veya daha yeni bir Android Ortak Çekirdek dalına göz atın ve ardından aşağıdaki komutu çalıştırın:

tools/bazel run //common:kernel_aarch64_dist [-- --destdir=$DIST_DIR]

Ardından çekirdek ikili dosyası, modüller ve ilgili resimler $DIST_DIR dizininde bulunur. --destdir belirtilmezse yapıların konumu için komutun çıktısına bakın. Ayrıntılar için AOSP dokümanlarına bakın.

build.sh ile derleme (eski)

Android 12 veya önceki sürümlerin dalları VEYA Kleaf içermeyen dallar için:

build/build.sh

Çekirdek ikili programı, modüller ve ilgili görüntü, out/BRANCH/dist dizininde bulunur.

Sanal cihaz için tedarikçi modüllerini derleme

Android 13, build.sh yerine Bazel (Kleaf) ile çekirdek oluşturma özelliğini kullanıma sundu.

virtual_device modülleri için dağıtım oluşturmak üzere şunları çalıştırın:

tools/bazel run //common-modules/virtual-device:virtual_device_x86_64_dist [-- --destdir=$DIST_DIR]

Bazel ile Android çekirdeği oluşturma hakkında daha fazla bilgi için Kleaf - Bazel ile Android Çekirdeklerini Derleme.

Ayrı mimariler için Kleaf desteği hakkında ayrıntılı bilgi edinmek isterseniz Cihazlar ve çekirdekler için Kleaf desteği başlıklı makaleyi inceleyin.

Build.sh (eski) ile sanal cihaz için tedarikçi modüllerini oluşturma

Android 12'de Mürekkep Balığı ve Japon Balığı birleştiği için aynı çekirdeği paylaşırlar: virtual_device. Bu çekirdeğin modüllerini oluşturmak için şu derleme yapılandırmasını kullanın:

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

Android 11, çekirdeği Google tarafından yönetilen bir çekirdek resmine ve ayrı olarak oluşturulan tedarikçi firma tarafından yönetilen modüllere ayıran GKI'yi kullanıma sundu.

Bu örnekte bir çekirdek görüntü yapılandırması gösterilmektedir:

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

Bu örnekte bir modül yapılandırması (Mürekkep Balığı ve Emülatör) gösterilmektedir:

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

Çekirdeği çalıştırma

Özel olarak oluşturulmuş bir çekirdeği çalıştırmanın birden fazla yolu vardır. Aşağıda, çeşitli geliştirme senaryolarına uygun bilinen yöntemler verilmiştir.

Android görüntü derlemesine yerleştir

Image.lz4-dtb öğesini AOSP ağacındaki ilgili çekirdek ikili program konumuna kopyalayın ve başlatma görüntüsünü yeniden oluşturun.

Alternatif olarak, make bootimage (veya önyükleme resmi oluşturan başka bir make komut satırı) kullanırken TARGET_PREBUILT_KERNEL değişkenini tanımlayabilirsiniz. Bu değişken, device/common/populate-new-device.sh üzerinden ayarlandığı için tüm cihazlar tarafından desteklenir. Örnek:

export TARGET_PREBUILT_KERNEL=DIST_DIR/Image.lz4-dtb

Fastboot ile çekirdekleri flaşlama ve önyükleme

En son cihazların çoğunda, önyükleme görüntüsünü oluşturma ve önyükleme yapma sürecini kolaylaştırmak için bir önyükleme yükleyici uzantısı bulunur.

Çekirdeki yanıp sönmeden başlatmak için:

adb reboot bootloader
fastboot boot Image.lz4-dtb

Bu yöntem kullanıldığında çekirdek aslında yüklenmez ve yeniden başlatma sırasında devam etmez.

Mürekkep Balığı'nda çekirdekleri çalıştırma

Mürekkepbalığı cihazlarında istediğiniz mimaride çekirdek çalıştırabilirsiniz.

Bir Mürekkep balığı cihazını belirli bir çekirdek yapıları ile başlatmak için hedef çekirdek yapılarıyla parametre olarak cvd create komutunu çalıştırın. Aşağıdaki örnek komut, common-android14-6.1 çekirdek manifestinden bir arm64 hedefi için çekirdek yapılarını kullanır.

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

Daha fazla bilgi için Cuttlefish'te çekirdek geliştirme başlıklı makaleyi inceleyin.

Çekirdek derlemesini özelleştirme

Kleaf derlemeleri için çekirdek derlemelerini özelleştirmek istiyorsanız Kleaf belgelerini inceleyin.

build.sh (eski) ile çekirdek derlemesini özelleştirme

build/build.sh için derleme süreci ve sonucu, ortam değişkenlerinden etkilenebilir. Bunların çoğu isteğe bağlıdır ve her çekirdek dalının uygun bir varsayılan yapılandırmaya sahip olması gerekir. En sık kullanılanlar burada listelenmiştir. Tam (ve güncel) liste için build/build.sh bölümüne bakın.

Ortam değişkeni Açıklama Örnek
BUILD_CONFIG Derleme ortamını başlattığınız yerden derleme yapılandırma dosyası. Konum, Repo kök dizinine göre tanımlanmalıdır. Varsayılan olarak build.config değerine ayarlanır.
Ortak çekirdekler için zorunludur.
BUILD_CONFIG=common/build.config.gki.aarch64
CC Kullanılacak derleyiciyi geçersiz kılın. build.config tarafından tanımlanan varsayılan derleyiciye geri döner. CC=clang
DIST_DIR Çekirdek dağıtımı için temel çıkış dizini. DIST_DIR=/path/to/my/dist
OUT_DIR Çekirdek derlemesi için temel çıkış dizini. OUT_DIR=/path/to/my/out
SKIP_DEFCONFIG Atla make defconfig SKIP_DEFCONFIG=1
SKIP_MRPROPER make mrproper adımını atla SKIP_MRPROPER=1

Yerel derlemeler için özel çekirdek yapılandırması

Android 14 ve sonraki sürümlerde çekirdek yapılandırmalarını özelleştirmek için defconfig parçalarını kullanabilirsiniz. defconfig parçalarıyla ilgili Kleaf dokümanlarına bakın.

Derleme yapılandırmaları içeren yerel derlemeler için özel çekirdek yapılandırması (eski)

Android 13 ve önceki sürümlerde aşağıdakileri inceleyin.

Bir çekirdek yapılandırma seçeneğini düzenli olarak değiştirmeniz gerekiyorsa (ör. bir özellik üzerinde çalışırken) veya bir seçeneğin geliştirme amacıyla ayarlanması gerekiyorsa derleme yapılandırmasını yerel olarak değiştirerek ya da kopyalayarak bu esnekliğe ulaşabilirsiniz.

POST_DEFCONFIG_CMDS değişkenini, normal make defconfig adımı tamamlandıktan hemen sonra değerlendirilen bir ifadeye ayarlayın. build.config dosyaları derleme ortamına kaynak olarak alındığından, build.config'te tanımlanan işlevler, defconfig sonrası komutların bir parçası olarak çağrılabilir.

Yaygın bir örnek, geliştirme sırasında çapraz çizgili çekirdekler için bağlantı süresi optimizasyonunu (LTO) devre dışı bırakmaktır. LTO, yayınlanan çekirdekler için yararlı olsa da derleme Yerel build.config'e eklenen aşağıdaki snippet, build/build.sh kullanıldığında LTO'yu kalıcı olarak devre dışı bırakır.

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)
}

Çekirdek sürümlerini belirleme

Derleme için doğru sürümü şu iki kaynaktan belirleyebilirsiniz: AOSP ağacı ve sistem görüntüsü.

AOSP ağacındaki çekirdek sürümü

AOSP ağacı, önceden derlenmiş çekirdek sürümlerini içerir. git günlüğünde, doğru sürüm, kaydetme mesajının bir parçası olarak gösterilir:

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

Çekirdek sürümü git günlüğünde listelenmemişse aşağıda açıklandığı şekilde sistem görüntüsünden alın.

Sistem görüntüsündeki çekirdek sürümü

Bir sistem görüntüsünde kullanılan çekirdek sürümünü belirlemek için çekirdek dosyasında aşağıdaki komutu çalıştırın:

file kernel

Image.lz4-dtb dosya için şu komutu çalıştırın:

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

Başlatma görüntüsü oluşturma

Çekirdek derleme ortamını kullanarak önyükleme görüntüsü oluşturmak mümkündür.

init_boot içeren cihazlar için önyükleme resmi oluşturma

init_boot bölümü olan cihazlarda, önyükleme görüntüsü çekirdekle birlikte oluşturulur. initramfs resmi, önyükleme resmine yerleştirilmemiştir.

Örneğin, Kleaf ile GKI önyükleme görüntüsünü şu şekilde oluşturabilirsiniz:

tools/bazel run //common:kernel_aarch64_dist [-- --destdir=$DIST_DIR]

build/build.sh (eski) ile GKI önyükleme görüntüsünü şu şekilde oluşturabilirsiniz:

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

GKI başlatma görüntüsü $DIST_DIR konumunda bulunur.

init_boot (eski) olmayan cihazlar için önyükleme resmi oluşturma

init_boot bölümü olmayan cihazlarda bir ramdisk ikilisine ihtiyacınız vardır. Bu ikiliyi, GKI önyükleme görüntüsünü indirerek ve açarak elde edebilirsiniz. İlişkili Android sürümünden herhangi bir GKI önyükleme resmi kullanılabilir.

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

Hedef klasör, çekirdek ağacının (mevcut çalışma dizini) en üst düzey dizinidir.

AOSP main ile geliştirme yapıyorsanız bunun yerine ci.android.com adresindeki bir aosp_arm64 derlemesinden ramdisk-recovery.img derleme yapısını indirebilir ve ramdisk ikiliniz olarak kullanabilirsiniz.

Bir ramdisk ikili dosyanız olduğunda ve bu dosyayı çekirdek derlemesinin kök dizininde gki-ramdisk.lz4 konumuna kopyaladığınızda aşağıdaki komutu yürüterek bir önyükleme görüntüsü oluşturabilirsiniz:

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 tabanlı mimariyle çalışıyorsanız Image ifadesini bzImage ile, aarch64 ifadesini ise x86_64 ile değiştirin:

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

Bu dosya, $KERNEL_ROOT/out/$KERNEL_VERSION/dist yapı dizininde bulunur.

Önyükleme görüntüsü out/<kernel branch>/dist/boot.img adresindedir.