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
.