Saltar al contenido principal

Compilación cruzada y depuración para ARM/Android

Primero, asegúrate de poder compilar con GN.

Luego, agrega android a tu archivo de configuración .gclient.

target_os = ['android']  # Agrega esto para que se descarguen los elementos de Android.

El campo target_os es una lista, así que si también estás construyendo en unix se verá así:

target_os = ['android', 'unix']  # Múltiples sistemas operativos objetivo.

Ejecuta gclient sync, y obtendrás un gran checkout en ./third_party/android_tools.

Habilita el modo de desarrollador en tu teléfono o tablet y activa la depuración USB siguiendo las instrucciones aquí. También, coloca la práctica herramienta adb en tu path. Está en tu checkout en ./third_party/android_sdk/public/platform-tools.

Usando gm

Usa el script tools/dev/gm.py para construir automáticamente las pruebas de V8 y ejecutarlas en el dispositivo.

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

Este comando envía los binarios y pruebas al directorio /data/local/tmp/v8 en el dispositivo.

Construcción manual

Usa v8gen.py para generar una construcción de lanzamiento o depuración ARM:

tools/dev/v8gen.py arm.release

Luego ejecuta gn args out.gn/arm.release y asegúrate de tener las siguientes claves:

target_os = "android"      # Estas líneas deben ser cambiadas manualmente
target_cpu = "arm" # ya que v8gen.py asume una construcción de simulador.
v8_target_cpu = "arm"
is_component_build = false

Las claves deben ser las mismas para construcciones de depuración. Si estás construyendo para un dispositivo arm64 como el Pixel C, que admite binarios de 32 y 64 bits, las claves deben verse así:

target_os = "android"      # Estas líneas deben ser cambiadas manualmente
target_cpu = "arm64" # ya que v8gen.py asume una construcción de simulador.
v8_target_cpu = "arm64"
is_component_build = false

Ahora construye:

ninja -C out.gn/arm.release d8

Usa adb para copiar los archivos binarios y de snapshot al teléfono:

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
Versión V8 5.8.0 (candidato)
d8> '¡w00t!'
"¡w00t!"
d8>

Depuración

d8

La depuración remota de d8 en un dispositivo Android es relativamente sencilla. Primero inicia gdbserver en el dispositivo Android:

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

Luego conéctate al servidor en tu dispositivo host.

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

gdb y gdbserver deben ser compatibles entre sí. En caso de duda, usa los binarios del NDK de Android. Ten en cuenta que, por defecto, el binario d8 está reducido (información de depuración eliminada), aunque $OUT_DIR/exe.unstripped/d8 contiene el binario sin reducción.

Registro

Por defecto, algunos de los mensajes de depuración de d8 terminan en el registro del sistema Android, que se puede volcar utilizando logcat. Desafortunadamente, a veces una parte de un mensaje de depuración en particular se divide entre el registro del sistema y adb, y a veces alguna parte parece estar completamente desaparecida. Para evitar estos problemas, se recomienda agregar el siguiente ajuste a los gn args:

v8_android_log_stdout = true

Problemas de punto flotante

El ajuste de gn args arm_float_abi = "hard", que es utilizado por el bot de Stress GC de V8 Arm, puede resultar en comportamientos completamente sin sentido del programa en hardware diferente al que utiliza el bot de Stress GC (por ejemplo, en Nexus 7).

Usando Sourcery G++ Lite

El paquete de compilador cruzado Sourcery G++ Lite es una versión gratuita de Sourcery G++ de CodeSourcery. Hay una página para la Toolchain de GNU para procesadores ARM. Determina la versión que necesitas para tu combinación host/objetivo.

Las siguientes instrucciones utilizan 2009q1-203 para ARM GNU/Linux, y si utilizas una versión diferente, cambia las URLs y TOOL_PREFIX abajo en consecuencia.

Instalación en host y objetivo

La forma más simple de configurar esto es instalar el paquete completo Sourcery G++ Lite tanto en el host como en el objetivo en el mismo lugar. Esto asegurará que todas las librerías necesarias estén disponibles en ambos lados. Si deseas utilizar las librerías por defecto en el host, no es necesario instalar nada en el objetivo.

El siguiente script se instala en /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

Perfil

  • Compila un binario, cópialo al dispositivo, guarda una copia en el 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
  • Obtén un registro de perfiles y cópialo al 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 ./
  • Abre v8.log en tu editor favorito y edita la primera línea para que coincida con la ruta completa del binario d8-version.under.test en tu estación de trabajo (en lugar de la ruta /data/local/tmp/v8/bin/ que tenía en el dispositivo)

  • Ejecuta el procesador de ticks con el d8 del host y un binario nm apropiado:

    cp out/x64.release/d8 .  # solo es necesario una vez
    cp out/x64.release/natives_blob.bin . # solo es necesario una vez
    cp out/x64.release/snapshot_blob.bin . # solo es necesario una vez
    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