Ta strona zawiera szczegółowe informacje o procesie tworzenia niestandardowych jąder na urządzenia z Androidem. Te instrukcje przeprowadzą Cię przez proces wybierania odpowiednich źródeł, kompilowania jądra i osadzania wyników w obrazie systemu utworzonym na podstawie projektu Android Open Source (AOSP).
Najnowsze źródła jądra możesz pobrać za pomocą Repo. Aby je skompilować bez dalszej konfiguracji, uruchom build/build.sh
w katalogu głównym źródła.
Pobieranie źródeł i narzędzi do kompilacji
W przypadku najnowszych jąder użyj repo
, aby pobrać źródła, zestaw narzędzi i skrypty kompilacji.
Niektóre jądra (np. jądra Pixela 3) wymagają źródeł z kilku repozytoriów Git, podczas gdy inne (np. wspólne jądra) wymagają tylko jednego źródła. Korzystanie z metody repo
zapewnia prawidłową konfigurację katalogu źródeł.
Pobierz źródła dla odpowiedniej gałęzi:
mkdir android-kernel && cd android-kernel
repo init -u https://android.googlesource.com/kernel/manifest -b BRANCH
repo sync
Lista gałęzi repozytorium (BRANCH), których można używać z poprzednią `repo init`; patrz Ggałęzie jądra i ich systemy kompilacji.
Szczegółowe informacje o pobieraniu i kompilowaniu jąder na urządzeniach Pixel znajdziesz w artykule Kompilowanie jąder Pixel.
Kompilowanie jądra
Kompilowanie za pomocą Bazel (Kleaf)
W Androidzie 13 wprowadzono jądra w systemie Bazel.
Aby utworzyć dystrybucję jądra GKI dla architektury aarch64, pobierz gałąź wspólnego jądra Androida, która nie jest starsza niż Android 13, a potem uruchom to polecenie:
tools/bazel run //common:kernel_aarch64_dist [-- --destdir=$DIST_DIR]
Następnie binarny jądro, moduły i odpowiednie obrazy znajdują się w katalogu $DIST_DIR
. Jeśli wartość --destdir
nie jest określona, sprawdź dane wyjściowe
polecenia lokalizacji artefaktów. Szczegółowe informacje znajdziesz w dokumentacji AOSP.
Kompilowanie za pomocą build.sh (starsza wersja)
Odgałę na Androidzie 12 lub starszym LUB na gałęzi bez Kleaf:
build/build.sh
Plik binarny jądra, moduły i odpowiadający mu obraz znajdują się w
Katalog out/BRANCH/dist
.
Kompilowanie modułów dostawcy na potrzeby urządzenia wirtualnego
W Androidzie 13 wprowadzono jądra w systemie
Bazel (Kleaf), zastępując build.sh
.
Aby utworzyć dystrybucję dla modułów usługi virtual_device
, uruchom:
tools/bazel run //common-modules/virtual-device:virtual_device_x86_64_dist [-- --destdir=$DIST_DIR]
Więcej informacji o generowaniu jąder Androida za pomocą Bazel znajdziesz tutaj: Kleaf – tworzenie rdzeni Androida przy użyciu Bazel.
Szczegółowe informacje o obsługiwanych przez Kleaf architekturach znajdziesz w artykule Obsługa Kleaf w przypadku urządzeń i jąder.
Tworzenie modułów dostawcy dla urządzenia wirtualnego za pomocą pliku build.sh (starsza wersja)
Na Androidzie 12 mątwy i złota rybka są takie same, że
to samo jądro: virtual_device
. Aby skompilować moduły tego jądra, użyj tej konfiguracji kompilacji:
BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64 build/build.sh
Wprowadzenie Androida 11 GKI który dzieli jądra systemu na obsługiwany przez Google obraz jądra i moduły utrzymywane przez dostawcę, które tworzy się oddzielnie.
Ten przykład pokazuje konfigurację obrazu jądra:
BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh
Ten przykład pokazuje konfigurację modułu (Cuttlefish i Emulator):
BUILD_CONFIG=common-modules/virtual-device/build.config.cuttlefish.x86_64 build/build.sh
Uruchamianie jądra
Niestandardowe jądro można uruchomić na kilka sposobów. Oto do różnych scenariuszy programowania.
Umieść w kompilacji obrazu Androida
Skopiuj plik Image.lz4-dtb
do odpowiedniej lokalizacji binarnej jądra
w drzewie AOSP i od nowa skompiluj obraz rozruchowy.
Możesz też zdefiniować TARGET_PREBUILT_KERNEL
podczas korzystania z funkcji make bootimage
(lub dowolnej innej
make
wiersza poleceń, który tworzy obraz rozruchowy). Ta zmienna to
obsługiwane przez wszystkie urządzenia po skonfigurowaniu za pomocą
device/common/populate-new-device.sh
Na przykład:
export TARGET_PREBUILT_KERNEL=DIST_DIR/Image.lz4-dtb
Flashowanie i uruchamianie jądra za pomocą fastboot
Większość współczesnych urządzeń ma rozszerzenie programu rozruchowego, które upraszcza proces podczas generowania i uruchamiania obrazu rozruchowego.
Aby uruchomić jądro bez flashowania:
adb reboot bootloader
fastboot boot Image.lz4-dtb
W przypadku tej metody jądro nie jest instalowane i nie będzie trwałe po ponownym uruchomieniu.
Uruchom jądro na mątwie
Na urządzeniach typu Cuttlefish możesz uruchamiać jądra o dowolnej architekturze.
Aby uruchomić urządzenie Cuttlefish z określonym zestawem elementów jądra, uruchom polecenie cvd create
, podając jako parametry docelowe elementy jądra. Poniższe przykładowe polecenie używa artefaktów jądra dla środowiska docelowego arm64 z
Plik manifestu jądra common-android14-6.1
.
cvd create \
-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
Więcej informacji znajdziesz w artykule Tworzenie jąder w Cuttlefish.
Dostosowywanie wersji jądra
Aby dostosować kompilacje jądra pod kątem kompilacji Kleaf, zapoznaj się z artykułem Dokumentacja Kleaf.
Dostosowywanie kompilacji jądra przy użyciu pliku build.sh (starsza wersja)
W przypadku aplikacji build/build.sh
proces kompilacji i jego wynik może mieć wpływ
według zmiennych środowiskowych.
Większość z nich jest opcjonalna, a każda gałąź jądra powinna być dostarczana z odpowiednią domyślną konfiguracją. Tutaj znajdziesz listę najczęściej używanych. Dla
pełną (i aktualną) listę, zapoznaj się z tym artykułem: build/build.sh
.
Zmienna środowiskowa | Opis | Przykład |
---|---|---|
BUILD_CONFIG |
Plik konfiguracji kompilacji z miejsca, w którym inicjujesz środowisko kompilacji.
Lokalizacja musi być zdefiniowana względem katalogu głównego repozytorium. Domyślna wartość to build.config .Wymagany w przypadku wspólnych jąder. |
BUILD_CONFIG=common/build.config.gki.aarch64 |
CC |
Kompilator do zastąpienia. W przeciwnym razie użyje domyślnego kompilatora określonego przez zmienną build.config . |
CC=clang |
DIST_DIR |
Podstawowy katalog wyjściowy dla dystrybucji jądra. | DIST_DIR=/path/to/my/dist |
OUT_DIR |
Podstawowy katalog wyjściowy kompilacji jądra. | OUT_DIR=/path/to/my/out |
SKIP_DEFCONFIG |
Pomiń make defconfig |
SKIP_DEFCONFIG=1 |
SKIP_MRPROPER |
Pomiń make mrproper |
SKIP_MRPROPER=1 |
Niestandardowa konfiguracja jądra na potrzeby kompilacji lokalnych
W Androidzie 14 i nowszych możesz używać fragmentów defconfig do dostosowywania konfiguracji jądra. Więcej informacji znajdziesz w dokumentacji Kleaf na temat fragmentów defconfig.
Niestandardowa konfiguracja jądra lokalnych kompilacji z konfiguracjami kompilacji (starsza wersja)
W przypadku Androida 13 i starszych:
Jeśli musisz regularnie przełączać opcję konfiguracji jądra, na przykład podczas pracy nad funkcją, lub jeśli musisz ustawić opcję na potrzeby rozwoju, możesz uzyskać taką elastyczność, zachowując lokalną modyfikację lub kopię konfiguracji kompilacji.
Ustaw zmienną POST_DEFCONFIG_CMDS na instrukcję, która jest oceniana bezpośrednio po zakończeniu zwykłego kroku make defconfig
. Ponieważ pliki build.config
są źródłem danych w środowisku kompilacji, funkcje zdefiniowane w pliku build.config
mogą być wywoływane w ramach poleceń po konfiguracji definicji.
Typowym przykładem jest wyłączenie optymalizacji czasu linku (LTO) dla kresek w postaci krzyżowej.
jądra systemu podczas programowania. Chociaż LTO jest korzystne w przypadku opublikowanych jąder, nakład pracy w czasie kompilacji może być znaczny. Ten fragment kodu dodany do lokalnego pliku build.config
wyłącza LTO na stałe podczas korzystania z pliku build/build.sh
.
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)
}
Identyfikowanie wersji jądra
Prawidłową wersję do skompilowania możesz wskazać na podstawie 2 źródeł: drzewa AOSP oraz obraz systemu.
Wersja jądra z drzewa AOSP
Drzewo AOSP zawiera gotowe wersje jądra. Log gita pokazuje poprawną wersję w ramach wiadomości o zmianie:
cd $AOSP/device/VENDOR/NAME
git log --max-count=1
Jeśli wersja jądra nie jest wymieniona w logu git, pobierz ją z obrazu systemu, jak opisano poniżej.
Wersja jądra z obrazu systemu
Aby określić wersję jądra używaną w pliku obrazu systemu, uruchom to polecenie w pliku jądra:
file kernel
W przypadku plików Image.lz4-dtb
wykonaj:
grep -a 'Linux version' Image.lz4-dtb
Tworzenie obrazu rozruchowego
Obraz rozruchowy można utworzyć, korzystając ze środowiska kompilacji jądra.
Tworzenie obrazu rozruchowego dla urządzeń z parametrem init_boot
Urządzenia z
partycji init_boot
,
obraz rozruchowy jest kompilowany
razem z jądrem systemu. Obraz initramfs
nie jest osadzony w obrazie rozruchowym.
Na przykład w przypadku Kleaf możesz utworzyć obraz startowy GKI za pomocą:
tools/bazel run //common:kernel_aarch64_dist [-- --destdir=$DIST_DIR]
W przypadku build/build.sh
(starsza wersja) możesz utworzyć obraz startowy GKI za pomocą:
BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh
Obraz rozruchowy GKI znajduje się w regionie $DIST_DIR.
Tworzenie obrazu rozruchowego dla urządzeń bez parametru init_boot (starsza wersja)
Urządzenia bez
partycji init_boot
,
potrzebny jest plik binarny Ramdisk, który można pobrać
pobieranie obrazu rozruchowego GKI
i rozpakowywania. Dobrze sprawdzi się dowolny obraz GKI z powiązanej wersji Androida.
tools/mkbootimg/unpack_bootimg.py --boot_img=boot-5.4-gz.img
mv $KERNEL_ROOT/out/ramdisk gki-ramdisk.lz4
Folder docelowy to katalog główny drzewa jądra (bieżący katalog roboczy).
Jeśli pracujesz z wersją główną AOSP, możesz zamiast tego pobrać artefakt kompilacji ramdisk-recovery.img
z kompilacji aosp_arm64 na stronie ci.android.com i użyć go jako binarnego pliku ramdisk.
Gdy masz plik binarny dysku RAM i skopiujesz go do katalogu gki-ramdisk.lz4
w katalogu głównym kompilacji jądra, możesz wygenerować obraz rozruchowy, wykonując polecenie:
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
Jeśli pracujesz na architekturze x86, zastąp Image
wartością bzImage
, a aarch64
wartością x86_64
:
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
Ten plik znajduje się w katalogu artefaktów
$KERNEL_ROOT/out/$KERNEL_VERSION/dist
.
Obraz rozruchowy znajduje się pod adresem out/<kernel branch>/dist/boot.img
.