Перейти к основному содержимому

Кросс-компиляция и отладка для ARM/Android

Сначала убедитесь, что вы можете собирать с GN.

Затем добавьте android в ваш файл конфигурации .gclient.

target_os = ['android']  # Добавьте это, чтобы проверить Android.

Поле target_os является списком, поэтому, если вы также собираете на unix, оно будет выглядеть так:

target_os = ['android', 'unix']  # Несколько целевых ОС.

Запустите gclient sync, и вы получите большую проверку в каталоге ./third_party/android_tools.

Включите режим разработчика на вашем телефоне или планшете и включите отладку через USB, следуя инструкциям здесь. Также убедитесь, что инструмент adb находится в вашем пути. Он находится в ./third_party/android_sdk/public/platform-tools в вашей проверке.

Использование gm

Используйте скрипт tools/dev/gm.py, чтобы автоматически создавать тесты V8 и запускать их на устройстве.

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

Эта команда загружает бинарные файлы и тесты в каталог /data/local/tmp/v8 на устройстве.

Ручная сборка

Используйте v8gen.py, чтобы создать выпускную или отладочную сборку для ARM:

tools/dev/v8gen.py arm.release

Затем запустите gn args out.gn/arm.release и убедитесь, что у вас есть следующие ключи:

target_os = "android"      # Эти строки необходимо изменить вручную
target_cpu = "arm" # так как v8gen.py предполагает сборку симулятора.
v8_target_cpu = "arm"
is_component_build = false

Ключи должны быть одинаковыми для отладочных сборок. Если вы собираете для устройства с arm64, такого как Pixel C, поддерживающего 32-битные и 64-битные бинарные файлы, ключи должны выглядеть так:

target_os = "android"      # Эти строки необходимо изменить вручную
target_cpu = "arm64" # так как v8gen.py предполагает сборку симулятора.
v8_target_cpu = "arm64"
is_component_build = false

Теперь соберите:

ninja -C out.gn/arm.release d8

Используйте adb, чтобы скопировать бинарный файл и файлы снапшотов на телефон:

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 5.8.0 (кандидат)
d8> 'w00t!'
"w00t!"
d8>

Отладка

d8

Удаленная отладка d8 на устройстве Android относительно проста. Сначала запустите gdbserver на устройстве Android:

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

Затем подключитесь к серверу на устройстве хоста.

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

gdb и gdbserver должны быть совместимы друг с другом, если есть сомнения, используйте бинарные файлы из Android NDK. Обратите внимание, что по умолчанию бинарный файл d8 очищен (информация для отладки удалена), но $OUT_DIR/exe.unstripped/d8 содержит бинарный файл без удаления.

Логирование

По умолчанию часть отладочного вывода d8 оказывается в системном логе Android, который можно вывести с помощью logcat. К сожалению, иногда часть конкретного отладочного вывода распределяется между системным журналом и adb, а иногда некоторая часть полностью отсутствует. Чтобы избежать этих проблем, рекомендуется добавить следующее настройку в gn args:

v8_android_log_stdout = true

Проблемы с плавающей точкой

Настройка arm_float_abi = "hard" в gn args, которая используется ботом V8 Arm GC Stress, может привести к полностью бессмысленному поведению программы на оборудовании, отличном от того, которое использует бот GC stress (например, на Nexus 7).

Использование Sourcery G++ Lite

Пакет кросс-компилятора Sourcery G++ Lite является бесплатной версией Sourcery G++ от CodeSourcery. Существует страница для GNU Toolchain for ARM Processors. Определите, какая версия нужна для вашей комбинации хоста/целевого устройства.

Следующие инструкции используют 2009q1-203 для ARM GNU/Linux, и если используется другая версия, измените ниже URL-адреса и TOOL_PREFIX соответственно.

Установка на хосте и целевом устройстве

Самый простой способ настройки — установить полный пакет Sourcery G++ Lite как на хосте, так и на целевом устройстве в одном месте. Это обеспечит доступность всех необходимых библиотек на обеих сторонах. Если вы хотите использовать библиотеки по умолчанию на хосте, нет необходимости ничего устанавливать на целевом устройстве.

Следующий скрипт устанавливается в /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

Профилирование

  • Скомпилировать бинарный файл, загрузить его на устройство, сохранить копию на хосте:

    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
  • Получить журнал профилирования и скопировать его на хост:

    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 ./
  • Откройте v8.log в вашем любимом редакторе и измените первую строку так, чтобы она соответствовала полному пути к бинарному файлу d8-version.under.test на вашем рабочем компьютере (вместо пути /data/local/tmp/v8/bin/, который был на устройстве)

  • Запустите обработчик тиков с использованием хостовой версии d8 и подходящего бинарного файла nm:

    cp out/x64.release/d8 .  # необходимо только один раз
    cp out/x64.release/natives_blob.bin . # необходимо только один раз
    cp out/x64.release/snapshot_blob.bin . # необходимо только один раз
    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