Zum Hauptinhalt springen

Cross-Kompilierung und Debuggen für ARM/Android

Zuerst stellen Sie sicher, dass Sie mit GN bauen können.

Fügen Sie dann android zu Ihrer .gclient-Konfigurationsdatei hinzu.

target_os = ['android']  # Fügen Sie dies hinzu, um die Android-Komponenten auszuchecken.

Das target_os-Feld ist eine Liste, daher sieht es so aus, wenn Sie auch unter Unix bauen:

target_os = ['android', 'unix']  # Mehrere Zielbetriebssysteme.

Führen Sie gclient sync aus, und Sie erhalten ein großes Checkout-Verzeichnis unter ./third_party/android_tools.

Aktivieren Sie den Entwicklermodus auf Ihrem Telefon oder Tablet und schalten Sie USB-Debugging ein, indem Sie den Anweisungen hier folgen. Besorgen Sie sich außerdem das praktische adb-Tool für Ihren Pfad. Es befindet sich in Ihrem Checkout unter ./third_party/android_sdk/public/platform-tools.

Verwendung von gm

Verwenden Sie das Skript tools/dev/gm.py, um V8-Tests automatisch zu bauen und auf dem Gerät auszuführen.

alias gm=/path/to/v8/tools/dev/gm.py
gm android_arm.release.check

Dieser Befehl überträgt die Binärdateien und Tests in das Verzeichnis /data/local/tmp/v8 auf dem Gerät.

Manueller Build

Verwenden Sie v8gen.py, um ein ARM-Release oder Debug-Build zu generieren:

tools/dev/v8gen.py arm.release

Führen Sie anschließend gn args out.gn/arm.release aus und stellen Sie sicher, dass Sie die folgenden Schlüssel haben:

target_os = "android"      # Diese Zeilen müssen manuell geändert werden
target_cpu = "arm" # da v8gen.py von einem Simulator-Build ausgeht.
v8_target_cpu = "arm"
is_component_build = false

Die Schlüssel sollten für Debug-Builds gleich sein. Wenn Sie für ein arm64-Gerät wie das Pixel C bauen, das 32-Bit- und 64-Bit-Binärdateien unterstützt, sollten die Schlüssel so aussehen:

target_os = "android"      # Diese Zeilen müssen manuell geändert werden
target_cpu = "arm64" # da v8gen.py von einem Simulator-Build ausgeht.
v8_target_cpu = "arm64"
is_component_build = false

Jetzt bauen:

ninja -C out.gn/arm.release d8

Verwenden Sie adb, um die Binärdatei und Snapshot-Dateien auf das Telefon zu kopieren:

adb shell 'mkdir -p /data/local/tmp/v8/bin'
adb push out.gn/arm.release/d8 /data/local/tmp/v8/bin
adb push out.gn/arm.release/icudtl.dat /data/local/tmp/v8/bin
adb push out.gn/arm.release/snapshot_blob.bin /data/local/tmp/v8/bin
rebuffat:~/src/v8$ adb shell
bullhead:/ $ cd /data/local/tmp/v8/bin
bullhead:/data/local/tmp/v8/bin $ ls
v8 icudtl.dat snapshot_blob.bin
bullhead:/data/local/tmp/v8/bin $ ./d8
V8 version 5.8.0 (candidate)
d8> 'w00t!'
"w00t!"
d8>

Debugging

d8

Das Remote-Debugging von d8 auf einem Android-Gerät ist relativ einfach. Starten Sie zuerst gdbserver auf dem Android-Gerät:

bullhead:/data/local/tmp/v8/bin $ gdbserver :5039 $D8 <arguments>

Verbinden Sie sich dann mit dem Server auf Ihrem Host-Gerät.

adb forward tcp:5039 tcp:5039
gdb $D8
gdb> target remote :5039

gdb und gdbserver müssen kompatibel zueinander sein; im Zweifelsfall verwenden Sie die Binärdateien aus dem Android NDK. Beachten Sie, dass die d8-Binärdatei standardmäßig gestrippt ist (Debugging-Infos entfernt), aber $OUT_DIR/exe.unstripped/d8 die ungestrippte Binärdatei enthält.

Logging

Standardmäßig landet ein Teil der Debugging-Ausgabe von d8 im Android-Systemprotokoll, das mit logcat abgerufen werden kann. Leider wird manchmal ein Teil einer bestimmten Debugging-Ausgabe zwischen dem Systemprotokoll und adb aufgeteilt, und manchmal scheint ein Teil vollständig zu fehlen. Um diese Probleme zu vermeiden, wird empfohlen, die folgende Einstellung zu den gn args hinzuzufügen:

v8_android_log_stdout = true

Gleitkomma-Probleme

Die gn args-Einstellung arm_float_abi = "hard", die vom V8 Arm GC Stress Bot verwendet wird, kann auf anderer Hardware als der des GC Stress Bot (z. B. auf Nexus 7) zu völlig unsinnigem Programmverhalten führen.

Verwendung von Sourcery G++ Lite

Die Sourcery G++ Lite Cross-Compiler-Suite ist eine kostenlose Version von Sourcery G++ von CodeSourcery. Es gibt eine Seite für die GNU-Toolchain für ARM-Prozessoren. Bestimmen Sie die Version, die Sie für Ihre Host-/Ziel-Kombination benötigen.

Die folgenden Anweisungen verwenden 2009q1-203 for ARM GNU/Linux, und wenn Sie eine andere Version verwenden, ändern Sie bitte die URLs und TOOL_PREFIX unten entsprechend.

Installation auf Host und Ziel

Der einfachste Weg, dies einzurichten, besteht darin, das vollständige Sourcery G++ Lite-Paket sowohl auf dem Host als auch auf dem Ziel am gleichen Ort zu installieren. Dies stellt sicher, dass alle erforderlichen Bibliotheken auf beiden Seiten verfügbar sind. Wenn Sie die Standardbibliotheken auf dem Host verwenden möchten, ist keine Installation auf dem Ziel erforderlich.

Das folgende Skript wird unter /opt/codesourcery installiert:

#!/bin/sh

sudo mkdir /opt/codesourcery
cd /opt/codesourcery
sudo chown "$USERNAME" .
chmod g+ws .
umask 2
wget http://www.codesourcery.com/sgpp/lite/arm/portal/package4571/public/arm-none-linux-gnueabi/arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
tar -xvf arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

Profil

  • Kompilieren Sie eine Binärdatei, schieben Sie sie auf das Gerät und behalten Sie eine Kopie auf dem Host:

    adb shell cp /data/local/tmp/v8/bin/d8 /data/local/tmp/v8/bin/d8-version.under.test
    cp out.gn/arm.release/d8 ./d8-version.under.test
  • Erstellen Sie ein Profilprotokoll und kopieren Sie es auf den Host:

    adb push benchmarks /data/local/tmp
    adb shell cd /data/local/tmp/benchmarks; ../v8/bin/d8-version.under.test run.js --prof
    adb shell /data/local/tmp/v8/bin/d8-version.under.test benchmark.js --prof
    adb pull /data/local/tmp/benchmarks/v8.log ./
  • Öffnen Sie v8.log in Ihrem bevorzugten Editor und bearbeiten Sie die erste Zeile so, dass sie dem vollständigen Pfad zur d8-version.under.test-Binärdatei auf Ihrem Arbeitsplatzrechner entspricht (anstelle des /data/local/tmp/v8/bin/-Pfads, der auf dem Gerät verwendet wurde).

  • Führen Sie den Tick-Processor mit der d8-Binärdatei des Hosts und einer entsprechenden nm-Binärdatei aus:

    cp out/x64.release/d8 .  # nur einmal erforderlich
    cp out/x64.release/natives_blob.bin . # nur einmal erforderlich
    cp out/x64.release/snapshot_blob.bin . # nur einmal erforderlich
    tools/linux-tick-processor --nm=$(pwd)/third_party/android_ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-nm