Bu sayfada Android cihazlar için özel çekirdekler oluşturma süreci ayrıntılarıyla anlatılmaktadır. Bu talimatlar, doğru kaynakları seçme, çekirdeği oluşturma ve sonuçları Android Açık Kaynak Projesi'nden (AOSP) oluşturulan bir sistem görüntüsüne yerleştirme sürecinde size rehberlik eder.
Repo'yu kullanarak daha yeni çekirdek kaynaklarını edinebilirsiniz; kaynak ödemenizin kökünden build/build.sh
dosyasını çalıştırarak bunları daha fazla yapılandırmaya gerek kalmadan oluşturun.
Kaynakları indirme ve araçları oluşturma
En yeni çekirdekler için kaynakları, araç zincirini indirmek ve komut dosyalarını oluşturmak için repo
kullanın. Bazı çekirdekler (örneğin Pixel 3 çekirdekleri) birden fazla 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.
İlgili dalın kaynaklarını 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 Android Common çekirdekleri ve geliştirme kartları için BRANCH adlarını listelemektedir. Pixel aygıtlarına yönelik çekirdeklerin indirilmesi ve derlenmesiyle ilgili ayrıntılar için Piksel Çekirdekleri Oluşturma bölümüne bakın.
Cihaz | AOSP ağacındaki ikili yol | Repo şubeleri |
---|---|---|
Hikey960 | cihaz/linaro/hikey-çekirdeği | hikey-linaro-android-4.14 hikey-linaro-android-4.19 ortak-android12-5.4 ortak-android13-5.10 |
Beagle x15 | cihaz/ti/beagle_x15-kernel | 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
Bazeli Bina (Kleaf)
Android 13, Bazel ile yapı çekirdeklerini tanıttı.
Aarch64 mimarisine yönelik GKI çekirdeğini oluşturmak için Android 13'ten daha eski 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ıtların konumu için komutun çıktısına bakın. Ayrıntılar için AOSP'deki belgelere bakın.
build.sh ile oluşturma (eski)
Android 12 veya altındaki şubeler için VEYA Kleaf olmayan şubeler için:
build/build.sh
Çekirdek ikili dosyası, modüller ve karşılık gelen görüntü out/ BRANCH /dist
dizininde bulunur.
Sanal Cihaz için Satıcı Modüllerinin Oluşturulması
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şturmaya ilişkin daha fazla ayrıntı için bkz. Kleaf - Bazel ile Android Çekirdekleri Oluşturma .
Bireysel mimarilere yönelik Kleaf desteğine ilişkin ayrıntılar için bkz. Cihazlar ve çekirdekler için Kleaf desteği .
Build.sh (eski) ile Sanal Cihaz için Satıcı Modüllerinin Oluşturulması
Android 12'de Mürekkepbalığı ve Japon Balığı birleşiyor, dolayısıyla aynı çekirdeği paylaşıyorlar: 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 11, çekirdeği Google tarafından korunan bir çekirdek görüntüsüne ve ayrı olarak oluşturulan satıcı tarafından korunan modüllere ayıran GKI'yı tanıttı.
Bu örnekte bir çekirdek görüntüsü yapılandırması gösterilmektedir:
BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh
Bu örnekte bir modül konfigürasyonu gösterilmektedir (Mürekkepbalığı ve Emülatör):
BUILD_CONFIG=common-modules/virtual-device/build.config.cuttlefish.x86_64 build/build.sh
Cihazlar ve çekirdekler için Kleaf desteği
Aşağıdaki tabloda, ayrı cihaz çekirdekleri için Kleaf desteği listelenmektedir. Listelenmeyen 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-android15-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-android15-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-android15-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-android15-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-android15-6.1 ortak-android-ana hat | ✅ | ❌ |
Hikey960 | hikey-linaro-android-4.14 hikey-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 durdurulabilir. Bunun yerine "resmi" yöntemi kullanın. |
Çekirdeği çalıştırma
Özel oluşturulmuş bir çekirdeği çalıştırmanın birden fazla yolu vardır. Aşağıdakiler çeşitli geliştirme senaryolarına uygun bilinen yöntemlerdir.
Android görüntü yapısına yerleştirme
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, make bootimage
(veya önyükleme görüntüsü oluşturan herhangi bir make
komut satırını) 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ığı 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
En yeni cihazlarda, bir önyükleme görüntüsü oluşturma ve önyükleme işlemini 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 flashlanmaz ve yeniden başlatma sırasında kalıcı olmaz.
Mürekkep balığı üzerinde çekirdek çalıştırma
Cuttlefish cihazlarda kernelleri istediğiniz mimaride çalıştırabilirsiniz.
Mürekkepbalığı aygıtını belirli bir çekirdek yapıtları kümesiyle başlatmak için, hedef çekirdek yapıtlarını parametre olarak kullanarak cvd start
komutunu çalıştırın. Aşağıdaki örnek komut common-android14-6.1
çekirdek bildirimindeki bir arm64 hedefi için çekirdek yapıtlarını kullanır.
cvd start \
-kernel_path=/$PATH/$TO/common-android14-6.1/out/android14-6.1/dist/Image \
-initramfs_path=/$PATH/$TO/common-android14-6.1/out/android14-6.1/dist/initramfs.img
Daha fazla bilgi için bkz . Mürekkepbalığında çekirdek geliştirme .
Çekirdek yapısını özelleştirme
Çekirdek yapılarını Kleaf yapılarına göre özelleştirmek için Kleaf belgelerine bakın.
Çekirdek yapısını build.sh (eski) ile özelleştirme
build/build.sh
için derleme süreci ve sonuç, ortam değişkenlerinden etkilenebilir. Çoğu isteğe bağlıdır ve her çekirdek dalının uygun bir varsayılan yapılandırmayla gelmesi gerekir. En sık kullanılanlar burada listelenmiştir. Tam (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. Konumun Repo kök dizinine göre tanımlanması gerekir. Varsayılan olarak build.config şeklindedir.Ortak çekirdekler için zorunludur. | BUILD_CONFIG=common/build.config.gki.aarch64 |
CC | Kullanılacak derleyiciyi geçersiz kılın. 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 atla | SKIP_DEFCONFIG=1 |
SKIP_MRPROPER | make mrproper atla | SKIP_MRPROPER=1 |
Yerel derlemeler için özel çekirdek yapılandırması
Android 14 ve üzeri sürümlerde, çekirdek yapılandırmalarını özelleştirmek için defconfig parçalarını kullanabilirsiniz. defconfig parçaları hakkında Kleaf belgelerine bakın.
Yapı yapılandırmalarına sahip yerel yapılar için özel çekirdek yapılandırması (eski)
Android 13 ve önceki sürümlerde aşağıdakilere bakın.
Ö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 amacıyla bir seçeneğin ayarlanmasına ihtiyacınız varsa, bu esnekliği yerel bir değişiklik yaparak veya yapı yapılandırmasının bir kopyasını koruyarak elde edebilirsiniz.
POST_DEFCONFIG_CMDS değişkenini, olağan make defconfig
adımı tamamlandıktan hemen sonra değerlendirilecek bir ifadeye ayarlayın. build.config
dosyaları derleme ortamına kaynaklandığından, build.config
tanımlanan işlevler, defconfig 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 optimizasyonunun (LTO) devre dışı bırakılmasıdır. LTO, piyasaya sürülen çekirdekler için faydalı olsa da, derleme sırası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 tanımlama
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, onu aşağıda açıklandığı gibi sistem görüntüsünden edinin.
Sistem görüntüsünden çekirdek sürümü
Sistem görüntüsünde kullanılan çekirdek sürümünü belirlemek için çekirdek dosyasında 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
Cihazlar için Önyükleme Görüntüsü Oluşturma
init_boot
bölümüne sahip 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 eklenmemiştir.
Örneğin, Kleaf ile GKI önyükleme görüntüsünü şununla oluşturabilirsiniz:
tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$DIST_DIR
build/build.sh
(eski) ile GKI önyükleme görüntüsünü şununla 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
olmayan Cihazlar için Önyükleme Görüntüsü Oluşturma (eski)
init_boot
bölümü olmayan cihazlar için, bir GKI önyükleme görüntüsü indirip paketini açarak elde edebileceğiniz bir ramdisk ikili dosyasına ihtiyacınız vardır. İlgili Android sürümündeki 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 main ile geliştirme yapıyorsanız bunun yerine ci.android.com adresindeki bir aosp_arm64 derlemesinden ramdisk-recovery.img
derleme yapıtını indirebilir ve bunu ramdisk ikili dosyanız olarak kullanabilirsiniz.
Bir ramdisk ikili programına sahip olduğunuzda ve onu çekirdek yapısının kök dizinindeki gki-ramdisk.lz4
dosyasına kopyaladığınızda, aşağıdakileri çalıştırarak 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.