針對 ARM/Android 進行跨編譯和除錯

首先,請確定您可以使用 GN 進行編譯

接著,將 android 新增到您的 .gclient 組態檔案。

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 壓力機器人使用此設定,可能會導致在與 GC 壓力機器人所使用的硬體不同的硬體上產生完全不合邏輯的程式行為(例如在 Nexus 7 上)。

使用 Sourcery G++ Lite #

Sourcery G++ Lite 交叉編譯器套件是 CodeSourcery 中 Sourcery G++ 的免費版本。GNU Toolchain for ARM Processors 有專屬網頁。確定您主機/目標組合所需的版本。

以下說明使用 2009q1-203 for ARM GNU/Linux,如果您使用不同版本,請相應變更下列網址和 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

設定檔 #