跳到主要内容

交叉编译和调试ARM/Android

首先,请确保您可以使用GN构建

然后,在您的.gclient配置文件中添加android

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的release或debug构建:

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

调试版本的键值应相同。如果您正在为像Pixel C这样的arm64设备构建(支持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 version 5.8.0 (candidate)
d8> 'w00t!'
"w00t!"
d8>

调试

d8

在Android设备上远程调试d8相对简单。首先在Android设备上启动gdbserver

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

然后在主机设备上连接到服务器。

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

gdbgdbserver需要相互兼容。如果有疑问,请使用来自Android NDK的二进制文件。注意,默认情况下d8二进制文件是剥离的(删除了调试信息),但$OUT_DIR/exe.unstripped/d8包含未剥离的二进制文件。

日志记录

默认情况下,部分d8的调试输出会出现在Android系统日志中,可以使用logcat来转储日志。不幸的是,有时特定调试输出的一部分会分散在系统日志和adb之间,有时甚至完全丢失。为了避免这些问题,建议在gn args中添加以下设置:

v8_android_log_stdout = true

浮点问题

gn args设置中的arm_float_abi = "hard"会在不同于GC应力测试机器人所使用的硬件(例如在Nexus 7上)上导致完全无意义的程序行为。

使用Sourcery G++ Lite

Sourcery G++ Lite交叉编译器套件是CodeSourcery提供的免费版本Sourcery G++。可以在ARM处理器的GNU工具链页面找到它。确定您的主机/目标组合所需的版本。

以下说明使用了2009q1-203 for 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 二进制文件运行 tick 处理器:

    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