ADB (Android Debug Bridge)
ADB의 구성
client : development machine에서 동작. shell에서 client를 invocation해서 command 실행 가능. ADT, DDMS도 client
server : development machine의 background process이며, client와 daemon 사이에서의 communication을 관리
daemon : 각각의 device에서 동작하는 background process
client를 시작하면, ADB server가 실행중인지 확인해서 실행중이지 않으면 server를 시작시킨다. server가 시작되면 TCP의 5037 port로 binding해서 adb client로부터의 command를 받아들이는데, 모든 client는 server와 communication 하기 위해 5037 port를 사용.
실행파일 : ${android_sdk_path}/tools/adb
Command 입력 형식
adb [-d | -e | -s <serialNumber>] <command>
adb devices : adb server와 연결된 device를 보여준다.
형식 : [serialNumber] [state]
serialNumber = type-consolePort (ex : emulator-5554)
state = offline (device가 adb와 아직 연결되지 않았거나 응답이 없는 상태)
device (adb server와 연결된 상태)
-s option : 여러개의 device가 연결되어 있는 상태에서 특정 device에 command를 입력하고 싶을 때 사용
형식
adb -s <serialNumber> <command>
ex : adb -s emulator-5554 install sample.apk
Port forwarding
device의 port를 forwarding 하고 싶을 때 사용하는 명령
ex : port 6100에서 7100으로 forwarding 하고 싶은 경우
adb forward tcp:6100 tcp:7100
Copying files
pull
device에서 file을 copy해 올 때 사용 (recursively)
adb pull <remote> <local>
push
pull과 반대로 file을 device에 복사해 넣고 싶을 때 사용 (recursively)
adb push <local> <remote>
ex : adb push foo.txt /sdcard/foo.txt) (/sdcard/foo.txt 에서 /sdcard는 device에 존재하는 path
Listing of adb Commands
연결된 USB device에만 direct로 command 전송
USB device가 하나 이상이면 error return
-e
실행중인 device에만 command 전송
하나 이상의 device가 실행중이면 error return
-s <serialNumber>
특정 device에만 command 전송 (serialNumber 형식은 위 내용 참조)
General
devices
연결된 모든 device list 출력
help
제공되는 adb command list 출력
version
adb version 출력
Debug
logcat [<option>] [<filter-specs>]
log data 출력
bugreport
bugreport를 위한 dumpsys(system data dump), dumpstate(state dump), logcat data 출력
jdwp
특정 device의 JDWP process들의 list(pid) 출력
Data
install <path-to-apk>
application 설치
pull <remote> <local>
push <local> <remote>
위 내용 참조
Ports and Networking
forward <local> <remote>
특정 local port를 remote port로 fowarding
Scheme
tcp:<portnum>
local:<UNIX domain socket name>
dev:<character device name>
jdwp:<pid>
ppp <tty> [parm]...
USB로 PPP 실행
<tty> : PPP stream을 위한 tty
[parm] : PPP option
Scripting
get-serialno
adb의 serial number 출력
get-state
adb의 state 출력 (device / offline)
wait-for-device
device가 online일 때 까지 command 실행 정지
ex : adb wait-for-device shell getprop (state가 device가 되면 shell getprop command 실행
Note : 완전히 boot 된 이후에 사용 가능한 install 등의 command를 함께 사용할 경우 wait-for-device는 device state만 확인하므로 fully boot 되지 않았을 경우 error 발생 가능
Server
start-server
adb server가 실행중인지 확인해서 running 상태가 아니면 실행
kill-server
adb server process를 종료
Shell
shell
target device 안에서 remote shell을 시작
shell [<shellCommand>]
target device 안에서 shell command를 실행하고 remote shell을 빠져나간다
Shell Command 실행
ADB는 ash shell을 제공하는데, ash shell의 실행 바이너리는 device 내부의 /system/bin 경로에 존재
adb [-d | -e | -s <serialNumber>] shell로 remote shell을 실행한 후에 shell을 종료하고 싶으면 Ctrl + D or exit 입력
UI/Application Exerciser Monkey
User event의 random stream을 생성해 device에서 실행시키는 tool (stress test 용도)
ex : adb shell monkey -v -p packageName 500 (500가지의 random stream)
Other Shell Commands
device의 /system/bin 경로의 file들을 살펴보거나, adb -help로 확인
dumpsys
system data의 dump를 표시
dumpstate
state의 dump를 file로 저장
logcat [<option>]...[<filter-spec>]
logging을 가능하게 하거나 화면에 표시
dmesg
kernel debugging message를 화면에 출력
start
device를 시작(재시작)
stop
device 종료
Using logcat Commands
adb logcat
단순히 전체 log를 보고싶은 경우 사용 또는 remote shell에서 logcat 실행
Android에서 모든 log message는 tag와 priority를 가지고 있음
tag : system component를 짧은 문자열로 표현 (ex : view system의 경우 "View")
priority (ordered from lowest to highest)
V (Verbose)
D (Debug)
I (Info)
W (Warning)
E (Error)
F (Fatal)
S (Silent)
logcat 실행 후에 나타나는 log message에서 tag와 priority가 첫 column에 priority/tag 형태로 표시
ex : I/ActivityManager( 585) : Starting activity : Intent { action = android.intent.action... }
logcat의 filter는 tag:priority 형태로 표현하는데 tag는 표시하려는 tag의 이름을 입력하면 되고 입력한 priority와 상위 priority의 log들을 표시
ex : adb logcat ActivityManager:I MyApp:D *:S
ActivityManager의 I(Info) level 이상, MyApp의 D(Debug) level 이상의 log들만 표시
default filter expression
환경변수 ANDROID_LOG_TAGS에 default로 사용할 filter expression을 setting 후에 export 해서 사용
ex : export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
Note : remote shell을 사용해서 logcat을 실행하고 있을 경우 export 되지 않음 (?)
Controlling Log Output Format
-v option을 사용해서 출력되는 log의 format 변경 가능
output format
brief : priority/tag, PID 표시 (default)
process : PID only
tag : priority/tag only
thread : process:thread, priority/tag only
raw : 다른 metadata field 없이 raw log message 표시
time : date, invocation time, priority/tag, PID
long : 모든 metadata filed와 message 표시
ex : adb logcat -v thread
Viewing Alternative Log Buffers
Android logging system은 log message들을 위해 여러 개의 circular buffer를 가지고 있고 default circular buffer가 모든 log를 보관하지 않기 때문에 다른 circular log buffer의 내용을 보고 싶을 때에는 -b option을 사용해서 circular buffer를 변경해주어야 한다.
Buffers
radio : radio/telephony 관련된 log message를 보관하는 buffer
events : related-events
main : main log buffer (default)
ex : adb logcat -b radio
Viewing stdout and stderr
Android에서는 default로 stdout과 stderr ouput을 /dev/null로 내보내는데, file에 쓰도록 변경 가능하고 이 경우 변경 전에 device를 stop 후 setprop shell command를 실행해서 redirection 설정해야 한다. device start 이후에는 stop 전까지 설정이 유지된다. default로 설정을 유지하고 싶다면, /data/local.prop에 기록
ex :
adb shell stop
adb shell setprop log.redirect-stdio true
adb shell start
Listing of logcat Command Options
-b <buffer>
load log buffer
-c
모든 log를 clear하고 빠져나간다
-d
log를 화면에 dump하고 종료
-f <filename>
log를 <filename>에 기록. default는 stdout
-g
특정 log buffer의 size를 출력하고 종료
-n <count>
rotated log의 최대값을 <count>로 설정. default는 4, -r option이 필요
-r <kbytes>
log file을 <kbytes>씩 rotate. default는 16, -f option 필요
-s
default filter를 silent로 설정
-v <format>