상세 컨텐츠

본문 제목

fastboot 프로그래밍

개발이야기/안드로이드 시스템, 장비

by mycatdid0 2022. 8. 19. 10:41

본문

반응형

(포스팅 2022.08.19)

 

 

- 목차
fastboot 빌드
fastboot에 표시되는 device명 바꾸기
안드로이드 기기의 fastboot 수정하기
마치며

 

안드로이드 시스템을 빌드하거나 개발해본 경험이 있으신 분들은 fastboot를 다뤄본 기억이 있으실 것입니다. fastboot는 안드로이드 기기에 바이너리를 다운로드하거나 기타 디버깅을 할 수 있는 프로토콜입니다. Linux 용으로도 있고 Windows 용으로도 있습니다.

 

이번 포스팅에선 fastboot를 빌드하거나 수정하는 방법에 대해 설명하겠습니다. 본 포스팅은 2018년 ~ 2019년의  본인의 개발 기록입니다.

 


 fastboot 빌드 

 

fastboot를 수정하여, 바이너리 다운로드 외 추가 기능을 넣고 싶은 분들이 계실 것입니다.

 

제가 찾은 관련 자료는 아래와 같습니다.

 

더보기

------------------------------
3- Building an SDK for Windows
------------------------------
Full Windows SDK builds are now only supported on Linux -- most of the
framework is not designed to be built on Windows so technically the Windows
SDK is build on top of a Linux SDK where a few binaries are replaced. So it
cannot be built on Windows, and it cannot be built on Mac, only on Linux.
I'll repeat this again because it's important:
  To build the Android SDK for Windows, you need to use a *Linux* box.
A- Pre-requisites
-----------------
Before you can even think of building the Android SDK for Windows, you need to
perform the steps from section "2- Building an SDK for MacOS and Linux" above:
setup and build a regular Linux SDK. Once this working, please continue here.
Under Ubuntu, you will need the following extra packages:
$ sudo apt-get install tofrodos
tofrodos adds a unix2dos command
B- Building
-----------
To build, perform the following steps:
$ . build/envsetup.sh
$ lunch sdk-eng
$ make win_sdk
Note that this will build both a Linux SDK then a Windows SDK.
The result is located at
   out/host/windows/sdk/android-sdk_eng.${USER}_windows/
C- Building just the tools
--------------------------------------
You can also build isolated windows tools directly on Linux without building
the full SDK.
To build, perform the following steps:
  $ cd ~/my-android-git
  $ . build/envsetup.sh
  $ lunch sdk-eng
  $ make winsdk-tools
A specific tool can be built using:
  $ make host_cross_adb
Then the binaries are located at
  out/host/windows-x86/bin/adb.exe

 

정리하면, 안드로이드 소스코드 내에서 make 명령을 통해 필요한 sdk 를 얻을 수 있으며, 윈도우용 fastboot를 개발하더라도 리눅스에서 빌드를 해야 한다는 말입니다.

 

exynos에서의 빌드

 

제가 빌드한 안드로이드 소스코드는 exynos 용이었습니다.

더보기

ㅁㅁㅁㅁㅁ/android$ lunch sdk-eng

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=5.1
TARGET_PRODUCT=sdk
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=
TARGET_2ND_ARCH_VARIANT=
TARGET_2ND_CPU_VARIANT=
HOST_ARCH=x86_64
HOST_OS=linux
HOST_OS_EXTRA=Linux-4.2.0-42-generic-x86_64-with-Ubuntu-14.04-trusty
HOST_BUILD_TYPE=release
BUILD_ID=LMY47D
OUT_DIR=out
============================================


ㅁㅁㅁㅁㅁ/android$ make win_sdk

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=5.1
TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
....
build/core/Makefile:34: warning: overriding commands for target `out/target/product/generic/system/lib/libreference-ril.so'
build/core/base_rules.mk:550: warning: ignoring old commands for target `out/target/product/generic/system/lib/libreference-ril.so'
build/core/Makefile:34: warning: overriding commands for target `out/target/product/generic/system/lib/libril.so'
build/core/base_rules.mk:550: warning: ignoring old commands for target `out/target/product/generic/system/lib/libril.so'
build/core/Makefile:34: warning: overriding commands for target `out/target/product/generic/system/bin/rild'
build/core/base_rules.mk:550: warning: ignoring old commands for target `out/target/product/generic/system/bin/rild'
build/core/Makefile:34: warning: overriding commands for target `out/target/product/generic/system/bin/iptables'
build/core/base_rules.mk:550: warning: ignoring old commands for target `out/target/product/generic/system/bin/iptables'
development/build/tools/windows_sdk.mk:19: *** MinGW is required to build a Windows SDK. Please 'apt-get install mingw32'.  Stop.

 

ㅁㅁㅁㅁㅁ/android$ sudo apt-get install mingw32
[sudo] password for ㅁㅁㅁㅁㅁ
Reading package lists... Done
Building dependency tree
Reading state information... Done
....
Processing triggers for man-db (2.6.7.1-1ubuntu1) ...
Processing triggers for install-info (5.2.0.dfsg.1-2) ...
Setting up mingw32-binutils (2.20-0.2ubuntu1) ...
Setting up mingw32-runtime (3.15.2-0ubuntu1) ...
Setting up mingw32 (4.2.1.dfsg-2ubuntu1) ...

ㅁㅁㅁㅁㅁ/android$ make win_sdk
============================================
PLATFORM_VERSION_CODENAME=REL
....
build/core/base_rules.mk:550: warning: ignoring old commands for target `out/target/product/generic/system/bin/rild'
build/core/Makefile:34: warning: overriding commands for target `out/target/product/generic/system/bin/iptables'
build/core/base_rules.mk:550: warning: ignoring old commands for target `out/target/product/generic/system/bin/iptables'
development/build/tools/windows_sdk.mk:22: *** Need a unix2dos command. Please 'apt-get install tofrodos'.  Stop.

ㅁㅁㅁㅁㅁandroid$ sudo apt-get install tofrodos
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  kde-l10n-engb libntdb1 python-ntdb
....
Processing triggers for doc-base (0.10.5) ...
Processing 1 added doc-base file...
Setting up tofrodos (1.7.13+ds-1ubuntu1) ...

ㅁㅁㅁㅁㅁ/android$ make win_sdk
============================================
PLATFORM_VERSION_CODENAME=REL
....
ㅡ> 에러
preparing StaticLib: libc_common [including  out/target/product/generic/obj/STATIC_LIBRARIES/libjemalloc_intermediates/libjemalloc.a]
target StaticLib: libc_common (out/target/product/generic/obj/STATIC_LIBRARIES/libc_common_intermediates/libc_common.a)
target SharedLib: libc (out/target/product/generic/obj/SHARED_LIBRARIES/libc_intermediates/LINKED/libc.so)
target Symbolic: libc (out/target/product/generic/symbols/system/lib/libc.so)
target Strip (keep symbols): libc (out/target/product/generic/obj/lib/libc.so)
Import includes file: out/target/product/generic/obj/STATIC_LIBRARIES/libm_intermediates/import_includes
target asm: libm <= bionic/libm/arm/s_cos.S
bionic/libm/arm/s_cos.S: Assembler messages:
bionic/libm/arm/s_cos.S:72: Error: selected FPU does not support instruction -- `vmov.i64 d1,#0'
bionic/libm/arm/s_cos.S:92: Error: D register out of range for selected VFP version -- `vldr d16,.Lpio2_1'
bionic/libm/arm/s_cos.S:94: Error: D register out of range for selected VFP version -- `vsub.f64 d16,d0,d16'
bionic/libm/arm/s_cos.S:96: Error: D register out of range for selected VFP version -- `vldr d17,.Lpio2_1t'
bionic/libm/arm/s_cos.S:98: Error: D register out of range for selected VFP version -- `vsub.f64 d0,d16,d17'


make: *** [out/target/product/generic/obj/STATIC_LIBRARIES/libm_intermediates/arm/s_cos.o] Error 1

 

정리하면, make win_sdk 까지는 진행할 수 있으나, 이후 어셈블러를 빌드 실패합니다.

 

fastboot 어셈블러 빌드 에러 고치기

 

제일 쉬운 방법부터 알려드리면, Linux용 fastboot를 빌드하시면 됩니다. 아래는 linux용 fastboot 소스코드를 수정하여 램덤프를 실행한 예제입니다.

 

더보기

ㅁㅁㅁㅁㅁ# ./ramdump_all.sh
uploading 'ramdump:40000000:10000000'...
rx : 268435456(100%)
_command_send.235 : file:dump_180516_165742_40000000_10000000.bin, writed:268435456
OKAY [ 30.326s]
finished. total time: 30.326s
uploading 'ramdump:50000000:10000000'...
rx : 268435456(100%)
_command_send.235 : file:dump_180516_165812_50000000_10000000.bin, writed:268435456
OKAY [ 31.543s]
finished. total time: 31.543s

 

윈도우용 fastboot를 빌드는, 빌드는 계속 리눅스 머신에서 실행하였으며  make win_sdk -mfpu neon 명령을 실행하고, 해당 명령에 관련된 빌드 설정을 고치는 식으로 작업하였습니다. 윈도우용 fastboot 빌드는 성공하지 못하였습니다.

 

 


 fastboot에 표시되는 device명 바꾸기 

 

하나의 PC에서 여러대의 기기에 fastboot로 바이너리를 다운받기 위해, fastboot에서 인식하는 아이디를 보드별로 분리하려 시도하였습니다.

 

> fastboot devices
Android 1.0     fastboot

 

소스코드를 검색하면 아래와 같이 몇가지를 찾을 수 있습니다만,

6 fastboot-ss.c    559 device_strings[DEVICE_STRING_CONFIG_INDEX]        = "Android Fastboot";
7 fastboot-ss.c    560 device_strings[DEVICE_STRING_INTERFACE_INDEX]     = "Android Fastboot";
9 fastboot.c       375 device_strings[DEVICE_STRING_CONFIG_INDEX]        = "Android Fastboot";
a fastboot.c       376 device_strings[DEVICE_STRING_INTERFACE_INDEX]     = "Android Fastboot";

 

이 문자열을 fastboot에 전달하는 것은 windows driver에서 결정하는 것이라서, driver에 따라 소스코드의 문자열을 전달하기도 전달하지 않기도 한다는 것을 확인하였습니다.

 

보드의 종류에 따라, fastboot의 정보에 고유 ID를 전달하는 경우도 있습니다. 아래는 퀄컴AP의 fastboot id를 C# 프로그램에서 감지한 결과입니다.

 

 


 안드로이드 기기의 fastboot 수정하기 

 

fastboot 실행시점에, 보드에 대한 추가 정보나 설정을 넣고 싶을 때가 있습니다.

 

안드로이드 바이너리는 부트로더 부분에 fastboot 소스코드를 포함하고 있습니다. 예를 들면 exynos의 경우 

uboot/common/cmd_fastboot.c

이며, 이 코드를 시작으로 관련 코드를 찾아갈 수 있습니다.

 

퀄컴AP의 경우, 제공한 안드로이드 소스코드에서 fastboot는 존재하지만 빌드는 안될 수 있습니다. 소스코드 제공처에 연락하여 해당 부분을 빌드할 수 있도록 조치를 취해달라 하시면 됩니다.

 


 마치며 

 

여기까지 'fastboot 작업 히스토리'였습니다.

 

fastboot는 간단하면서 USB 통신기능까지 내장하고 있어서 한번 연구해볼 가치가 있다고 생각합니다.

 

더 궁금한 점 있으시면 댓글로 문의주세요

 

 

언제나 감사드립니다.

반응형

관련글 더보기

댓글 영역