본문으로 건너뛰기

ARM/Android를 위한 크로스 컴파일 및 디버깅

먼저, GN으로 빌드하기를 확인하십시오.

그런 다음, .gclient 구성 파일에 android를 추가하십시오.

target_os = ['android']  # Android 관련 자료를 가져오려면 추가하십시오.

target_os 필드는 목록이므로, 유닉스에서도 빌드하려는 경우 다음과 같이 보일 것입니다:

target_os = ['android', 'unix']  # 여러 대상 운영 체제 설정.

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"      # 이 행은 직접 수정해야 합니다.
target_cpu = "arm" # v8gen.py는 시뮬레이터 빌드를 기본으로 설정하기 때문입니다.
v8_target_cpu = "arm"
is_component_build = false

디버그 빌드의 경우 키는 동일해야 합니다. Pixel C와 같이 32비트 및 64비트 바이너리를 지원하는 arm64 디바이스를 빌드하려면 키는 다음과 같이 보일 것입니다:

target_os = "android"      # 이 행은 직접 수정해야 합니다.
target_cpu = "arm64" # v8gen.py는 시뮬레이터 빌드를 기본으로 설정하기 때문입니다.
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 봇이 사용하는 gn args 설정 arm_float_abi = "hard"는 다른 하드웨어(예: Nexus 7)에서 완전히 잘못된 프로그램 동작을 초래할 수 있습니다.

Sourcery G++ Lite 사용

Sourcery G++ Lite 크로스 컴파일러 스위트는 CodeSourcery의 Sourcery G++ 무료 버전입니다. ARM 프로세서를 위한 GNU Toolchain에 대한 페이지가 있습니다. 호스트/타겟 조합에 맞는 버전을 확인하십시오.

다음 지침은 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 .  # 한 번만 필요
    cp out/x64.release/natives_blob.bin . # 한 번만 필요
    cp out/x64.release/snapshot_blob.bin . # 한 번만 필요
    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