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.