Yapı Çekirdekleri

Bu sayfa, Android cihazlar için özel çekirdekler oluşturma sürecini ayrıntılarıyla anlatır. Bu talimatlar, doğru kaynakları seçme, çekirdeği oluşturma ve sonuçları Android Açık Kaynak Projesi'nden (AOSP) oluşturulmuş bir sistem görüntüsüne yerleştirme sürecinde size rehberlik eder.

Repo kullanarak daha yeni çekirdek kaynakları edinebilirsiniz; kaynak ödemenizin kökünden build/build.sh çalıştırarak bunları daha fazla yapılandırma olmadan oluşturun.

Kaynakları indirme ve araçları oluşturma

En son çekirdekler için kaynakları, araç zincirini indirmek ve komut dosyaları oluşturmak için repo kullanın. Bazı çekirdekler (örneğin, Pixel 3 çekirdekleri) birden çok git deposundan kaynaklar gerektirirken, diğerleri (örneğin, ortak çekirdekler) yalnızca tek bir kaynak gerektirir. repo yaklaşımının kullanılması, doğru bir kaynak dizin kurulumu sağlar.

Uygun şube için kaynakları indirin:

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

Aşağıdaki tablo, bu yöntemle kullanılabilen çekirdekler için BRANCH adlarını listeler.

Cihaz AOSP ağacında ikili yol repo şubeleri
Piksel 6 (oriole)
Pixel 6 Pro (kuzgun)
cihaz/google/mantı-çekirdek android-gs-raviole-5.10-android12L
Piksel 5a (barbet) cihaz/google/barbet-çekirdek android-msm-barbet-4.19-android12L
Piksel 5 (kırmızı yüzgeçli)
Pixel 4a (5G) (böğürtlen)
cihaz/google/redbull çekirdeği android-msm-redbull-4.19-android12L
Pixel 4a (güneş balığı) cihaz/google/sunfish-çekirdeği android-msm-sunfish-4.14-android12L
Piksel 4 (alev)
Pixel 4 XL (mercan)
cihaz/google/mercan çekirdeği android-msm-coral-4.14-android12L
Piksel 3a (sargo)
Pixel 3a XL (palamut)
cihaz/google/palamut çekirdeği android-msm-palamut-4.9-android12L
Piksel 3 (mavi çizgi)
Pixel 3 XL (çapraz tarama)
cihaz/google/crosshatch-çekirdeği android-msm-crosshatch-4.9-android12
Piksel 2 (duvar gözü)
Pixel 2 XL (taimen)
cihaz/google/wahoo çekirdeği android-msm-wahoo-4.4-android10-qpr3
Piksel (yelken balığı)
Piksel XL (marlin)
cihaz/google/marlin-çekirdeği android-msm-marlin-3.18-pie-qpr2
Hikey960 cihaz/linaro/hikey-çekirdek zambak-linaro-android-4.14
zambak-linaro-android-4.19
ortak-android12-5.4
beagle x15 cihaz/ti/beagle_x15-çekirdek omap-beagle-x15-android-4.14
omap-beagle-x15-android-4.19
Android Ortak Çekirdeği Yok ortak-android-4.4
ortak-android-4.9
ortak-android-4.14
ortak-android-4.19
ortak-android-4.19-kararlı
ortak-android11-5.4
ortak-android12-5.4
ortak-android12-5.10
ortak-android-ana hat

Çekirdeği inşa etmek

Ardından çekirdeği bununla oluşturun:

build/build.sh

Çekirdek ikili dosyası, modüller ve ilgili görüntü out/ BRANCH /dist dizininde bulunur.

GKI modüllerini oluşturma

Android 11, çekirdeği Google tarafından yönetilen bir çekirdek görüntüsü ve ayrı olarak oluşturulan satıcı tarafından sağlanan modüller olarak ayıran GKI'yi tanıttı.

Bu örnek, bir çekirdek görüntü yapılandırmasını gösterir:

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

Bu örnekte bir modül konfigürasyonu (Mürekkep Balığı ve Öykünücü) gösterilmektedir:

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

Android 12'de Mürekkep Balığı ve Japon Balığı birleşir, böylece aynı çekirdeği paylaşırlar: 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

Çekirdeği çalıştırmak

Özel olarak oluşturulmuş bir çekirdeği çalıştırmanın birden çok yolu vardır. Aşağıdakiler, çeşitli geliştirme senaryoları için uygun bilinen yöntemlerdir.

Android görüntü derlemesine gömme

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

Alternatif olarak, make bootimage (veya bir önyükleme görüntüsü oluşturan başka bir make komut satırı) kullanırken TARGET_PREBUILT_KERNEL değişkenini tanımlayın. Bu değişken, device/common/populate-new-device.sh aracılığıyla kurulduğundan 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 başlatma sürecini 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 gerçekten parlamaz ve yeniden başlatma boyunca devam etmez.

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

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

Çevre değişkeni Tanım Misal
BUILD_CONFIG Yapı ortamını başlattığınız yerden yapılandırma dosyası oluşturun. Konum, Repo kök dizinine göre tanımlanmalıdır. build.config için varsayılanlar.
Ortak çekirdekler için zorunludur.
BUILD_CONFIG=common/build.config.gki.aarch64
CC Kullanılacak derleyiciyi geçersiz kıl. 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 SKIP_DEFCONFIG=1
SKIP_MRPROPER make mrproper SKIP_MRPROPER=1

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

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

POST_DEFCONFIG_CMDS değişkenini, olağan make defconfig adımı tamamlandıktan hemen sonra değerlendirilen bir ifadeye ayarlayın. build.config dosyaları derleme ortamında kaynaklandığından, build.config içinde tanımlanan işlevler, yapılandırma 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 optimizasyonunu (LTO) devre dışı bırakmaktır. LTO, serbest bırakılan çekirdekler için faydalı olsa da, derleme sırasındaki ek yük önemli olabilir. Yerel build.config eklenen aşağıdaki snippet, 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 belirleme

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ümleri 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, 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ına karşı 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. Bunu yapmak için bir GKI önyükleme görüntüsünü indirerek ve paketini açarak elde edebileceğiniz bir ramdisk ikili dosyasına ihtiyacınız vardır. İlişkili Android sürümünden 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 tools/mkbootimg/out/ramdisk gki-ramdisk.lz4

Hedef klasör, çekirdek ağacının en üst düzey dizinidir (geçerli çalışma dizini).

AOSP master ile geliştiriyorsanız, bunun yerine ramdisk-recovery.img yapı yapıtını ci.android.com'daki bir aosp_arm64 yapısından indirebilir ve bunu ramdisk ikili dosyanız olarak kullanabilirsiniz.

Bir ramdisk ikili dosyasına sahip olduğunuzda ve onu çekirdek yapısının kök dizininde gki-ramdisk.lz4 kopyaladığınızda, aşağıdakileri 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 yerine bzImage 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 dizininde bulunur.

Önyükleme görüntüsü out/<kernel branch>/dist/boot.img .