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
gdb
と gdbserver
は互いに互換性がある必要があります。疑わしい場合は、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
プロファイル #
バイナリをコンパイルし、デバイスにプッシュし、そのコピーをホストに保存します
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