개발자라면 자신이 사용하고 있는 도구들에 대한 개념을 어느 정도는 이해하고 있어야만 합니다. 그런 의미에서 ADB( Android Debug Bridge )에 대한 글을 번역해 보았습니다.


원문 : Android Debug Bridge.

주의 : 번역이 개판이므로 이상하면 반드시 원문을 참조하세요.

주의 : 가독성을 높이기 위해서 발음이 비슷하거나 잘 알려진 용어는 한글로 표기합니다.

주의 : 허락받고 번역한 것이 아니므로 언제든 내려갈 수 있습니다.




Android Debug Bridge


Android Debug Bridge( adb )는 다용도의 명령줄 도구인데, 당신이 에뮬레이터 인스턴스나 안드로이드용 장치와 통신할 수 있도록 해 준다. 이는 클라이언트-서버 프로그램으로, 세 가지 요소를 포함한다.


  • 클라이언트. 이는 당신의 개발 머신 상에서 동작한다. 당신은 adb 명령을 날림으로써 쉘shell로부터 클라이언트를 실행할 수 있다. ADT 플러그인과 DDMS 와 같은 다른 안드로이드 도구들도 adb 클라이언트들을 생성한다.
  • 서버. 이는 당신의 개발 장치 상에서 백그라운드 프로세스로서 동작한다. 이 서버는 클라이언트와 에뮬레이터나 장치상에서 실행중인 adb daemon 사이의 통신을 관리한다.
  • Daemon. 이는 각각의 에뮬레이터나 장치 상에서 백그라운드 프로세스로서 동작한다.


당신은 adb 도구를 <sdk>/paltform-tools/ 에서 찾을 수 있다.


당신이 adb 클라이언트를 실행할 때, 그 클라이언트는 먼저 이미 실행중인 adb 서버 프로세스가 존재하는지를 검사한다. 만약 존재하지 않으면, 그것은 서버 프로세스를 실행한다. 서버가 시작될 때, 그것은 로컬 TCP 포트 5037 에 연결되며, adb 클라이언트들로부터 보내지는 명령들을 받는다 - 모든 adb 클라이언트들은 5037 포트를 사용해서 adb 서버와 통신한다.


그리고 나서 서버는 모든 실행중인 에뮬레이터/장치 인스턴스들에 대한 연결을 설정한다. 그것은 에뮬레이터/장치들에 의해 사용되는 5555 에서 5585 사이의 홀수 번호 포트들을 스캐닝함으로써 에뮬레이터/장치 인스턴스들을 배치한다. 서버가 adb daemon 을 찾으면, 그것은 그 포트에 연결을 설정한다. 각 에뮬레이터/장치 인스턴스들은 연속된 포트의 쌍을 요청한다는데 주의하라 - 콘솔 연결을 위해 짝수 번호 포트를 사용하고, adb 연결을 위해 홀수 번호 포트를 사용한다. 예를 들어 :


에뮬레이터 1, 콘솔 : 5554

에뮬레이터 1, adb : 5555

에뮬레이터 2, 콘솔 : 5556

에뮬레이터 2, adb : 5557

이런 식이다...


위에서 보이듯이 5555 포트에 연결된 에뮬레이터 인스턴스는 5554 포트에서 응답을 받는 콘솔의 인스턴스와 동일하다.


일단 서버가 모든 에뮬레이터 인스턴스들에 대한 연결을 설정하고 나면, 당신은 adb 명령을 사용해서 그러한 인스턴스들에 접근할 수 있다. 서버는 에뮬레이터/장치 인스턴스들에 대한 연결을 관리하고 다중의 adb 클라이언트들로부터의 명령을 다루기 때문에, 당신은 모든 클라이언트들( 혹은 스크립트 )로부터 모든 메율레이터/장치 인스턴스들을 제어할 수 있다.


Syntax



당신은 개발 머신의 명령줄이나 스크립트에서 adb 명령을 제출issue할 수 있다. 용례는 다음과 같다 :



만약 단 하나의 에뮬레이터가 실행되고 있거나 단 하나의 장치만이 연결되어 있다면, adb 명령은 기본적으로 그 장치로 보내 진다. 만약 다중의 에뮬레이터가 실행되고 있거나 다중의 장치가 연결되어 있다면, 당신은 -d, -e, -s 옵션을 사용해서 그 명령이 향해야만 하는 대상 장치를 지정해야할 필요가 있다.


Commands



아래 표는 지원되는 adb 명령들을 모두 열거하고, 그것들의 의미 및 용례를 설명한다.


표1. 이용 가능한 adb 명령들.

 Category  Command  Description  Comments

 Target

 Device

 -d

 adb 명령이 연결된 하나의 USB 장치로만 향함.

 두 개 이상의 USB 장치가 연결되어 있다면 에러를 반환함.

 -e

 adb 명령이 실행중인 단 하나의 에뮬레이터 인스턴스로만 향함.

 두 개 이상의 에뮬레이터 인스턴스가 실행중이면 에러를 반환함.

 -s <serialNumber>

 adb 명령이 특정 에뮬레이터/장치 인스턴스로 향함. adb 에 할당된 ( "emulator-5556" 과 같은 ) 시리얼 넘버에 의해서 지정됨.

 Directing Commands to a Specific Emulator/Device instance 를 참조하라.

 General  devices

 연결된 모든 에뮬레이터/장치 인스턴스들의 리스트를 출력함.

 더 많은 정보를 원한다면 Querying for Emulator/Devices Instances 를 참조하라.

 help  지원되는 adb 명령들의 리스트를 출력함.  
 version  adb 버전 번호를 출력함.  
 Debug

 logcat [option] [filter-specs]

 화면에 로그 데이터를 출력함.

 

 bugreport

 버그 리포팅을 위한 목적으로 dumpsys, dumpstate, logcat 데이터를 화면에 출력함.

 
 jdwp

 주어진 장치에서 이용 가능한 JDWP 프로세스들의 리스트를 출력함.

 당신은 forward jdwp:<pid> 포트 포워딩 명세를 사용해서 지정한 JDWP 프로세스에 연결할 수 있다. 예를 들어 :

 adb foward tcp:8000 jdwp:472

 jdb -attach localhost:8000

 Data

 install <path-to-apk>

 안드로이트 응용프로그램을 에뮬레이터/장치에 밀어 넣음( .apk 파일의 전체 경로를 지정 ).

 
 pull <remote> <local>

 지정된 파일을 에뮬레이터/장치 인스턴스로부터 당신의 개발 컴퓨터로 복사함.

 

 push <local> <remote>

 지정되 파일을 당신의 개발 컴퓨터로부터 에뮬레이터/장치 인스턴스로 복사함.  
 Port and
 Networking

 forward <local> <remote>

 소켓 연결들을 지정된 로컬 포트로부터 에뮬레이터/장치 인스턴스의 지정된 리모트 포트로 포워딩.

 포트 명세는 다음과 같은 정책을 사용할 수 있음 :
 tcp:<portnum>

 local:<UNIX domain socket name>

 dev:<character device name>

 jdwp:<pid> 

 ppp <tty> [param]...

 USB 에 PPP 를 실행함.

  • <tty> - PPP 스트림을 위한 tty. 예를 들어 dev:/dev/omap_csmi_ttyl.
  • [param]... - 0 개 이상의 PPP/PPPD 옵션들. defaultroute, local, notty 등.

 당신은 자동적으로 PPP 연결을 시작해서는 안된다는 것에 주의하라.

 
 Scripting  get-serialno

 adb 인스턴스 시리얼 넘버 문자열을 출력.

 더 많은 정보를 원한다면 Querying for Emulator/Device Instances 를 참조하라.
 get-state

 에뮬레이터/장치 인스턴스의 adb 상태를 출력.

 

 wait-for-device

 장치가 연결될 때까지 실행을 중지 - 즉 인스턴스 상태가 device 일 때까지.

 당신은 이 명령을 어떤 adb 명령들 앞에 배치할 수 있다. 그 명령들은 다른 명령들이 제출되기 전에 에뮬레이터/장치 인스턴스가 연결될 때까지 기다려야 하는 명령들이다. 아래 예가 있다.

 이 명령은 전체 시스템이 완전히 부팅되기 전까지 adb 를 기다리게 하지는 않는다. 그러한 이유로, 당신은 그것을 완전히 시스템이 부팅되기를 요구하는 명령들 앞에다가 배치하면 안 된다. 그러한 예로, install 은 안드로이드 패키지 매니저를 요구하는데, 이는 시스템이 완전히 부팅된 후에만 이용 가능하다. 다음과 같은 명령은

에뮬레이터나 장치 인스턴스가 adb 서버에 연결되자 마자 install 명령을 제출하지만, 안드로이드 시스템은 완전히 부팅되어 있기 전이다. 그래서 그것은 에러를 만들 것이다.

 Server  start-server

 adb 서버 프로세스가 실행중인지 검사하고, 실행중이 아니면 시작함.

 
 kill-server

 adb 서버 프로세스를 종료함.

 
 Shell  shell

 리모트 쉘을 대상 에뮬레이터/장치 인스턴스에서 시작함.

 더 많은 정보를 원하면 Issuing Shell Commands 를 참조하라.

 shell [shellCommand]

 쉘 명령을 대상 에뮬레이터/장치 인스턴스에 제출하고, 리모드 쉘을 나감.


Querying for Emulator/Device Instances



adb 명령을 제출하기 전에, 어떤 에뮬레이터/장치 인스턴스들이 adb 서버에 연결되는지 아는 것이 도움이 된다. 당신은 연결된 에뮬레이터/장치들의 리스트를 devices 명령을 사용해서 생성할 수 있다.



응답으로, adb 는 각 인스턴스에 대한 상태 정보를 출력한다.


  • 시리얼 넘버 - 에뮬레이터/장치 인스턴스를 유일하게 식별하기 위해서 그것의 콘솔 포트 넘버를 사용해 adb 에 의해 생성된 문자열이다. 그 시리얼 넘버의 포맷은 <type>-<consolePort>이다. 여기에 시리얼 넘버의 예가 있다 : enumerator-5554.
  • 상태 - 그 인스턴스의 연결 상태는 다음 중 하나일 것이다.
    • offline - 그 인스턴스가 adb 에 연결되지 않았거나 응답하지 않고 있음.
    • device - 그 인스턴스가 이제 adb 서버에 연결됨. 이 상태는 안드로이드 시스템이 완전히 부팅되거나 실행중임을 내포하지 않으며 선택적이다. 왜냐하면 그 인스턴스는 시스템이 부팅중일 때 adb 에 연결되기 때문이다. 그러나 부팅이 되고 나면, 에뮬레이터/장치 인스턴스에 대한 일반적인 실행가능한 상태이다.
    • no device - 어떠한 에뮬레이터/장치도 연결되지 않음.


각 인스턴스를 위한 출력은 다음과 같은 형식이다 :



여기 devices 명령과 그것의 출력을 보여 주는 예가 있다.



Directing Commands to a Specific Emulator/Device Instance



만약 다중의 에뮬레이터/장치 인스턴스들이 실행중이라면, 당신은 반드시 adb 명령들을 제출할 때 대상 인스턴스를 지정해야만 한다. 이를 위해서, 명령들에서 -s 옵션을 사용하라. -s 옵션의 용례는 다음과 같다.



보면 알겠지만, 당신은 adb 할당 시리얼 넘버를 사용해 명령을 위한 대상 인스턴스를 지정한다. 당신은 devices 명령을 사용해 실행중인 에뮬레이터/장치 인스턴스들의 시리얼 넘버를 획득할 수 있다. 예를 들어 :



다중 장치들이 이용가능 할 때, 만약 당신이에뮬레이터/장치 인스턴스를 지정하지 않고 명령을 제출한다면, adb 는 에러를 생성한다는 것에 주의하라.


당신이 이용 가능한 다중의 장치( 하드웨어 혹은 에뮬레이터 )를 가지고 있지만 단 하나만이 에뮬레이터라면, 단순히 -e 옵션을 사용해 에뮬레이터에다가 명령들을 보내라. 이와 유사하게 다중의 장치들이 있지만 단 하나의 하드웨어 장치만이 연결되었다면, -d 옵션을 사용해서 하드웨어 장치에 명령을 보내라.


Installing an Application



당신은 개발 컴퓨터로부터의 응용프로그램을 복사해 에뮬레이터/장치 인스턴스에 설치하기 위해서 adb 를 사용할 수 있다. 이를 위해, install 명령을 사용하라. 그 명령을 사용하면, 당신은 설치하기 원하는 .apk 파일의 경로를 지정해야만 한다.



에뮬레이터/장치 인스턴스 상에 설치하고자 하는 .apk 을 생성하는 방법에 대한 더 많은 정보를 원한다면, Building and Running 을 참조하라.


만약 당신이 Eclipse IDE 를 사용하고 있고 ADT 플러그인이 설치되어 있다면, 당신은 에뮬레이터/장치 상에 응용프로그램을 설치하기 위해 adb( 혹은 aapt )를 직접 사용할 필요가 없다는 것을 기억하라. 대신에 ADT 플러그인이 당신을 위해 응용프로그램의 패키징과 설치를 처리해 준다.


Forwarding Ports



당신은 forward 명령을 사용해서 임의의 포트 포워딩을 설정할 수 있다 - 특정 호스트 포트상에서 에뮬레이터/장치 상의 다른 포트로의 포워딩 요청. 여기 6100 호스트 포트에서 에뮬레이터/장치 포트 7100 으로의 포워딩을 설정하는 방법이 다음에 나와 있다.



당신은 다음과 같이 이름있는 추상 UNIX 도메인 소켓들로 포워딩을 설정하기 위해서 adb 를 사용할 수 있다.



Copying Files to or from an Emulator/Device instance



당신은 adb 의 pull 과 push 명령들을 사용해서 에뮬레이터/장치 인스턴스로부터 혹은 인스턴스로 파일을 복사할 수 있다. 특정 위치로 APK 파일을 복사만하는 install 명령과는 다르게, pull 과 push 명령은 에뮬레이터/장치 인스턴스의 모든 위치로 임의의 디렉토리나 파일들을  복사할 수 있게 해 준다.


에뮬레이터나 장치로부터 파일이나 디렉토리( 그리고 그것의 하위 디렉토리들 )를 복사하기 위해서는, 다음과 같은 명령을 사용한다.



파일이나 디렉토리( 그리고 그것의 하위 디렉토리들 )를 에뮬레이터나 장치로 복사하기 위해서는, 다음과 같은 명령을 사용한다.



명령에서 <local> 과 <remote> 는 당신의 개발 머신( local ) 과 에뮬레이터/장치 인스턴스( remote ) 상의 대상 파일/디렉토리에 대한 경로를 가리킨다. 예를 들어 :



Using activity manager( am )


adb 쉘에서, 당신은 activity manager( am ) 도구를 사용해 명령들을 제출하여 activity 를 시작하고, 프로세스를 강제로 종료시키고, intent 를 송출하고broardcast, 장치 스크린 속성들을 수정하는 등과 같은 다양한 시스템 동작들을 수행할 수 있다. 쉘에 있는 동안, 그 문맥은 다음과 같다 :



당신은 remote 쉘에 진입하지 않고도 adb 로부터 직접적으로 activity manager 명령을 제출할 수도 있다. 예를 들어 :



표2. 이용 가능한 activity manager 명령들.

 Command  Description 

 start [options] <INTENT>

 <INTENT> 에 의해 지정된 Activity 를 시작한다.

 Specification for <INTENT> arguments 를 참조하라.

 Option 들은 다음과 같다:

  • -D : 디버깅을 활성화.
  • -W : 론칭launch이 완료될 때까지 대기.
  • --start-profiler <FILE>: 프로파일러를 시작하고 <FILE>로 결과를 보냄.
  • -p <FILE> : --start-profiler 와 비슷하지만, 프로파일링은 앱이 idle 이 될 때 멈춤.
  • -R : <COUNT> 번 activity 론칭을 반복함. 각각의 반복에 앞서, 최상위 activity 는 종료될 것이다.
  • -S : 대상 앱을 activity 가 시작하기 전에 강제로 종료함.
  • --opengl-trace : OpenGL 함수들의 추적을 활성화.
  • --user <USER_ID>|current : 어떠한 사용자가 실행할 것인지를 지정; 만약 지정되지 않으면, 현재 사용자로서 실행됨.
 startservice [options] <INTENT>

 <INTENT> 에 의해 지정된 Service 를 시작한다.

 Specification for <INTENT> arguments 를 참조하라.

 옵션들은 다음과 같다 :

  • --user <USER_ID> | current : 어떠한 사용자로서 실행할 것인지를 지정; 만약 지정되지 않으면, 현재 사용자로서 실행됨.

 force-stop <PACKAGE>

 <PACKAGE>와 연관된 모든 것들을 강제로 종료한다( 앱의 패키지 이름 ).
 kill [options] <PACKAGE>

 <PACKAGE>와 연관된 모든 프로세스들을 종료한다. 이 명령은 종료하기 안전하고 다른 사용자 경험에 영향을 주지 않는 프로세스들만 죽인다.

 옵션들은 다음과 같다 :

  • --user <USER_ID>|all|current : 죽일 프로세스를 소유한 사용자를 지정한다; 만약 지정되지 않으면 모든 사용자이다.

 kill-all

 모든 백그라운드 프로세스들을 죽인다.

 broadcast [options] <INTENT>

 broadcast intent 를 제출한다.

 Specification for <INTENT> arguments 를 참조하라.

 옵션들은 다음과 같다 :

[--user <USER_ID>|all|current] : 어떤 사용자에게 보낼 것인지 지정한다; 만약 지정되지 않으면 모든 사용자에게 보낸다.

 instrument [options] <COMPONENT>

 Instrumentation 인스턴스를 사용해 모니터링을 시작한다. 일반적으로 대상 <COMPONENT> 는 <TEST_PACKAGE>/<RUNNER_CLASS> 형식이다.

 옵션은 다음과 같다 :

  • -r : raw result 들을 출력한다( 그렇지 않으면 <REPORT_KEY_STREAMRESULT> 를 디코딩한다 ). [-e perf true] 와 함께 사용해 성능 측정을 위한 raw 출력을 생성한다.
  • -e <NAME> <VALUE> : 인자 <NAME> 을 <VALUE>로 설정한다. 테스트 실행자를 위한 공용 형식은 -e <testrunner_flag> <value>[, <value>... ] 이다.
  • -p <FILE> : <FILE> 에 프로파일링 데이터를 작성한다.
  • -w : 반환하기 전에 instrumentation 이 끝나길 기다린다. test runner 들에게 요구된다.
  • --no-window-animation : 실행하는 동안 윈도우 애니메이션들을 끈다.
  • --user <USER_ID>|current : instrumentation 이 실행될 사용자를 지정한다; 만약 지정되지 않으면 현재 사용자이다.

 profile start <PROCESS> <FILE>

 <PROCESS> 상에서 프로파일러를 시작하는데, 그 결과를 <FILE>에 쓴다.

 profile stop <PROCESS>

 <PROCESS> 상의 프로파일러를 중지시킨다.
 dumpheap [options] <PROCESS> <FILE>

 <PROCESS> 의 힙을 덤프하는데, <FILE> 에 쓴다.

 옵션들은 다음과 같다 :

  • -user [<USER_ID>|current] : 프로세스 이름을 공급할 때, 덤프할 프로세스의 사용자를 지정한다; 만약 지정되지 않으면 현재 사용자이다.
  • -n : managed heap 대신에 native heap 을 덤프한다.
 set-debug-app [options] <PACKAGE>

 응용프로그램 <PACKAGE> 를 디버깅하기 위해 설정한다 :

 옵션들은 다음과 같다 :

  • -w : 디버거를 위해 응용프로그램이 시작되기를 기다린다.
  • --persistent : 이 값을 보존한다.
 clear-debug-app

 set-debug-app 를 사용해 디버깅중인 이전의 패키지를 클리어한다.

 monitor [options]

 crash 나 ANR 을 모니터링하기 시작한다.

 옵션들은 다음과 같다 :

  • --gdb : Start gdbserv on the given port at crash/ANR. 

 screen-compat [on|off ] <PACKAGE>

 <PACKAGE> 의 screen compativility 를 제어한다.

 display-size [reset|<WxH>]

 에뮬레이터/장치 디스플레이 사이즈를 덮어 쓴다. 이 명령은 당신의 앱을 다양한 스크린 사이즈를 넘나들며 테스트하는데 유용하다. 이는 큰 스크린을 가진 장치를 사용해 작은 스크린 해상도를 미믹함으로써 이루어 진다. 예를 들어 :

 am display-size 1280x800

 display-density <dpi>

 에뮬레이터/장치 디스플레이 밀도를 덮어 쓴다.이 명령은 높은 밀도의 스크린 환경 상에서 낮은 밀도의 스크린을 사용해 다양한 스크린 밀도를 넘나들며 당신의 앱을 테스트하는데 유용하다. 예를 들어 :

 am display-density 480

 to-uri <INTENT>

 주어진 intent 명세를 URI 로서 출력한다.

 Specification for <INTENT> arguments 를 참조하라.

 to-intent-uri <INTENT>

 주어진 intent 명세를 intent 로서 출력한다 : URI.

 Specification for <INTENT> arguments 를 참조하라. 


Specification for <INTENT> arguments


<INTENT> 인자를 취하는 activity manager 명령들을 위해, 당신은 다음과 같은 옵션들을 사용해 intent 를 지정할 수 있다 :


-a <ACTION>

"android.intent.action.VIEW" 와 같은 intent action 을 지정한다. 당신은 이를 한 번만 선언할 수 있다.

-d <DATA_URI>

"content://contacts/people/1" 와 같은 intent data URI 를 지정한다. 당신은 이를 한 번만 선언할 수 있다.

-t <MIME_TYPE>

"image/png" 과 같은 intent MIME 타입을 추가한다. 당신은 이를 한 번만 선언할 수 있다.

-c <CATEGORY>

"android.intent.category.APP_CONTACTS" 와 같은 intent 카테고리를 지정한다.

-n <COMPONENT>

"com.example.app/.ExampleActivity" 와 같은 명시적인 intent 를 생성하기 위한 패키지 이름 접두어를 사용해 컴포넌트 이름을 지정한다..

-f <FLAGS>

intent 에 setFlags() 에 의해 지원되는 플래그를 추가한다.

--esn <EXTRA_KEY>

null extra 를 추가한다. 이 옵션은 URI intent 들에 대해서는 지원되지 않는다.

-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE>

문자 데이터를 key-value 쌍으로서 추가한다.

--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE>

Boolean 데이터를 key-value 쌍으로서 추가한다.

--ei <EXTRA_KEY> <EXTRA_INT_VALUE>

정수 데이터를 key-value 쌍으로서 추가한다.

--el <EXTRA_KEY> <EXTRA_LONG_VALUE>

Long 데이터를 key-value 쌍으로서 추가한다.

--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE>

실수 데이터를 key-value 쌍으로서 추가한다.

--eu <EXTRA_KEY> <EXTRA_URI_VALUE>

URI 데이터를 key-value 쌍으로서 추가한다.

--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE>

ComponentName 개체로서 변환되고 전달될 컴포넌트의 이름을 추가한다.

--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]

정수 배열을 추가한다.

--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]

Long 배열을 추가한다.

--efa <EXTRA_KEY> <EXTRA_FLOAT_VALUE>[,<EXTRA_FLOAT_VALUE...]

실수 배열을 추가한다.

--grant-read-uri-permission

FLAG_GRANT_READ_URI_PERMISSION 플래그를 포함시킨다.

--grant-write-uri-permission

FLAG_GRANT_WRITE_URI_PERMISSION 플래그를 포함시킨다.

--debug-log-resolution

FLAG_DEBUG_LOG_RESOLUTION 플래그를 포함시킨다.

--exclude-stopped-packages

FLAG_EXCLUDE_STOPPED_PACKAGES 플래그를 포함시킨다.

--include-stopped-packages

FLAG_INCLUDE_STOPPED_PACKAGES 플래그를 포함시킨다.

--activity-brought-to-front

FLAG_ACTIVITY_BROUGHT_TO_FRONT 플래그를 포함시킨다.

--activity-clear-top

FLAG_ACTIVITY_CLEAR_TOP 플래그를 포함시킨다.

--activity-clear-when-task-reset

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 플래그를 포함시킨다.

--activity-exclude-from-recents

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 플래그를 포함시킨다.

--activity-launched-from-history

FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY 플래그를 포함시킨다.

--activity-multiple-task

FLAG_ACTIVITY_MULTIPLE_TASK 플래그를 포함시킨다.

--activity-no-animation

FLAG_ACTIVITY_NO_ANIMATION 플래그를 포함시킨다.

--activity-no-history

FLAG_ACTIVITY_NO_HISTORY 플래그를 포함시킨다

--activity-no-user-action

FLAG_ACTIVITY_NO_USER_ACTION 플래그를 포함시킨다.

--activity-previous-is-top

FLAG_ACTIVITY_PREVIOUS_IS_TOP 플래그를 포함시킨다.

--activity-reorder-to-front

FLAG_ACTIVITY_REORDER_TO_FRONT 플래그를 포함시킨다.

--activity-reset-task-if-needed

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 플래그를 포함시킨다.

--activity-single-top

FLAG_ACTIVITY_SINGLE_TOP 플래그를 포함시킨다.

--activity-clear-task

FLAG_ACTIVITY_CLEAR_TASK 플래그를 포함시킨다.

--activity-task-on-home

FLAG_ACTIVITY_TASK_ON_HOME 플래그를 포함시킨다.

--receiver-registered-only

FLAG_RECEIVER_REGISTERED_ONLY 플래그를 포함시킨다.

--receiver-replace-pending

FLAG_RECEIVER_REPLACE_PENDING 플래그를 포함시킨다.

--selector

intent 데이터와 타입을 설정하기 위해서 -d 와 -t 옵션의 사용을 요구한다.

<URI> <COMPONENT> <PACKAGE>

위의 옵션들 중 하나에 의해 한정되지 않을 때, 당신은 직접적으로 URI, 패키지 이름, 컴포넌트 이름을 지정할 수 있다. 인자가 한정되지 않았을 때, 그 도구는 그것이 ":"( 콜론 )을 포함한다면 그 인자를 URI 로 가정한다; 그것이 "/"( 슬래쉬 )를 포함하면 인자를 컴포넌트 이름으로 가정한다; 그렇지 않으면 그것은 인자를 패키지 이름으로 가정한다.


Using package manager( pm )


adb 쉘 안에서, 당신은 package manager( pm ) 도구를 사용하는 명령들을 제출함으로써 장치에 설치된 응용프로그램 패키지들 상에서의 동작과 질의를 수행할 수 있다. 쉘에 있는 동안, 그 문맥은 다음과 같다 :



당신은 remote 쉘에 진입하지 않고도 adb 로부터 package manager 명령을 직접적으로 제출할 수 있다. 예를 들어 :



표3. 이용 가능한 package manager 명령들.

 Command  Description

 list packages [options] <FILTER>

 모든 패키지들을 출력하는데, 선택적으로 <FILTER> 에 있는 텍스트를 포함하는 패키지 이름을 가진 것들만 출력한다.

 옵션 :

  • -f : 그것들의 연관 파일들을 보여 준다.
  • -d : disabled 패키지들만을 보여 주는 필터.
  • -e : enabled 패키지들만을 보여 주는 필터.
  • -s : 시스템 패키지들만을 보여 주는 필터.
  • -3 : 서드 파티 패키지들만을 보여 주는 필터.
  • -i : 패키지들을 위한 인스톨러들을 보여 준다.
  • -u : uninstalled 패키지들도 포함한다.
  • --user <USER_ID> : 질의할 사용자 공간.

 list permission-groups

 모든 알려진 권한 그룹들을 출력한다.

 list permissions [options] <GROUP>

 모든 알려진 권한 그룹들을 출력하는데, 선택적으로 <GROUP> 에 있는 것들만 출력한다.

 옵션 :

  • -g : 그룹에 의해 조직함.
  • -f : 모든 정보를 출력함.
  • -s : 짧은 요약.
  • -d : 단지 위험한 권한들만을 열거함.
  • -u : 사용자가 보려고 하는 권한만을 열거함.
 list instrumentation

 모든 테스트 패키지를 열거함.

 옵션 : 

  • -f : 테스트 패키지를 위한 APK 파일을 열거함.
  • <TARGET_PACKAGE> : 이 앱만을 위한 테스트 패키지들을 열거함.

 list features

 시스템의 모든 기능을 출력함.

 list libraries  현재 장치에 의해 지원되는 모든 라이브러리들을 출력함.
 list users

 시스템상의 모든 사용자들을 출력함.

 path <PACKAGE>

 주어진 <PACKAGE>의 APK 경로를 출력함.

 install [options] <PATH>

 시스템에 ( <PATH>로 지정된 ) 패키지를 설치함.

 옵션 :

  • -l : forward lock 을 사용해 패키지를 설치.
  • -r : 데이터를 유지하면서 현존하는 앱을 재설치.
  • -t : 테스트 APK 들이 설치되도록 허용함.
  • -i <INSTALLER_PACKAGE_NAME > : 인스톨러 패키지 이름을 지정함.
  • -s : ( sd 카드와 같은  ) 공유 대용량 저장소에 패키지를 설치.
  • -f : 내부 시스템 메모리에 패키지를 설치.
  • -d : version code 다운그레이드를 허용.
 uninstall [options] <PACKAGE>

 시스템에서 패키지를 제거.

 옵션 :

  • -k : 데이터와 캐시 디렉토리들을 패키지가 제거된 후에도 남겨 둠.
 clear <PACKAGE>  패키지와 관련된 모든 데이터를 제거함.

 enable <PACKAGE_OR_COMPONENT>

 주어진 패키지나 컴포넌트를 이용 가능하게 함( "package/class" 로 작성됨).

 disable <PACKAGE_OR_COMPONENT>

 주어진 패키지나 컴포넌트를 이용 불가능하게 함( "package/class" 로 작성됨).

 disable-user [options] <PACKAGE_OR_COMPONENT>

 옵션 :

  • --user <USER_ID> : 이용 불가능하게 할 사용자.

 grant <PACKAGE_PERMISSION>

 응용프로그램에 대한 권한을 승인. 응용프로그램이 이미 선언한 선택적인 권한만이 승인될 수 있음.

 revoke <PACKAGE_PERMISSION>

 응용프로그램에 대한 권한에 대한 승인을 철회. 응용프로그램이 이미 선언한 선택적인 권한에 대해서만 승인이 철회될 수 있음.

 set-install-location <LOCATION>

 기본 설치 위치를 변경함. 위치 값들은 다음과 같다 :

  • 0 : Auto - 시스템이 최적의 위치를 결정함.
  • 1 : Internal - 내부 장치 저장소 상에 설치.
  • 2 : External - 외부 미디어 상에 설치.

 주의 : 이는 디버깅을 위한 용도이다; 이것은 응용프로그램이 깨지거나 다른 원하지 않는 행동을 하도록 만들 수 있다.

 get-install-location

 현재 설치 위치를 반환함. 반환값들을 다음과 같다 

  • 0 : Auto - 시스템이 최적의 위치를 결정함.
  • 1 : Internal - 내부 장치 저장소 상에 설치.
  • 2 : External - 외부 미디어 상에 설치.

 set-permission-enforced <PERMISSION> [true|false]

 주어진 권한이 강제되어야 하는지를 지정한다.

 trim-caches <DESIRED_FREE_SPACE>

 주어진 가용 공간에 도달하기 위해서 캐시 파일들을 손질한다.

 create-user <USER_NAME>

 주어진 <USER_NAME> 을 사용해 새로운 사용자를 생성하고, 그 사용자의 새로운 식별자를 출력함.

 remove-user <USER_ID>  주어진 <USER_ID>를 사용해 사용자를 제거하고, 그 사용자와 관련된 모든 데이터를 제거함.
 get-max-users

 장치에 의해 지원되는 최대 사용자 수를 출력함.


Examing sqlite3 databases from a remote shell


adb remote 쉘에서, 당신은 안드로이드 응용프로그램들에 의해서 생성된 SQLite 데이터베이스들을 관리하기 위해서 sqllite3 명령줄 프로그램을 사용할 수 있다. sqlite3 도구는 많은 유용한 명령들을 포함하고 있다; .dump 는 테이블의 내용을 출력하며, .schema 는 현존 테이블을 위한 SQL CREATE 상태를 출력한다. 이 도구는 SQLite 명령들을 실시간에 실행할 수 있는 기능을 제공하기도 한다.


sqlite3 를 사용하기 위해, 에뮬레이터 인스턴스 상의 remote 쉘로 들어간다. 그리고 나서 sqlite3 명령을 사용해 그 도구를 실행한다. sqlite3 를 실행할 때 당신은 선택적으로 당신이 살펴 보고자 하는 데이터베이스의 전체 경로를 지정할 수 있다. 에뮬레이터/장치 인스턴스들은 SQLite3 데이터베이스들을 /data/data/<package_name>/databases/ 폴더에다가 저장한다.


여기 예제가 있다 :



일단 sqlite3 를 실행하고 나면, 당신은 그 쉘에서 sqlite3 명령들을 제출할 수 있다. adb remote 쉘로 나가고 싶으면, exit 나 CTRL+D 를 사용한다.


UI/Application Exerciser Monkey


몽키는 당신의 에뮬레이터나 장치 상에서 실행되는 프로그램이며, 클릭, 터치, 제스쳐 등과 같은 사용자 이벤트들과 시스템 수준 이벤트들의 의사-랜덤 스트림들을 생성한다. 당신은 몽키를 사용해서 당신이 개발하고 있는 응용프로그램들에 대한 랜덤하지만 약간 반복적인 방식으로 스트레스 테스트를 할 수 있다.


몽키를 사용하는 가장 단순한 방법은 아래 명령을 사용하는 것인데, 그것은 당신의 응용프로그램을 실행하고 500 개의 의사-랜덤 이벤트들을 그것에 보낸다.



몽키를 위한 명령 옵션에 대한 더 많은 정보를 원한다면, 완전한 UI/Application Exerciser Monkey 문서화 페이지를 참조하라.


Other shell commands


이용 가능한 모든 쉘 프로그램들을 열거하기 위해서는 다음과 같은 명령을 사용하라 :



help 는 대부분의 명령들에 대해 이용할 수 있다.


표4 는 좀 더 공용적인 adb 쉘 명령들을 열거한다.


표4. 일부 다른 adb 쉘 명령들.

 Shell Command

 Description  Comments

 dumpsys

 스크린에 시스템 데이터를 덤프.

 Dalvik Debug Monitor Server( DDMS ) 도구는 당신이 사용하기에 더 쉬운 통합된 디버깅 환경을 제공한다.

 dumpstate  파일의 상태를 덤프.
 logcat [options]... [filter-spec]...  시스템 및 앱 로깅을 이용 가능하게 하고, 결과를 스크린에 출력.
 dmesg  커널 디버깅 메시지를 스크린에 출력.
 start

 에뮬레이터/장치 인스턴스를 시작( 재시작 ).

 
 stop  에뮬레이터/장치 인스턴스의 실행을 종료.  


Enabling locat logging



안드로이드 로깅 시스템은 시스템 디버그 출력을 수집하고 보기 위한 메커니즘을 제공한다. 다양한 응용프로그램 및 시스템의 일부로부터의 로그들은 일련의 circular buffer 들 안에 수집되는데, 그것들은 logcat 명령에 의해 보여지고 필터링될 수 있다.


당신은 logcat 명령을 사용해 시스템의 로그 버퍼들의 내용을 보고 따라갈 수 있다. 범용적인 용례는 다음과 같다 :



당신은 logcat 명령을 개발 컴퓨터나 에뮬레이터/장치 인스턴스의 remote adb 쉘에서 사용할 수 있다. 개발 컴퓨터에서 로그 출력을 보려면, 다음과 같이 한다 :



그리고 remote adb 쉘에서 로그 출력을 보려면 다음과 같이 한다 :



logcat 명령 옵션들과 filter 명세들에 대한 완전한 정보를 원한다면 Reading and Writing Logs 를 참조하라.


Stopping the adb server



어떤 경우에, 당신은 adb 서버 프로세스를 종료시키고, 그것을 다시 시작하기 원할 것이다. 예를 들어 adb 가 명령에 응답하지 않는다면, 당신은 그 서버를 종료시키고 재시작할 수 있으며, 그것은 그 문제를 해결할 것이다.


adb 서버를 중지하고자 한다면, kill-server 명령을 사용하라. 그리고 나서 당신은 다른 adb 명령을 제출함으로써 그 서버를 재시작할 수 있다.


+ Recent posts