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'yu kullanarak daha yeni çekirdek kaynakları elde edebilirsiniz; kaynak ödemenizin kök dizininden build/build.sh komutunu çalıştırarak bunları daha fazla yapılandırma olmadan oluşturun.

Kaynakları indirme ve araçları oluşturma

En yeni ç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 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.

Uygun şube için kaynakları indirin:

mkdir android-kernel && cd android-kernel
repo init -u https://android.googlesource.com/kernel/manifest -b BRANCH
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 7 (panter)
Pixel 7 Pro (çita)
cihaz/google/pantah çekirdeği android-gs-pantah-5.10-android13-qpr2
Piksel 6a (mavi alakarga) cihaz/google/bluejay çekirdeği android-gs-bluejay-5.10-android13-qpr2
Piksel 6 (asma)
Pixel 6 Pro (kuzgun)
cihaz/google/raviole çekirdeği android-gs-raviole-5.10-android13-qpr2
Piksel 5a (baret)
Piksel 5 (kırmızı yüzgeçli)
Piksel 4a (5G) (böğürtlen)
cihaz/google/redbull-kernel android-msm-redbull-4.19-android13-qpr2
Piksel 4a (güneş balığı) cihaz/google/güneş balığı çekirdeği android-msm-sunfish-4.14-android13-qpr2
Piksel 4 (alev)
Pixel 4 XL (mercan)
cihaz/google/mercan çekirdeği android-msm-mercan-4.14-android13
Piksel 3a (şarj)
Pixel 3a XL (palamut)
cihaz/google/bonito-çekirdek android-msm-bonito-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 (telefon)
cihaz/google/wahoo-kernel android-msm-wahoo-4.4-android10-qpr3
Piksel (yelken balığı)
Piksel XL (marlin)
cihaz/google/marlin çekirdeği android-msm-marlin-3.18-pasta-qpr2
Hikey960 cihaz/linaro/hikey çekirdeği zamey-linaro-android-4.14
zamey-linaro-android-4.19
ortak-android12-5.4
ortak-android13-5.10
Tazı 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-android14-5.15
ortak-android14-6.1
ortak-android-ana hat

çekirdeği oluşturmak

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

build/build.sh

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

Bazel (Kleaf) ile Bina

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

aarch64 mimarisi için GKI çekirdeğini oluşturmak üzere, Android 13'ten önce 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ıların konumu için komutun çıktısına bakın. Ayrıntılar için, AOSP ile ilgili belgelere bakın.

Sanal Aygıt için Satıcı Modüllerini Oluşturma

Android 11, çekirdeği Google tarafından yönetilen bir çekirdek görüntüsüne ve ayrı olarak oluşturulmuş satıcı tarafından sağlanan modüllere ayıran GKI'yi kullanıma sundu.

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 yapılandırması gösterilmektedir (Cuttlefish ve Emulator):

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

Android 12'de Mürekkepbalığı ve Japon Balığı bir araya gelerek aynı çekirdeği paylaşırlar: virtual_device . Bu çekirdeğin modüllerini oluşturmak için şu 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: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şturma hakkında daha fazla ayrıntı için bkz. Kleaf - Bazel ile Android Çekirdeği Oluşturma .

Bireysel mimariler için Kleaf desteği hakkında ayrıntılar için bkz. Cihazlar ve çekirdekler için Kleaf desteği .

Cihazlar ve çekirdekler için Kleaf desteği

Aşağıdaki tablo, bireysel aygıt çekirdekleri için Kleaf desteğini listeler. Listelenmemiş cihazlar için lütfen cihaz üreticisiyle iletişime geçin.

Cihaz repo şubeleri Kleaf desteği build/build.sh desteği
Android Ortak Çekirdeği
db845c
Sanal Cihaz (x86_64, arm64)
Sanal Cihaz (i686, kol)
Rockpi4
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
Android Ortak Çekirdeği ortak-android13-5.10
ortak-android13-5.15
✅ (resmi) 1
Android Ortak Çekirdeği ortak-android14-5.15
ortak-android14-6.1
ortak-android-ana hat
db845c ortak-android13-5.10
db845c ortak-android13-5.15 ✅ (resmi) 1
db845c ortak-android14-5.15
ortak-android14-6.1
ortak-android-ana hat
Sanal Cihaz (x86_64, arm64) ortak-android13-5.10
ortak-android13-5.15
✅ (resmi) 1 ⚠️ (bakımsız) 2
Sanal Cihaz (x86_64, arm64) ortak-android14-5.15
ortak-android14-6.1
ortak-android-ana hat
Sanal Cihaz (i686, kol) ortak-android13-5.10
ortak-android13-5.15
Sanal Cihaz (i686, kol) ortak-android14-5.15
ortak-android14-6.1
ortak-android-ana hat
Rockpi4 ortak-android13-5.10
ortak-android13-5.15
Rockpi4 ortak-android14-5.15
ortak-android14-6.1
ortak-android-ana hat
Hikey960 zamey-linaro-android-4.14
zamey-linaro-android-4.19
ortak-android12-5.4
ortak-android13-5.10
fips140 modülü ortak-android12-5.10
ortak-android13-5.10
ortak-android13-5.15
fips140 modülü ortak-android14-5.15

1 "Resmi", çekirdeği oluşturmak için alternatif yol da kullanılabilse de, bunun çekirdeği oluşturmanın resmi yolu olduğu anlamına gelir.

2 "Bakımsız", bu yöntemle çekirdek oluşturmanın çalışması gerektiği, ancak derleme yönteminin sürekli olarak test edilmediği anlamına gelir. Gelecekte inşaatı durdurabilir. Bunun yerine inşa etmek için "resmi" yolu kullanın.

Çekirdeği çalıştırma

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

Android görüntü yapısına gömme

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, TARGET_PREBUILT_KERNEL değişkenini make bootimage (veya bir önyükleme görüntüsü oluşturan başka herhangi bir make komut satırı) kullanırken 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

Çoğu yeni aygıtta, 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 aslında parlamaz ve yeniden başlatma boyunca devam etmez.

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

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

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ı uygun bir varsayılan yapılandırma ile gelmelidir. En sık kullanılanlar burada listelenmiştir. Eksiksiz (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. Konum, Repo kök dizinine göre tanımlanmalıdır. Varsayılan olarak build.config .
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 derlemesi 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ı

Ö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 amaçları için bir seçeneğin ayarlanmasına ihtiyacınız varsa, bu esnekliği, yapı yapılandırmasının yerel bir değişikliğini veya kopyasını koruyarak elde edebilirsiniz.

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 kaynaklandığından, build.config içinde tanımlanan işlevler, post-defconfig komutlarını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, serbest bırakılan çekirdekler için faydalı olsa da, oluşturma zamanı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 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ü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, 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.

init_boot ile Aygıtlar için Önyükleme Görüntüsü Oluşturma

init_boot bölümü olan 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 katıştırılmamıştır.

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

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

build/build.sh 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 konumunda bulunur.

init_boot olmadan Aygıtlar için Önyükleme Görüntüsü Oluşturma

init_boot bölümü olmayan aygıtlar için, bir GKI önyükleme görüntüsünü indirip paketinden çıkararak 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 (mevcut çalışma dizini) en üst düzey dizinidir.

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

Bir ramdisk ikili dosyanız olduğunda ve onu çekirdek yapısının kök dizinindeki 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 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.