ARM/Android 交叉编译和调试

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

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

target_os = ['android']  # Add this to get Android stuff checked out.

target_os 字段是一个列表,所以如果你也在 unix 上构建,它看起来像这样

target_os = ['android', 'unix']  # Multiple target OSes.

运行 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"      # These lines need to be changed manually
target_cpu = "arm" # as v8gen.py assumes a simulator build.
v8_target_cpu = "arm"
is_component_build = false

调试构建的键应该相同。如果你正在为像 Pixel C 这样的 arm64 设备构建,它支持 32 位和 64 位二进制文件,则键应该看起来像这样

target_os = "android"      # These lines need to be changed manually
target_cpu = "arm64" # as v8gen.py assumes a simulator build.
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",由 V8 Arm GC Stress 机器人使用,会导致在与 GC Stress 机器人使用的硬件不同的硬件上出现完全无意义的程序行为(例如在 Nexus 7 上)。

使用 Sourcery G++ Lite #

Sourcery G++ Lite 交叉编译器套件是来自 CodeSourcery 的 Sourcery G++ 的免费版本。有一个关于 ARM 处理器的 GNU 工具链 的页面。确定主机/目标组合所需的版本。

以下说明使用 适用于 ARM GNU/Linux 的 2009q1-203,如果使用不同的版本,请相应地更改以下 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

分析 #