Aller au contenu principal

Cross-compilation et débogage pour ARM/Android

Tout d'abord, assurez-vous de pouvoir compiler avec GN.

Ajoutez ensuite android à votre fichier de configuration .gclient.

target_os = ['android']  # Ajoutez ceci pour inclure les outils Android.

Le champ target_os est une liste, donc si vous compilez également sous Unix, cela ressemblera à ceci :

target_os = ['android', 'unix']  # Multiples systèmes d'exploitation cibles.

Exécutez gclient sync, et vous obtiendrez une grande synchronisation sous ./third_party/android_tools.

Activez le mode développeur sur votre téléphone ou tablette et activez le débogage USB, via les instructions ici. En plus, ajoutez le pratique outil adb à votre PATH. Il se trouve dans votre synchronisation à ./third_party/android_sdk/public/platform-tools.

Utiliser gm

Utilisez le script tools/dev/gm.py pour compiler automatiquement les tests V8 et les exécuter sur l'appareil.

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

Cette commande transfère les binaires et les tests dans le répertoire /data/local/tmp/v8 sur l'appareil.

Compilation manuelle

Utilisez v8gen.py pour générer une version ARM de production ou de débogage :

tools/dev/v8gen.py arm.release

Ensuite, exécutez gn args out.gn/arm.release et assurez-vous d'avoir les clés suivantes :

target_os = "android"      # Ces lignes doivent être modifiées manuellement.
target_cpu = "arm" # car v8gen.py suppose une build simulateur.
v8_target_cpu = "arm"
is_component_build = false

Les clés devraient être identiques pour les builds de débogage. Si vous compilez pour un appareil arm64 tel que le Pixel C, qui prend en charge des binaires 32 bits et 64 bits, les clés devraient ressembler à ceci :

target_os = "android"      # Ces lignes doivent être modifiées manuellement.
target_cpu = "arm64" # car v8gen.py suppose une build simulateur.
v8_target_cpu = "arm64"
is_component_build = false

Ensuite, compilez :

ninja -C out.gn/arm.release d8

Utilisez adb pour copier les fichiers binaires et les fichiers snapshot sur le téléphone :

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>

Débogage

d8

Le débogage à distance de d8 sur un appareil Android est relativement simple. D'abord, démarrez gdbserver sur l'appareil Android :

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

Ensuite, connectez-vous au serveur à partir de votre appareil hôte.

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

gdb et gdbserver doivent être compatibles entre eux. En cas de doute, utilisez les binaires du NDK Android. Notez que par défaut, le binaire d8 est stripé (les informations de débogage sont supprimées), mais $OUT_DIR/exe.unstripped/d8 contient le binaire non stripé.

Journalisation

Par défaut, certains des outputs de débogage de d8 se retrouvent dans les logs système Android, qui peuvent être extraits via logcat. Malheureusement, parfois une partie des outputs de débogage spécifiques est partagée entre les logs système et adb, et parfois une partie semble totalement manquante. Pour éviter ces problèmes, il est recommandé d'ajouter le paramètre suivant dans les gn args :

v8_android_log_stdout = true

Problèmes en virgule flottante

Le paramètre gn args arm_float_abi = "hard", utilisé par le bot de stress GC Arm de V8, peut entraîner des comportements complètement absurdes sur du matériel différent de celui utilisé par le bot de stress GC (par exemple, sur le Nexus 7).

Utiliser Sourcery G++ Lite

Le suite cross-compilateur Sourcery G++ Lite est une version gratuite de Sourcery G++ de CodeSourcery. Il existe une page pour la chaîne d'outils GNU pour les processeurs ARM. Déterminez la version requise pour votre combinaison hôte/cible.

Les instructions suivantes utilisent 2009q1-203 pour ARM GNU/Linux, et si vous utilisez une autre version, modifiez les URL et TOOL_PREFIX ci-dessous en conséquence.

Installation sur l'hôte et la cible

Le moyen le plus simple de paramétrer cela est d'installer le package complet Sourcery G++ Lite à la fois sur l'hôte et la cible au même emplacement. Cela garantira que toutes les bibliothèques requises sont disponibles des deux côtés. Si vous souhaitez utiliser les bibliothèques par défaut sur l'hôte, il n'est pas nécessaire d'installer quoi que ce soit sur la cible.

Le script suivant s'installe dans /opt/codesourcery :

#!/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

  • Compiler un binaire, le transférer sur l'appareil, en conserver une copie sur l'hôte :

    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
  • Obtenir un journal de profilage et le copier sur l'hôte :

    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 ./
  • Ouvrez v8.log dans votre éditeur préféré et modifiez la première ligne pour correspondre au chemin complet du binaire d8-version.under.test sur votre station de travail (au lieu du chemin /data/local/tmp/v8/bin/ qu'il avait sur l'appareil)

  • Exécutez le processeur de ticks avec le d8 de l'hôte et un binaire nm approprié :

    cp out/x64.release/d8 .  # requis uniquement une fois
    cp out/x64.release/natives_blob.bin . # requis uniquement une fois
    cp out/x64.release/snapshot_blob.bin . # requis uniquement une fois
    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