Ç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 resmine yerleştirme sürecinde size yol gösterir.

Daha yeni çekirdek kaynakları edinmek için Repo; daha fazla ilerlemeden kök dizinden build/build.sh çalıştırarak kaynak ödeme.

Kaynakları ve derleme araçlarını indirme

Son çekirdekler için repo değerini kullanın kaynak indirme, araç zinciri oluşturma ve komut dosyaları derleme. Bazı çekirdekler (örneğin, Pixel 3 çekirdekleri), birden fazla git'ten kaynak gerektirir. depoları bulunurken bazıları (örneğin, yaygın çekirdekler) yalnızca bir kaynak. 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.

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 programı, modüller ve bunlara karşılık gelen resimler, $DIST_DIR dizini. --destdir belirtilmemişse çıkışa bakın komutunun bir kopyasını oluşturun. 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 karşılık gelen görüntü, out/BRANCH/dist dizini.

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

Android 13, build.sh'in yerini alarak çekirdekleri Bazel (Kleaf) ile derleme özelliğini kullanıma sundu.

virtual_device adlı uygulamanın modülleri için dağıtım oluşturmak istiyorsanız şu komutu ç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 Kernels Derleme.

Ayrı ayrı mimariler için Kleaf desteği hakkında ayrıntılı bilgi edinmek üzere Cihazlar ve çekirdekler için Kleaf desteği.

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ğinden aynı çekirdeği paylaşırlar: virtual_device. Bu çekirdeğin modüllerini oluşturmak için bu derlemeyi kullanın yapılandırma:

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

Android 11'de, ç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 kullanıma sunulmuştur.

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. Bu alanlar: uygun bilinen yöntemleri öğrenmenize yardımcı olur.

Android görüntü derlemesine yerleştir

Image.lz4-dtb öğesini ilgili çekirdek ikili program konumuna kopyalayın gözden geçirin ve başlatma görüntüsünü yeniden derleyin.

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 özellikli flaş ve başlatma çekirdekleri

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.

Çekirdeği 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 yanıp sönmez ve devam etmez çok daha iyi performans gösterir.

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

Çekirdekleri Kürek balığı cihazları.

Bir Mürekkep balığı cihazını belirli bir çekirdek grubuyla başlatmak için yapıları algılamak için cvd create komutunu hedef çekirdek yapılarıyla parametreleridir. Aşağıdaki örnek komut, common-android14-6.1 çekirdek manifesti.

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 derlemelerinin çekirdek derlemelerini özelleştirmek için Kleaf belgeleri.

Çekirdek derlemesini build.sh (eski) ile ö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ında uygun bir Varsayılan yapılandırma. En sık kullanılanlar burada listelenmiştir. Örneğin, tam (ve güncel) liste için build/build.sh inceleyin.

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 make defconfig adımını atla SKIP_DEFCONFIG=1
SKIP_MRPROPER Atla make mrproper 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 belgelerine 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ı derlemeye eklendiğinden build.config içinde tanımlanan fonksiyonlar komutunun bir parçası olarak çalışır.

Yaygın bir örnek, çapraz çizgi için bağlantı süresi optimizasyonunu (LTO) devre dışı bırakmaktır. çekirdekleri arasındaki farkları belirtin. LTO, yayınlanan çekirdekler için faydalı olsa da ek yük önemli ölçüde olabilir. Aşağıdaki snippet eklendi yerel build.config, aşağıdaki durumlarda LTO'yu kalıcı olarak devre dışı bırakır: build/build.sh kullanılıyor.

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üğü, kaydetme mesajının parçası olarak doğru sürümü gösterir:

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

Çekirdek sürümü git günlüklerinde listelenmiyorsa aşağıda açıklandığı gibi sistem görüntüsünden alın.

Sistem görüntüsünden ç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 dosyaları için:

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 özelliğine sahip cihazlar için başlatma görüntüsü oluşturma

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

Örneğin, Kleaf ile GKI başlatma görüntüsünü aşağıdakilerle derleyebilirsiniz:

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 önyükleme görüntüsü $DIST_DIR konumundadır.

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

Şu olmayan cihazlar için: init_boot bölümü, edinebileceğiniz bir ramdisk ikili dosyası GKI başlatma görüntüsünü indirme ve ambalajından çıkarıyorum. İ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 (geçerli çalışma dizinine ekleyin).

AOSP ana sistemiyle geliştirme yapıyorsanız bunun yerine ramdisk-recovery.img bir aosp_arm64 derlemesinden derleme yapısı ci.android.com adresine gidip bunu ramdisk ikili dosyanız olarak kullanın.

Bir ramdisk ikili dosyanız olduğunda ve bunu kök dizinde gki-ramdisk.lz4 konumuna kopyaladığınızda dizininde, şu komutu çalıştırarak bir başlatma 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ı bir mimariyle çalışıyorsanız Image bzImage ve aarch64 ile 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

Bu dosya yapı dizininde bulunuyor $KERNEL_ROOT/out/$KERNEL_VERSION/dist

Başlatma görüntüsü, out/<kernel branch>/dist/boot.img konumunda bulunur.