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
gdb
和 gdbserver
需要相互兼容,如有疑问,请使用来自 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
分析 #
编译一个二进制文件,将其推送到设备,在主机上保留一份副本
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 . # only required once
cp out/x64.release/natives_blob.bin . # only required once
cp out/x64.release/snapshot_blob.bin . # only required once
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