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.