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

デバッグビルドでもキーは同じです。32ビットと64ビットのバイナリをサポートする Pixel C のような arm64 デバイス用にビルドする場合は、キーは次のようになります

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

浮動小数点数の問題 #

V8 Arm GC Stress bot で使用されている gn args 設定 arm_float_abi = "hard" は、GC stress bot が使用しているものとは異なるハードウェア(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

プロファイル #