Çekirdek Oluşturma

Bu sayfada Android cihazlar için özel çekirdekler oluşturma süreci ayrıntılarıyla anlatılmaktadı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 rehberlik eder.

Repo'yu kullanarak daha yeni çekirdek kaynaklarını edinebilirsiniz; kaynak ödemenizin kökünden build/build.sh dosyasını çalıştırarak bunları daha fazla yapılandırmaya gerek kalmadan oluşturun.

Kaynakları indirme ve araçları oluşturma

En yeni çekirdekler için kaynakları, araç zincirini indirmek ve komut dosyalarını oluşturmak için repo kullanın. Bazı çekirdekler (örneğin Pixel 3 çekirdekleri) birden fazla git deposundan kaynak gerektirirken diğerleri (örneğin ortak çekirdekler) yalnızca tek bir kaynak gerektirir. repo yaklaşımını kullanmak doğru bir kaynak dizin kurulumu 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ılabilecek repo dallarının ( BRANCH ) listesi için bkz. Çekirdek dalları ve bunların yapı sistemleri .

Pixel cihazları için çekirdeklerin indirilmesi ve derlenmesiyle ilgili ayrıntılar için bkz. Piksel Çekirdekleri Oluşturma .

Çekirdeği oluşturmak

Bazeli Bina (Kleaf)

Android 13, Bazel ile yapı çekirdeklerini tanıttı.

Aarch64 mimarisine yönelik GKI çekirdeğini oluşturmak için Android 13'ten daha eski olmayan bir Android Ortak Çekirdek dalına göz atın ve ardından aşağıdaki komutu çalıştırın:

tools/bazel build //common:kernel_aarch64_dist

Bir dağıtım oluşturmak için şunu çalıştırın:

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

Bundan sonra çekirdek ikili dosyası, modüller ve karşılık gelen görüntüler $DIST_DIR dizininde bulunur. --dist_dir belirtilmemişse, yapıtların konumu için komutun çıktısına bakın. Ayrıntılar için AOSP'deki belgelere bakın.

build.sh ile oluşturma (eski)

Android 12 veya altındaki şubeler için VEYA Kleaf olmayan şubeler için:

build/build.sh

Çekirdek ikili dosyası, modüller ve karşılık gelen görüntü out/ BRANCH /dist dizininde bulunur.

Sanal Cihaz için Satıcı Modüllerinin Oluşturulması

Android 13, build.sh yerine Bazel (Kleaf) ile yapı çekirdeklerini tanıttı.

virtual_device modüllerini oluşturmak için şunu çalıştırın:

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

Bir dağıtım oluşturmak için şunu ç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şturmaya ilişkin daha fazla ayrıntı için bkz. Kleaf - Bazel ile Android Çekirdekleri Oluşturma .

Bireysel mimarilere yönelik Kleaf desteğine ilişkin ayrıntılar için bkz. Cihazlar ve çekirdekler için Kleaf desteği .

Build.sh (eski) ile Sanal Cihaz için Satıcı Modüllerinin Oluşturulması

Android 12'de Mürekkepbalığı ve Japon Balığı birleşiyor, dolayısıyla aynı çekirdeği paylaşıyorlar: virtual_device . Bu çekirdeğin modüllerini oluşturmak için bu yapı 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 korunan bir çekirdek görüntüsüne ve ayrı olarak oluşturulan satıcı tarafından korunan modüllere ayıran GKI'yı tanıttı.

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 konfigürasyonu gösterilmektedir (Mürekkepbalığı ve Emülatör):

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 fazla yolu vardır. Aşağıdakiler çeşitli geliştirme senaryolarına uygun bilinen yöntemlerdir.

Android görüntü yapısına yerleştirme

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

Alternatif olarak, make bootimage (veya önyükleme görüntüsü oluşturan herhangi bir make komut satırını) kullanırken TARGET_PREBUILT_KERNEL değişkenini tanımlayın. Bu değişken, device/common/populate-new-device.sh aracılığıyla ayarlandığı için tüm cihazlar tarafından desteklenir. Örneğin:

export TARGET_PREBUILT_KERNEL=DIST_DIR/Image.lz4-dtb

Fastboot ile çekirdeklerin yanıp sönmesi ve önyüklenmesi

En yeni cihazlarda, bir önyükleme görüntüsü oluşturma ve önyükleme işlemini kolaylaştırmak için bir önyükleyici uzantısı bulunur.

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

adb reboot bootloader
fastboot boot Image.lz4-dtb

Bu yöntemi kullanarak, çekirdek aslında flashlanmaz ve yeniden başlatma sırasında kalıcı olmaz.

Mürekkep balığı üzerinde çekirdek çalıştırma

Cuttlefish cihazlarda kernelleri istediğiniz mimaride çalıştırabilirsiniz.

Mürekkepbalığı aygıtını belirli bir çekirdek yapıtları kümesiyle başlatmak için, hedef çekirdek yapıtlarını parametre olarak kullanarak cvd start komutunu çalıştırın. Aşağıdaki örnek komut common-android14-6.1 çekirdek bildirimindeki bir arm64 hedefi için çekirdek yapıtlarını kullanır.

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ürekkepbalığında çekirdek geliştirme .

Çekirdek yapısını özelleştirme

Çekirdek yapılarını Kleaf yapılarına göre özelleştirmek için Kleaf belgelerine bakın.

Çekirdek yapısını build.sh (eski) ile özelleştirme

build/build.sh için derleme süreci ve sonuç, ortam değişkenlerinden etkilenebilir. Çoğu isteğe bağlıdır ve her çekirdek dalının uygun bir varsayılan yapılandırmayla gelmesi gerekir. En sık kullanılanlar burada listelenmiştir. Tam (ve güncel) bir liste için build/build.sh dosyasına bakın.

Çevre değişkeni Tanım Örnek
BUILD_CONFIG Derleme ortamını başlattığınız yerden yapılandırma dosyası oluşturun. Konumun Repo kök dizinine göre tanımlanması gerekir. Varsayılan olarak build.config şeklindedir.
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 çıktı dizini. DIST_DIR=/path/to/my/dist
OUT_DIR Çekirdek yapısı için temel çıktı dizini. OUT_DIR=/path/to/my/out
SKIP_DEFCONFIG make defconfig atla SKIP_DEFCONFIG=1
SKIP_MRPROPER make mrproper atla SKIP_MRPROPER=1

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

Android 14 ve üzeri sürümlerde, çekirdek yapılandırmalarını özelleştirmek için defconfig parçalarını kullanabilirsiniz. defconfig parçaları hakkında Kleaf belgelerine bakın.

Yapı yapılandırmalarına sahip yerel yapılar için özel çekirdek yapılandırması (eski)

Android 13 ve önceki sürümlerde aşağıdakilere bakın.

Örneğin bir özellik üzerinde çalışırken bir çekirdek yapılandırma seçeneğini düzenli olarak değiştirmeniz gerekiyorsa veya geliştirme amacıyla bir seçeneğin ayarlanmasına ihtiyacınız varsa, bu esnekliği yerel bir değişiklik yaparak veya yapı yapılandırmasının bir kopyasını koruyarak elde edebilirsiniz.

POST_DEFCONFIG_CMDS değişkenini, olağan make defconfig adımı tamamlandıktan hemen sonra değerlendirilecek bir ifadeye ayarlayın. build.config dosyaları derleme ortamına kaynaklandığından build.config 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 tarama çekirdekleri için bağlantı süresi optimizasyonunun (LTO) devre dışı bırakılmasıdır. LTO, piyasaya sürülen çekirdekler için faydalı olsa da, derleme sırasındaki ek yük önemli olabilir. Yerel build.config dosyasına eklenen aşağıdaki kod parçası, build/build.sh kullanılırken 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 tanımlama

Oluşturulacak doğru sürümü 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ümlerini içerir. Git günlüğü, taahhüt mesajının bir 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, onu aşağıda açıklandığı gibi sistem görüntüsünden edinin.

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

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 şunu çalıştırın:

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

Önyükleme Görüntüsü Oluşturma

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

init_boot Cihazlar için Önyükleme Görüntüsü Oluşturma

init_boot bölümüne sahip aygıtlar için önyükleme görüntüsü çekirdekle birlikte oluşturulur. initramfs görüntüsü önyükleme görüntüsüne eklenmemiştir.

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

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

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

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

GKI önyükleme görüntüsü $DIST_DIR konumunda bulunur.

init_boot Cihazlar için Önyükleme Görüntüsü Oluşturma (eski)

init_boot bölümü olmayan cihazlar için, bir GKI önyükleme görüntüsü indirip paketini açarak elde edebileceğiniz bir ramdisk ikili dosyasına ihtiyacınız vardır. İlgili Android sürümündeki herhangi bir GKI önyükleme görüntüsü çalışacaktı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 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ıtını indirebilir ve bunu ramdisk ikili dosyanız olarak kullanabilirsiniz.

Bir ramdisk ikili dosyanız varsa ve bunu çekirdek yapısının kök dizinindeki gki-ramdisk.lz4 dosyasına kopyaladıysanız, aşağıdakileri çalıştırarak 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 bzImage ile ve aarch64 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 konumunda bulunur.