Auf dieser Seite wird das Erstellen benutzerdefinierter kernels für Android-Geräte. Diese Anleitung zur Auswahl der richtigen Quellen, Erstellen des Kernels und Einbetten der Ergebnisse in ein System-Image basierend auf dem Android Open Source Project (AOSP).
Neuere Kernel-Quellen erhalten Sie mit
Repository: um sie zu erstellen, ohne
indem Sie build/build.sh
im Stammverzeichnis Ihres
Quelle für den Bezahlvorgang.
Quellen und Build-Tools herunterladen
Verwenden Sie für aktuelle Kernel repo
.
um die Quellen, die Toolchain und die Build-Skripts herunterzuladen.
Einige Kernel (z. B. die Pixel 3-Kernel) benötigen Quellen von mehreren Git.
und bei anderen (z. B. den allgemeinen Kerneln) nur ein einziges
Quelle. Mit dem repo
-Ansatz wird eine korrekte Quelle sichergestellt.
Verzeichniseinrichtung.
Laden Sie die Quellen für den entsprechenden Zweig herunter:
mkdir android-kernel && cd android-kernel
repo init -u https://android.googlesource.com/kernel/manifest -b BRANCH
repo sync
Eine Liste der Repository-Zweige (BRANCH), die mit dem vorherigen den Befehl „repo init“, siehe Kernel-Zweige und zugehörige Build-Systeme
Weitere Informationen zum Herunterladen und Kompilieren von Kerneln für Pixel finden Sie unter <ph type="x-smartling-placeholder"></ph> Pixel-Kernel erstellen
Kernel erstellen
Mit Bazel (Kleaf) erstellen
Mit Android 13 wurden Kernel mit Bazel:
Informationen zum Erstellen des GKI-Kernels für die aarch64-Architektur finden Sie in Android Common Kernel-Zweig nicht älter als Android 13 und und führen Sie dann den folgenden Befehl aus:
tools/bazel build //common:kernel_aarch64_dist
Führen Sie folgenden Befehl aus, um eine Verteilung zu erstellen:
tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$DIST_DIR
Danach befinden sich die Kernel-Binärdatei, die Module und die entsprechenden Images im
$DIST_DIR
-Verzeichnis. Wenn --dist_dir
nicht angegeben ist, siehe Ausgabe
des Befehls für den Standort der Artefakte. Weitere Informationen finden Sie in der
Dokumentation zu AOSP
Build mit build.sh (Legacy)
Für Filialen ab Android 12 ODER Zweige ohne Kleaf:
build/build.sh
Die Kernel-Binärdatei, die Module und das entsprechende Image befinden sich im
out/BRANCH/dist
-Verzeichnis.
Anbietermodule für das virtuelle Gerät erstellen
Mit Android 13
wurden Kernel mit
Bazel (Kleaf) und ersetzt build.sh
.
Führen Sie folgenden Befehl aus, um die Module von virtual_device
zu erstellen:
tools/bazel build //common-modules/virtual-device:virtual_device_x86_64_dist
Führen Sie folgenden Befehl aus, um eine Verteilung zu erstellen:
tools/bazel run //common-modules/virtual-device:virtual_device_x86_64_dist -- --dist_dir=$DIST_DIR
Weitere Informationen zum Erstellen von Android-Kerneln mit Bazel finden Sie unter. Kleaf – Building Android Kernels with Base
Weitere Informationen zur Kleaf-Unterstützung für einzelne Architekturen finden Sie unter Kleaf-Unterstützung für Geräte und Kernel
Anbietermodule für das virtuelle Gerät mit build.sh (Legacy) erstellen
In Android 12 vereinen sich Tintenfisch und Goldfische.
denselben Kernel: virtual_device
. Verwende diesen Build, um die Module dieses Kernels zu erstellen
Konfiguration:
BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64 build/build.sh
Einführung von Android 11 Google Maps Platform der den Kernel in ein von Google verwaltetes Kernel-Image und von Anbietern verwaltete Module unterteilt. die separat erstellt werden.
Dieses Beispiel zeigt die Konfiguration eines Kernel-Images:
BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh
Das folgende Beispiel zeigt eine Modulkonfiguration (Cuttlefish und Emulator):
BUILD_CONFIG=common-modules/virtual-device/build.config.cuttlefish.x86_64 build/build.sh
Kernel ausführen
Es gibt mehrere Möglichkeiten, einen benutzerdefinierten Kernel auszuführen. Im Folgenden finden Sie bekannte Methoden, die für verschiedene Entwicklungsszenarien geeignet sind.
In den Android-Image-Build einbetten
Kopieren Sie Image.lz4-dtb
in den jeweiligen binären Kernel-Speicherort
im AOSP-Baum und erstellen Sie das Boot-Image neu.
Alternativ können Sie den TARGET_PREBUILT_KERNEL
definieren
Variable bei Verwendung von make bootimage
(oder einer anderen
make
-Befehlszeile, die ein Boot-Image erstellt). Diese Variable ist
wird von allen Geräten unterstützt, da die Einrichtung über
device/common/populate-new-device.sh
Beispiel:
export TARGET_PREBUILT_KERNEL=DIST_DIR/Image.lz4-dtb
Flash- und Boot-Kernel mit Fastboot
Die meisten Geräte verfügen über eine Bootloader-Erweiterung, das Generieren und Starten eines Boot-Images.
So starten Sie den Kernel ohne Flashing:
adb reboot bootloader
fastboot boot Image.lz4-dtb
Bei dieser Methode ist der Kernel nicht tatsächlich geflasht und bleibt nicht erhalten. während eines Neustarts.
Kernel auf Sepia ausführen
Sie können Kernel in der Architektur Ihrer Wahl auf Tintenfisch-Geräte.
Um ein Sepia-Gerät mit einem bestimmten Kernel-Satz zu starten,
Artefakte: Führen Sie den Befehl cvd start
mit den Ziel-Kernel-Artefakten als
Parameter. Im folgenden Beispielbefehl werden Kernel-Artefakte für ein arm64-Ziel vom
Kernel-Manifest common-android14-6.1
.
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
Weitere Informationen finden Sie unter Entwickeln Sie Kernel auf Cuttlefish.
Kernel-Build anpassen
Informationen zum Anpassen der Kernel-Builds für Kleaf-Builds findest du unter Kleaf-Dokumentation
Kernel-Build mit build.sh (Legacy) anpassen
Bei build/build.sh
können der Build-Prozess und das Ergebnis beeinflusst werden
nach Umgebungsvariablen.
Die meisten sind optional und jeder Kernel-Zweig sollte eine passende
Standardkonfiguration. Hier sind die am häufigsten genutzten. Für eine
vollständige (und aktuelle) Liste finden Sie unter build/build.sh
.
Umgebungsvariable | Beschreibung | Beispiel |
---|---|---|
BUILD_CONFIG |
Erstellen Sie die Konfigurationsdatei dort, wo Sie die Build-Umgebung initialisieren.
Der Speicherort muss relativ zum Repository-Stamm definiert werden
-Verzeichnis. Die Standardeinstellung ist build.config .Obligatorisch für gängige Kernels. |
BUILD_CONFIG=common/build.config.gki.aarch64 |
CC |
Zu verwendender Compiler überschreiben. Standardeinstellung wird wiederhergestellt
Compiler, der durch build.config definiert ist. |
CC=clang |
DIST_DIR |
Basisausgabeverzeichnis für die Kernel-Distribution | DIST_DIR=/path/to/my/dist |
OUT_DIR |
Basisausgabeverzeichnis für den Kernel-Build. | OUT_DIR=/path/to/my/out |
SKIP_DEFCONFIG |
make defconfig überspringen |
SKIP_DEFCONFIG=1 |
SKIP_MRPROPER |
make mrproper überspringen |
SKIP_MRPROPER=1 |
Benutzerdefinierte Kernel-Konfiguration für lokale Builds
Ab Android 14 können Sie defconfig-Fragmente verwenden um Kernel-Konfigurationen anzupassen. Siehe Kleaf-Dokumentation zu defconfig-Fragmenten
Benutzerdefinierte Kernel-Konfiguration für lokale Builds mit Build-Konfigurationen (Legacy)
Für Android 13 und niedriger gilt Folgendes.
Wenn Sie eine Kernel-Konfigurationsoption regelmäßig wechseln müssen, z. B. wenn Sie an einer Funktion arbeiten oder wenn Sie eine Option für die Entwicklung können Sie diese Flexibilität erreichen, indem Sie Änderung oder Kopie der Build-Konfiguration.
Setzen Sie die Variable POST_DEFCONFIG_CMDS auf eine Anweisung, die
direkt nach dem üblichen make defconfig
-Schritt ausgewertet,
fertig. Da die build.config
-Dateien in den Build bezogen werden
können die in build.config
definierten Funktionen aufgerufen werden
als Teil der post-defconfig-Befehle.
Ein gängiges Beispiel ist das Deaktivieren der Link Time-Optimierung (LTO) für Kreuzschraffuren
während der Entwicklung. LTO ist zwar nützlich für
freigegebene Kernel,
kann der Aufwand zur Build-Zeit beträchtlich sein. Das folgende Snippet wurde hinzugefügt:
zur lokalen build.config
deaktiviert LTO dauerhaft, wenn
mit 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)
}
Kernel-Versionen identifizieren
Sie können die richtige Version aus zwei Quellen ermitteln: der AOSP-Baumstruktur. und das System-Image.
Kernel-Version aus AOSP-Baum
Die AOSP-Baumstruktur enthält vordefinierte Kernel-Versionen. Git Log zeigt die korrekte Version als Teil der Commit-Nachricht an:
cd $AOSP/device/VENDOR/NAME
git log --max-count=1
Wenn die Kernel-Version nicht im Git-Log aufgeführt ist, rufen Sie sie vom System ab. wie unten beschrieben.
Kernel-Version aus System-Image
Führen Sie den folgenden Befehl aus, um die in einem System-Image verwendete Kernel-Version zu ermitteln: für die Kernel-Datei:
file kernel
Führen Sie für Image.lz4-dtb
-Dateien folgenden Befehl aus:
grep -a 'Linux version' Image.lz4-dtb
Boot-Image erstellen
Es ist möglich, ein Boot-Image mit der Kernel-Build-Umgebung zu erstellen.
Boot-Image für Geräte mit init_boot erstellen
Für Geräte mit
Partition init_boot
wird das Boot-Image
mit dem Kernel erstellt. Das Bild initramfs
ist nicht eingebettet
im Boot-Image befinden.
Mit Kleaf können Sie das GKI-Boot-Image beispielsweise so erstellen:
tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$DIST_DIR
Mit build/build.sh
(alte Version) können Sie das GKI-Boot-Image so erstellen:
BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh
Das GKI-Boot-Image befindet sich in $DIST_DIR.
Boot-Image für Geräte ohne init_boot erstellen (Legacy)
Für Geräte ohne
Partition init_boot
benötigen Sie ein Ramdisk-Binärprogramm, das Sie erhalten, indem Sie
GKI-Boot-Image herunterladen
und auspacken. Jedes GKI-Boot-Image des verknüpften Android-Release funktioniert.
tools/mkbootimg/unpack_bootimg.py --boot_img=boot-5.4-gz.img
mv $KERNEL_ROOT/out/ramdisk gki-ramdisk.lz4
Der Zielordner ist das Verzeichnis der obersten Ebene des Kernel-Baums (der aktuelle Arbeitsverzeichnis).
Wenn Sie mit AOSP Main entwickeln, können Sie stattdessen das
ramdisk-recovery.img
Build-Artefakt von einem Build auf „aosp_arm64“
ci.android.com ein und verwende diese Datei als Ramdisk-Binärprogramm.
Wenn Sie eine Ramdisk-Binärdatei haben und diese nach gki-ramdisk.lz4
im Stammverzeichnis kopiert haben
des Kernel-Builds enthält, können Sie mit dem folgenden Befehl ein Boot-Image generieren:
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
Wenn Sie mit einer x86-basierten Architektur arbeiten, ersetzen Sie Image
mit bzImage
und aarch64
mit
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
Diese Datei befindet sich im Verzeichnis „Artefakte“
$KERNEL_ROOT/out/$KERNEL_VERSION/dist
Das Boot-Image befindet sich unter out/<kernel branch>/dist/boot.img
.