Çekirdek oluşturma

Bu sayfada, özel kampanya oluşturma süreci çekirdek Bu doğru dönüşüm hunisini seçme sürecinde size çekirdeği oluşturma ve sonuçları sistem görüntüsüne yerleştirme Android Açık Kaynak Projesi'nde (AOSP) geliştirilmiştir.

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

Kaynakları indirme ve oluşturma araçları

Son çekirdekler için repo değerini kullanın kaynak indirmenizi, araç zincirini indirmenizi ve komut dosyalarını derlemenizi sağlar. 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ını kullanmak doğru kaynak sağlar dizin kurulumu.

Uygun dalın kaynaklarını indirin:

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

ÖncekiBRANCH "repo init" komutuna bakın, bkz. Çekirdek dalları ve derleme sistemleri.

Pixel cihazların çekirdeklerini indirme ve derleme hakkında ayrıntılı bilgi için bkz. Pixel Kernels oluşturma.

Çekirdek oluşturma

Bazel (Kleaf) ile derleme

Android 13, Bazel.

aarch64 mimarisi için GKI çekirdeğini oluşturmak için şuraya göz atın: Android 13'ten daha eski bir Android Common Kernel dalı ve ardından aşağıdaki komutu çalıştırın:

tools/bazel build //common:kernel_aarch64_dist

Dağıtım oluşturmak için şu komutu çalıştırın:

tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$DIST_DIR

Ardından, çekirdek ikili programı, modüller ve bunlara karşılık gelen resimler, $DIST_DIR dizini. --dist_dir belirtilmemişse çıkışa bakın komutunun bir listesidir. Ayrıntılar için aOSP ile ilgili belgelere göz atın.

Build.sh ile derleme (eski)

Android 12 veya önceki sürümlerin yüklü olduğu şubeler için VEYA Kleaf içermeyen dallar:

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 oluşturma

Android 13, Bazel (KYaprak), build.sh.

virtual_device adlı uygulamanın modüllerini oluşturmak için şu komutu çalıştırın:

tools/bazel build //common-modules/virtual-device:virtual_device_x86_64_dist

Dağıtım oluşturmak için şu komutu çalıştırın:

tools/bazel run //common-modules/virtual-device:virtual_device_x86_64_dist -- --dist_dir=$DIST_DIR

Bazel ile Android çekirdekleri oluşturma hakkında daha fazla bilgi için bkz. . Kleaf - Bazel ile Android Çekirdekleri 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ıkları birleşiyor, böylece aynı çekirdek: 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 kullanıma sunuldu GKI, Çekirdeği, Google tarafından yönetilen çekirdek görüntüsüne ve tedarikçi tarafından yönetilen modüllere ayıran ayrı olarak oluşturulur.

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

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

Bu örnekte bir modül yapılandırması (Cuttlefish 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 oluşturulmuş bir çekirdeği çalıştırmanın birden çok 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, TARGET_PREBUILT_KERNEL öğesini tanımlayın değişkeni make bootimage (veya make komut satırından). Bu değişken kurulumu için tüm cihazlar tarafından desteklenir device/common/populate-new-device.sh Örnek:

export TARGET_PREBUILT_KERNEL=DIST_DIR/Image.lz4-dtb

Fastboot özellikli flaş ve başlatma çekirdekleri

En son cihazlarda Bootloader uzantısına sahip olan başlatma görüntüsü oluşturabilirsiniz.

Ç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ığı üzerinde çekirdekleri çalıştırın

Ç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 start komutunu hedef çekirdek yapılarıyla parametreleridir. Aşağıdaki örnek komut, common-android14-6.1 çekirdek manifesti.

cvd start \
    -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 bkz. Mücevher balığı üzerinde çekirdek geliştirme.

Ç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 sonuç etkilenebilir ortam değişkenlerine göre belirlenir. 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ı ilk kullanıma hazırladığınız yerden yapılandırma dosyasını derleyin. Konum, Depo köküne göre tanımlanmalıdır dizin. Varsayılan olarak build.config değerine ayarlanır.
. Yaygın çekirdekler için zorunludur.
BUILD_CONFIG=common/build.config.gki.aarch64
CC Kullanılacak derleyiciyi geçersiz kıl. Varsayılan değere döner build.config tarafından tanımlanan derleyici. 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 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 defconfig parçalarını kullanabilirsiniz. inceleyebilirsiniz. bkz. Defconfig parçalarıyla ilgili Kleaf dokümanları.

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ğıdaki bilgilere bakın.

Bir çekirdek yapılandırma seçeneğini düzenli olarak değiştirmeniz gerekiyorsa. Örneğin, veya geliştirme için ayarlanmış bir seçeneğe ihtiyacınız olduğunda bu esnekliği elde etmek için yerel varlıklarınızı koruyarak yapılandırmanın değiştirilmesini veya kopyasını oluşturur.

POST_DEFCONFIG_CMDS değişkenini normal make defconfig adımdan hemen sonra değerlendirilir. tamamlandı. 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 dahil etmeyi deneyin. 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 tanımlama

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

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

AOSP ağacı, önceden oluşturulmuş çekirdek sürümleri 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üğünde listelenmiyorsa, bunu sistemden alın görüntüsüne bakalım.

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

Sistem görüntüsünde kullanılan çekirdek sürümünü belirlemek için aşağıdaki komutu çalıştırın: komutuyla birlikte aşağıdaki kodu da yükleyebilirsiniz:

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

Şu özelliklere sahip cihazlar için: init_boot bölümü, başlatma 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 -- --dist_dir=$DIST_DIR

build/build.sh (eski) ile GKI başlatma görüntüsünü şununla derleyebilirsiniz:

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

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

init_boot (eski) özelliği bulunmayan cihazlar için başlatma görüntüsü 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şkilendirilmiş Android sürümünden herhangi bir GKI başlatma görüntüsü çalışır.

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.