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.