針對 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
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 壓力機器人使用此設定,可能會導致在與 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
設定檔 #
編譯二進位檔,將其推送到裝置,在主機上保留其副本
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 . # 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