Anleitung zum Kompilieren und Debuggen des Android-Kernels

Anleitung zum Kompilieren und Debuggen des Android-Kernels

Umfeld

Dieses Handbuch basiert auf dem folgenden Code und der folgenden Umgebung

OS     :  Ubuntu 22.04.2 LTS
AOSP   :  master
kernel :  根据编译目标决定
target : aosp_cf_x86_64_phone-userdebug
设备    : Cuttlefish

Wie im vorherigen Artikel erwähnt, sollte der Code von AOSP aufgrund der Toolkette nicht zu alt sein. Seit dem letzten Artikel haben sich die Funktionen und Dokumente von Cuttlefish schrittweise verbessert, was ausreicht, um zu zeigen, wie viel Google in sie investiert hat Wenn die Version unterschiedlich ist, treten bestimmte Probleme auf, z. B. das Fehlen solcher Parameter. Dieser Artikel hat den Test auf dem Master bestanden.

Herunterladen des Android Kernel Repo-Quellcodes

Der Linux-Kernel ist die Grundlage für die Ausführung des Android-Systems, und der Quellcode des Linux-Kernels ist in AOSP nicht vorhanden. Normalerweise gibt es ein vorgefertigtes Kernel-Image. Wenn Sie einige benutzerdefinierte Änderungen am Kernel vornehmen möchten, können Sie dies tun Sie müssen den Code herunterladen und erstellen. Der Linux-Kernel verfügt über verschiedene Zweige wie AOSP, und es ist nicht möglich, einen Zweig auszuwählen, der normal erstellt und ausgeführt werden soll. Durch das Kompilieren der Linux-Kernel-Version, die AOSP entspricht, können viele Umwege im Erstellungsprozess vermieden werden. Jedes AOSP-Build-Ziel verfügt über ein vorkompiliertes Kernel-Image, und Sie können dem Kernel-Image Hinweise auf die entsprechende Version entnehmen.

Es ist zu beachten, dass das Android-Kernel-Projekt auch vom Repo ( android.googlesource.com/kernel/mani… ) verwaltet wird, wobei der Quellcode des Linux-Kernels im Kernel/Common ( android.googlesource.com/kernel/comm ) vorhanden ist ) Verzeichnis Als nächstes sind andere Verzeichnisse Toolketten oder Skripte, die sich auf den Build beziehen. In der alten Version des Linux-Kernel-Builds können Sie den Kernel/Common-Code direkt herunterladen und make verwenden, um das Kernel-Image direkt zu kompilieren. Allerdings mit der Einführung von Android GKI, diese Methode Es funktioniert nicht. Leser sind besser dran, mit den kompilierten Skripten usw. zu bauen, die vom Repo bereitgestellt werden.

Im Folgenden wird aosp_cf_x86_64_phone-userdebuganhand des Ziels Schritt für Schritt beschrieben, wie der entsprechende Zweig gefunden wird

Suchen Sie die Version und CommitId des Linux-Kernels

Finden Sie es über die Android-Einstellungsoberfläche

Wenn Ihr kompiliertes System erfolgreich auf der virtuellen Maschine ausgeführt wurde, können Sie Einstellungen – Über Telefon – Android-Version – Kernel-Version öffnen, um die entsprechenden Kernel-Informationen anzuzeigen. Die Versionsnummer von Linux folgt dem Format „major.minor.patch-build.desc“. Durch den Abgleich der Bildschirmausgabe kann geschlossen werden, dass die Kernel-Version 6.1 ist, und die fortlaufenden Zeichen, die mit g beginnen, können aus der zusätzlichen Beschreibung extrahiert werden, um zu wissen, dass es sich um die entsprechende CommitId handelt963667856ef1

Bild.png

Suche im AOSP-Baum

Wenn es nur ein Build-Ziel (aosp_cf_x86_64_phone-userdebug) gibt und die virtuelle Maschine nicht erfolgreich ausgeführt wird, können Sie die folgenden Schritte ausführen, um es zu erhalten.

  1. Index zum Verzeichnis „device/google/cuttlefish“. Das Geräteverzeichnis speichert zugehörige Produktkonfigurationen von Chip- und Hardwareherstellern. Cuttlefish wird als virtuelle Maschine ebenfalls zu diesem Verzeichnis hinzugefügt.
  2. Durch mgrep ":kernel"Anzeigen der Konfigurationsdatei (diese Methode ist nicht sehr allgemein, Sie können das entsprechende Wissen durch „ Neues Gerät hinzufügen “ erlernen) und schließlich durch Anzeigen der gesuchten Konfigurationsdatei können Sie sehen, dass sich die Kernel-Image-Datei des Ziels im Link befindet folgende Abbildungkernel/prebuilts/6.1/x86_64/kernel-6.1
  3. Führen Sie die Datei aus file kernel-6.1, um die folgende Ausgabe zu erhalten. Sie können auch die CommmitId als abrufen963667856ef1
kernel-6.1: Linux kernel x86 boot executable bzImage, version 6.1.25-android14-7-00377-g963667856ef1-ab10271074 (build-user@build-host) #1 SMP PREEMPT Tue Jun  6 23:03:20 UTC 2023, RO-rootFS, swap_dev 0X10, Normal VGA

Screenshot_20230613203254413.png

Ziehen Sie den Kernel-Code entsprechend der Verzweigung

Rufen Sie die Linux-Kernel-Version und die Commit-ID über die oben genannten Vorgänge ab. Wenn Sie bereit sind, können Sie mit dem Abrufen des Codes beginnen. Beachten Sie, dass sich die oben erhaltene Commit-ID auf die entsprechende Übermittlung von android.googlesource.com/kernel/comm bezieht ... Lagerhaus.

Suchen Sie den entsprechenden Repo-Zweig anhand der CommitId von Kernel/Common

Besuchen Sie direkt android.googlesource.com/kernel/comm... (Hinweis: Ändern Sie die Commit-ID entsprechend der tatsächlichen Ausgabe), um die entsprechende ChangeId abzurufen, und klicken Sie auf den ChangeId-Link, um die entsprechende Gerrit-Adresse anzuzeigen, wie unten auf dieser Seite gezeigt ist auch mit gekennzeichnet Linux-Kernel Der Zweig von [android14-6.1], der Zweig hier ist immer noch ein Zweig des Linux-Kernels, daher kann ich nur raten, wie man den Zweig des Repos erhält, indem ich in android.googlesource nach 6.1 suche .com/kernel/mani... Ich habe mehrere Ergebnisse gefunden. Durch Überprüfen der Datei default.xml unter diesem Zweig wurde festgestellt, dass der Zweig common-android14-6.1 auf den Zweig android14-6.1 des Linux-Kernels verweist. Der Code lautet wie folgt<project path="common" name="kernel/common" revision="android14-6.1" />

Screenshot_20230614103105851.png Screenshot_20230614103159768.png

Ziehen Sie den Kernel-Code

Verwenden Sie den oben erhaltenen Repo-Zweig des Kernels und verwenden Sie das Repo, um den Quellcode und die Skripte des Linux-Kernels usw. herunterzuladen.

mkdir android-kernel && cd android-kernel
repo init -u https://android.googlesource.com/kernel/manifest -b common-android14-6.1
repo sync

Wenn alles in Ordnung ist, wird der Code heruntergeladen. Wenn Sie auf Netzwerkprobleme stoßen, können Sie den vorherigen Artikel lesen, um den Download der Spiegelquelle einzurichten.

Bazel kompiliert den Kernel

Android11 ​​führt die Funktion von GKI ein, mit der der Kernel in ein von Google verwaltetes Kernel-Image und ein vom Lieferanten verwaltetes Modul aufgeteilt wird. Die beiden Module werden separat erstellt. Android13 beginnt, Bazel zum Kompilieren zu verwenden. Da der erstellte Zweig der Hauptzweig ist, muss die Kernel-Kompilierung mit Bazel erstellt werden und zwei Kernel müssen separat erstellt werden.

//通用内核镜像的构建
$ tools/bazel run //common:kernel_x86_64_dist -- --dist_dir=out
//因为是虚拟机,所以是虚拟的设备GKI virtual_device
$ tools/bazel run //common-modules/virtual-device:virtual_device_x86_64_dist -- --dist_dir=out

bzImageWenn bei der obigen Konstruktion kein Problem auftritt, werden die Dateien und im Out-Verzeichnis generiert initramfs.img. Bitte merken Sie sich deren Speicherorte, die später verwendet werden

Tintenfisch wendet einen neuen Kernel an

Verwenden Sie kernel_path und initramfs_path, um den neuen Kernel auf Cuttlefish anzuwenden, was sehr praktisch ist. Beachten Sie, dass der Betrieb von launch_cvd basierend auf dem vorherigen Artikel erfolgreich kompiliert wurde und im AOSP-Stammverzeichnis ausgeführt wird.

source build/envsetup.sh
lunch aosp_cf_x86_64_phone-userdebug
launch_cvd -kernel_path /home/prosixe/ssd/Android/android-kernel/out/bzImage -initramfs_path /home/prosixe/ssd/Android/android-kernel/out/initramfs.img 

Screenshot_20230614202847000.png

Durch Überprüfen der Systeminformationen wurde festgestellt, dass sich der Kernel geändert hat und das System normal gestartet werden kann.

Verwenden Sie GDB zum Debuggen des Kernels

Verwenden Sie den folgenden Befehl, um den Kernel debuggbar zu machen. Leser sollten darauf achten, während des Betriebs die Verzeichnisse von AOSP und Android-Kernel zu unterscheiden.

//注意在aosp根目录
source build/envsetup.sh
lunch aosp_cf_x86_64_phone-userdebug
launch_cvd -kernel_path /home/prosixe/ssd/Android/android-kernel/out/bzImage -initramfs_path /home/prosixe/ssd/Android/android-kernel/out/initramfs.img -gdb_port 1234 -cpus=1  -extra_kernel_cmdline nokaslr

Dann indizieren Sie in einem anderen Terminal auf android-kernel/common, um die GDB-Indizierung auf Symbole zu erleichtern

//切换android-kernel根目录
cd common
gdb ../out/vmlinux
(gdb) target remote :1234
(gdb) hbreak start_kernel
(gdb) c

Bild.pngEs ist ersichtlich, dass der Kernel bei start_kernel stoppt und der entsprechende Quellcode normal angezeigt werden kann.

Zusammenfassen

Nach der schrittweisen Erkundung wurde der Linux-Kernel erfolgreich in Cuttlefish ausgeführt. In der Cuttlefish-Umgebung können Sie den Kernel debuggen, nativen Code debuggen und Framework-Code debuggen. Es kann auch als Ihre gemeinsame „Entwicklungsmaschine“ verwendet werden. .
Dieser Artikel ist eine Zusammenfassung der Studie des Autors. Aufgrund des geringen Wissens gibt es immer wieder Fehler, die nicht erkannt werden können. Bitte zögern Sie nicht, mich aufzuklären. Sollten Sie im Studium auf Probleme stoßen, können Sie sich auch gerne melden.

おすすめ

転載: blog.csdn.net/Eqiqi/article/details/131236435