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 dosyasını çalıştırarak daha fazla yapılandırma olmadan bunları 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 6a (mavi alakarga) cihaz/google/bluejay çekirdeği android-gs-bluejay-5.10-android12L-d2
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
Piksel 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/çapraz tarama ç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-android13-5.10
ortak-android13-5.15
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.

Bazel ile Bina (Kleaf)

Android 13, build/build.sh yerine Bazel ile yapı çekirdeklerini tanıttı.

aarch64 mimarisi için GKI çekirdeğini oluşturmak için şunu ç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 ilgili görüntüler $DIST_DIR dizininde bulunur. --dist_dir belirtilmemişse, yapıların konumu için komutun çıktısına bakın. Ayrıntılar için , AOSP ile ilgili belgelere bakın.

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 örnek, bir modül yapılandırmasını gösterir (Mürekkep Balığı ve Öykünücü):

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

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_x86_64_dist

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

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

Bazel ile Kleaf oluşturma çekirdekleri hakkında daha fazla ayrıntı için , AOSP ile ilgili belgelere bakın.

Ç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 ayarlandığından 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 Örnek
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 $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 master ile geliştirme yapıyorsanız, bunun yerine ramdisk-recovery.img derleme yapıtını ci.android.com'daki bir aosp_arm64 derlemesinden 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 .