본문 바로가기
Programming/Android

command - android ADB 명령어 활용

by ciwhiz 2015. 11. 13.
카테고리명령어설명비고
타겟 연결-d유일하게 연결된 USB 장치에 다이렉트로 adb 명령을 보냄만약 하나 이상의 USB 단말이 연결되어 있을 경우 에러를 리턴함
-e실행중인 에뮬레이터로 adb 명령을 보냄하나 이상의 에뮬레이터가 실행 중일 경우 에러를 리턴함
-s <시리얼번호>adb에서 할당된 시리얼넘버(“emulator-5556” 등과 같은)를 참조하여 해당 에뮬레이터나 단말로 adb 명령을 전송특정 에뮬레이터/단말에 명령 전송하기를 참조
일반devices연결된 모든 에뮬레이터/단말의 리스트를 화면에 보여줌에뮬레이터/단말 조회하기 참조
help지원하는 모든 adb 명령어를 화면에 보여줌
versionadb 버전을 보여줌
디버그logcat [option] [filter-specs]화면에 로그 데이터를 표시
bugreport버그 리포팅의 목적을 위해 dumpsys,dumpstate, logcat 데이터를 화면에 표시
jdwp주어진 장치에서 사용가능한 JDWP 프로세스의 리스트를 표시특정 JDWP 프로세스를 연결하기 위해 forward jdwp:<pid> 와 같이 포트포워딩을 사용할 수 있다. 
예를 들면 : 
adb forward tcp:8000 jdwp:472 
jdp -attach localhost:8000
데이터install <apk-경로>안드로이드 어플리케이션(.apk 파일의 full path가 명시된)을 에뮬레이터/단말에 설치
pull <remote> <local>특정 파일을 에뮬레이터/단말로 부터 개발 컴퓨터로 복사
push <local> <remote>특정 파일을 개발 컴퓨터로부터 에뮬레이터/단말로 복사
포트와 네트워킹forward <local> <remote>에뮬레이터/장치에 지정된 리모트 포트를 로컬 포트로 포워딩포트 규격은 다음의 스킴을 사용할 수 있다:
  • tcp:<포트번호>
  • local:<UNIX 도메인소켓 네임>
  • dev:<디바이스명>
  • jdwp:<pid>
ppp <tty> [parm]…USB를 통해 PPP를 실행
  • <tty> — the tty for PPP stream. For exampledev:/dev/omap_csmi_ttyl.
  • [parm]… — zero or more PPP/PPPD options, such asdefaultroute, local,notty, etc.

Note that you should not automatically start a PPP connection.


스크립팅get-serialnoadb 인스턴스의 시리얼 넘버를 출력에뮬레이터/단말 조회하기 참조
get-state에뮬레이터/단말의 adb 상태를 출력
wait-for-device디바이스가 온라인이 될 때(인스턴스의 상태가 device가 될 때)까지 실행을 막음다른 adb 명령 앞에 이 명령을 넣을 수 있다. 이런 경우 adb는 에뮬레이터/단말이 연결되기 전까지 다른 명령이 실행을 대기한다. 다음은 그 예이다:
adb wait-for-device shell getprop

Note : 완전히 boot 된 이후에 사용 가능한install 등의 command를 함께 사용할 경우 wait-for-device는 device state만 확인하므로 fully boot 되지 않았을 경우 error 발생 가능

서버start-serveradb 서버 프로세스가 실행 중인지를 체크하고 실행함
kill-serveradb 서버 프로세스를 종료
shell타겟 에뮬레이터/단말의 리모트 쉘을 실행함더 많은 정보는 쉘 명령어들을 참조
shell [쉘명령어]타겟 에뮬레이터/단말에 쉘 명령어를 수행한 후 리모트 쉘을 종료함

에뮬레이터/단말 조회하기

adb 명령어들을 실행하기 전에 에뮬레이어/단말이 adb 서버에 어떻게 연결되는지를 아는 것이 도움이 된다. 당신은devices 명령어를 사용하여 연결된 에뮬레이터/단말의 리스트를 볼 수 있다.

adb devices

adb는 응답으로 다음과 같은 각 인스턴스의 상태정보를 화면에 보여준다:

  • 시리얼 번호 - adb에 의해 만들어지며 콘솔 포트 넘버로 고유의 에뮬레이터/단말을 식별하는 문자열. 시리얼 번호의 포맷은 <type>-<consolePort>이다. 예를 들면 emulator-5554 와 같다.
  • 상태 - 인스턴스의 연결 상태이며 다음의 값 중 하나를 가진다.
    • offline - 인스턴스가 adb에 연결되지 않았거나 응답이 없음.
    • device - 인스턴스가 adb 서버에 접속되었음. 단, 시스템이 부팅되는 중에도 인스턴스는 adb에 연결 가능하기 때문에, 이 상태가 안드로이드 시스템이 완전히 부팅 및 작동중인지를 나타내는 것은 아니다. 그러나, 부팅이 완료된 후에는 에뮬레이터/디바이스는 정상적으로 동작할 수 있는 상태가 된다.
    • no device - 연결된 에뮬레이터나 단말이 없음.

각 인스턴스는 다음의 형식으로 출력된다:

[serialNumber] [state]

아래에 devices 명령과 그의 응답에 대한 예가 있다.

adb devices
List of devices attached
emulator-5554 device
emulator-5556 device
emulator-5558 device

특정 에뮬레이터/단말에 명령 전송하기

만역 여러개의 에뮬레이터/단말이 실행 중이라면 adb 명령을 실행할 때 특정 타겟을 명시하여야만 한다. 그러기 위해서는 -s 옵션을 사용한다. -s 옵션의 사용법은 다음과 같다:

adb -s <serialNumber> <command>

위와 같이 adb에 의해 할당된 시리얼 넘버를 사용하여 타겟 인스턴스를 지정할 수 있다. 실행중인 에뮬레이터/단말 인스턴스의 시리얼넘버를 얻기 위해서는 devices 명령을 사용한다. 예를 들면:

adb -s emulator-5556 install helloWorld.apk

만약 여러 인스턴스가 연결되어 있을 때, 타겟 에뮬레이터/단말을 지정하지 않고 명령을 전송하면 adb는 에러를 생성한다.

만약 (하드웨어나 에뮬레이팅된) 여러 디바이스가 사용 가능하지만 에뮬레이터는 하나만 연결되어 있다면, 간단히 -e옵션으로 에뮬레이터에 명령을 전송할 수 있다. 비슷하게 여러 디바이스 중 하드웨어 단말은 하나만 연결되어 있을 경우, -d 옵션으로 하드웨어 단말에 명령을 전송할 수 있다.

어플리케이션 설치하기

개발 컴퓨터로부터 어플리케이션을 복사하고 그것을 에뮬레이터/단말에 설치하기 위해 adb를 사용할 수 있다. 그러기 위해서 install 명령어를 사용한다. 명령과 함께 설치하기 원하는 .apk 파일의 경로를 지정한다.

adb install <path_to_apk>

에뮬레이터/장치에 설치할 수 있는 .apk 파일을 만드는 방법에 대한 자세한 설명은 빌드 및 실행하기 문서를 참고한다.

만약 ADT 플러그인이 설치된 Eclipse IDE를 사용한다면, 에뮬레이터/단말에 adb(또는 aapt)를 사용하여 직업 설치할 필요하는 대신, ADT 플러그인이 어플리케이션의 패키징과 설치를 처리한다.

포트 포워딩

forword 명령을 사용하여 특정 호스트 포트의 요청을 에뮬레이터/단말의 다른 포트로 포트 포워딩할 수 있다. 다음은 호스트 포트 6100번을 에뮬레이터/단말 7100 포트로 포트 포워딩하는 예제이다:

adb forward tcp:6100 tcp:7100

또한 아래 예시처럼, 추상적인 UNIX 도메인 소켓1)으로 포워딩할 수도 있다:

adb forward tcp:6100 local:logd

에뮬레이터/단말 인스턴스로(부터) 파일 복사하기

pull  push 명령을 통해 에뮬레이터/단말로(부터) 파일을 복사할 수 있다. install 명령과는 달리 APK 파일을 특정 경로에 단지 복사만 할 뿐이며, 임의의 파일이나 디렉토리도 에뮬레이터/단말의 지정한 경로로 복사할 수 있다.

에뮬레이터나 단말로 부터 파일 혹은 디렉토리(서브디렉토리를 포함)를 복사하려면 다음과 같이 사용한다.

adb pull <remote> <local>

파일 혹은 디렉토리(서브디렉토리를 포함)를 에뮬레이터나 단말로 복사하려면 다음과 같이 사용한다.

adb push <local> <remote>

명령내에서 <local>은 개발 머신상의 파일/디렉토리의 경로이며, <remote>는 에뮬레이터/단말상의 경로이다. 예를 들면 다음과 같다:

adb push foo.txt /sdcard/foo.txt

쉘 명령어들

adb는 연결된 단말이나 에뮬레이터 상에서 다양한 명령을 사용할 수 있는 유닉스 쉘을 제공한다. 명령 바이너리들은 에뮬레이터나 단말의 /system/bin/… 디렉토리에 저장되어 있다.

가장 일반적인 두가지 command 도구는 activity manager (am)과 package manager (pm)이다.

리모트 쉘에 들어가지 않고 하나의 명령을 실행하고자 할 때는 다음과 같이 사용한다:

adb [-d|-e|-s <serialNumber>] shell <shell_command>

또는, 에뮬레이터/단말의 리모트 쉘에 들어가려면 다음과 같이 사용한다:

adb [-d|-e|-s <serialNumber>] shell

리모트 쉘에서 빠져나오기를 원한다면 CTRL+D 나 exit를 치면 된다.

Activity manager (am) 사용하기

adb 쉘 내에서 activity 실행, 프로세스 강제 종료, intent 브로드캐스팅, 디바이스의 스크린 속성 변경 등 다양한 시스템 작업을 수행할 activity manager (am) 도구를 사용하여 명령을 실행할 수 있다. 쉘내에서의 문법은 다음과 같다:

am <command>

혹은, 아래의 예처럼 리모트 쉘에 접근하지 않고 바로 activity manager 명령을 실행할 수도 있다.

adb shell am start -a android.intent.action.VIEW

표 2. Activity manager 명령어들

명령어설명
start [option] <INTENT>지정한 <INTENT> Activity를 시작한다. <INTENT> 인자 규격을 참고하자. 

옵션은 다음과 같다:
  • -D: 디버깅 활성화
  • -W: 완전히 런칭될 때까지 대기
  • -start-profiler <FILE>: 프로파일러를 실행하고 <FILE>에 결과를 기록함
  • -P <FILE>: -start-profiler와 비슷하지만 앱이 idle 상태일때 프로파일링을 멈춤
  • -R: activity 실행을 <COUNT>번 반복함. 각각의 반복 전에 최상단 activity는 종료됨
  • -S: activity 실행 전에 대상 앱을 강제로 종료
  • -opengl-trace: OpenGL funcion에 대한 추적기능 활성화
  • -user <USER_ID> | current: 지정한 유저로 실행함, 만약 지정하지 않았다면 현재 유저로 실행
startservice [options] <INTENT>지정한 <INTENT> Service를 실행함. <INTENT> 인자 규격을 참고하자. 

옵션은 다음과 같다:
  • -user <USER_ID> | current: 지정한 유저로 실행함, 만약 지정하지 않았다면 현재 유저로 실행
force-stop <PACKAGE><PACKAGE>(앱의 package 이름)와 관련된 모든 프로세스를 강제로 stop
kill [options] <PACKAGE><PACKAGE>(앱의 package 이름)와 관련된 모든 프로세스를 kill. 이명령은 단지 프로세스만 kill 하므로 안전하고, user experience에 영향을 주지 않는다. 

옵션은 다음과 같다:
  • -user <USER_ID> | all | current: 프로세스를 kill할 유저를 지정
kill-all모든 백그라운드 프로세스들을 kill함
broadcast [options] <INTENT>broadcast intent 를 전송. <INTENT> 인자 규격을 참고하자. 

옵션은 다음과 같다:
  • [-user <USER_ID> | all | current]: 지정한 유저에게 intent를 보냄, 지정하지 않을 경우 모든 유저에게 보냄
instrument [options] <COMPONENT>Instrumentation 객체로 모니터링을 시작함. 일반적으로 타겟 <COMPONENT><TEST_PACKAGE>/<RUNNER_CLASS>의 형태를 띈다. 

옵션은 다음과 같다:
  • -r: 원시결과(raw results)를 프린트(아니면 <REPORT_KEY_STREAMRESULT>를 디코딩) 
    [-e perf true]와 함께 사용하면 성능측정에 대한 원시결과를 생성한다.
  • -e <NAME> <VALUE>: <NAME> 인자에 <VALUE>값을 설정한다. 테스트를 위한 일반적인 형태는 -e <testrunner_flag> <value>[, <value>…]과 같다.
  • -p <FILE>: 프로파일링 데이터를 <FILE>에 저장함
  • -w: 리턴전에 계측이 종료되기를 기다림. 테스터를 위해 필요
  • -no-window-animaion: 실행하는 동안 윈도우 애니메이션을 끔
  • -user <USER_ID> | current: 계측을 사용할 유저를 지정함. 지정하지 않을 경우 현재 유저
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]크래시나 ANR2)에 대한 모니터링을 시작 
옵션은 다음과 같다:
  • -gdb: crash/ANR 이 났을때 주어진 포트로 gdbserv를 시작함
screen-compat [on|off] <PACKAGE><PACKAGE> 화면 호환성 모드를 제어함
display-size [reset|<WxH>]에뮬레이터/단말의 디스플레이 사이즈를 재정의 함. 이 명령은 대화면의 장치에서 작은 해상도를 흉내내거나 반대의 경우를 재현하므로 여러 다른 스크린 사이즈에서 앱을 테스트 하는데 효과적이다. 예를 들면: 
am display-size 1280×800
display-density <dpi>에뮬레이터/단말의 디스플레이 밀도를 재정의 함. 이 명령은 여러 다른 화면 밀도에서 앱을 테스트 하는데 효과적임. 예를 들면: 
am display-density 480
to-uri <INTENT>주어진 intent를 URI로 화면에 보여줌 
<INTENT> 인자 규격을 참고
to-intent-uri <INTENT>주어진 intent를 intent:URI로 화면에 보여줌 
<INTENT> 인자 규격을 참고

<INTENT> 인자 규격

Activity manager에서 사용하는 <INTENT> 인자의 옵션은 다음과 같다:

  • -a <ACTION>: “android.intent.action.VIEW”와 같은 액션을 지정한다. 한번만 선언할 수 있다.
  • -d <DATA_URI>: “content://contacts/people/1”과 같은 데이터 URI를 지정한다. 한번만 선언할 수 있다.
  • -t <MIME_TYPE>: “image/png” 와 같은 MIME 타입을 지정한다. 한번만 선언할 수 있다.
  • -c <CATEGORY>: “android.intent.category.APP_CONTACTS”와 같은 intent 카테고리를 지정한다.
  • -n <COMPONENT>: 명시적 인텐트를 생성하기 위해 “com.example.app/.ExampleActivity”와 같은 패키지 명을 접두사로 한 컴포넌트 명을 지정한다.
  • -f <FLAGS>: setFlags()에서 지원하는 flag를 intent에 추가한다.
  • -esn <EXTRA_KEY>: null extra를 추가한다. 이 옵션은 URI 인텐트에서는 지원하지 않는다.
  • -e|-es <EXTRA_KEY> <EXTRA_STRING_VALUE>: key-value 쌍의 문자열 데이터를 추가한다.
  • -ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE>: key-value 쌍의 boolean 데이터를 추가한다.
  • -ei <EXTRA_KEY> <EXTRA_INT_VALUE>: key-value 쌍의 int 데이터를 추가한다.
  • -el <EXTRA_KEY> <EXTRA_LONG_VALUE>: key-value 쌍의 long 데이터를 추가한다.
  • -ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE>: key-value 쌍의 float 데이터를 추가한다.
  • -eu <EXTRA_KEY> <EXTRA_URI_VALUE>: key-value 쌍의 URI 데이터를 추가한다.
  • –ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE>: ComponentName 객체로 변환되어 전달되는 컴포넌트 명을 추가한다.
  • –eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE…]: integer 배열을 추가한다.
  • –ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE…]: long 배열을 추가한다.
  • –efa <EXTRA_KEY> <EXTRA_FLOAT_VALUE>[,<EXTRA_FLOAT_VALUE…]: float 배열을 추가한다.
  • –grant-read-uri-permission: Include the flag FLAG_GRANT_READ_URI_PERMISSION.
  • –grant-write-uri-permission: Include the flag FLAG_GRANT_WRITE_URI_PERMISSION.
  • –debug-log-resolution: Include the flag FLAG_DEBUG_LOG_RESOLUTION.
  • –exclude-stopped-packages: Include the flag FLAG_EXCLUDE_STOPPED_PACKAGES.
  • –include-stopped-packages: Include the flag FLAG_INCLUDE_STOPPED_PACKAGES.
  • –activity-brought-to-front: Include the flag FLAG_ACTIVITY_BROUGHT_TO_FRONT.
  • –activity-clear-top: Include the flag FLAG_ACTIVITY_CLEAR_TOP.
  • –activity-clear-when-task-reset: Include the flag FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET.
  • –activity-exclude-from-recents: Include the flag FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS.
  • –activity-launched-from-history: Include the flag FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY.
  • –activity-multiple-task: Include the flag FLAG_ACTIVITY_MULTIPLE_TASK.
  • –activity-no-animation: Include the flag FLAG_ACTIVITY_NO_ANIMATION.
  • –activity-no-history: Include the flag FLAG_ACTIVITY_NO_HISTORY.
  • –activity-no-user-action: Include the flag FLAG_ACTIVITY_NO_USER_ACTION.
  • –activity-previous-is-top: Include the flag FLAG_ACTIVITY_PREVIOUS_IS_TOP.
  • –activity-reorder-to-front: Include the flag FLAG_ACTIVITY_REORDER_TO_FRONT.
  • –activity-reset-task-if-needed: Include the flag FLAG_ACTIVITY_RESET_TASK_IF_NEEDED.
  • –activity-single-top: Include the flag FLAG_ACTIVITY_SINGLE_TOP.
  • –activity-clear-task: Include the flag FLAG_ACTIVITY_CLEAR_TASK.
  • –activity-task-on-home: Include the flag FLAG_ACTIVITY_TASK_ON_HOME.
  • –receiver-registered-only: Include the flag FLAG_RECEIVER_REGISTERED_ONLY.
  • –receiver-replace-pending: Include the flag FLAG_RECEIVER_REPLACE_PENDING.
  • –selector: intent 데이터와 타입을 셋팅하기위한 옵션으로 -d -t의 사용이 필요함
  • <URI> <COMPONENT> <PACKAGE>: 위의 옵션 중 하나에 규정되지 않은 경우 직접 URI, 패키지명 및 컴포넌트명을 지정할 수 있다. 인자가 지정되지 않은 경우, 인자에 “:“이 포함될 경우 URI로 가정하며, ”/“가 포함될 경우 컴포넌트명으로 가정하고, 그 외의 경우는 패키지명으로 인식한다.

Package manager (pm) 사용하기

Adb 쉘 내에서 장치에 설치된 응용프로그램 패키지에 대한 작업 및 쿼리를 수행하기 위해 package manager (pm) 도구를 사용하여 명령을 실행할 수 있다. 쉘 내에서의 구문은 다음과 같다:

pm <command>

역시나, 아래와 같이 리모트 쉘에 들어가지 않고 다이렉트로 package manager 명령을 실행할 수도 있다.

adb shell pm uninstall com.example.MyApp

표 3. Package manager 명령어들

명령설명
list packages [options] <FILTER>모든 패키지들을 화면에 표시한다. 옵션으로 <FILTER>에 패키지명의 일부를 적으면 그 내용을 포함하는 패키지리스트만 볼 수 있다. 
옵션:
  • -f: 패키지와 그에 연관된 apk 파일의 위치를 보여줌
  • -d: 비활성화된 패키지만 보여줌
  • -e: 활성화된 패키지만 보여줌
  • -s: 시스템 패키지만 보여줌
  • -3: 서드파티 패키지만 보여줌
  • -i: 각 패키지의 인스톨러를 보여줌3)
  • -u: 언인스톨된 패키지를 포함해서 보여줌4)
  • -user <USER_ID>: 유저별 조회
list permission-groups알려진 모든 퍼미션 그룹 리스트를 보여줌
list permissions [options] <GROUP>알려진 모든 퍼미션을 보여줌. <GROUP>으로 한정지어 검색가능. 
옵션:
  • -g: 그룹별 정렬
  • -f: 퍼미션에 대한 보든 정보를 출력
  • -s: 퍼미션에 대한 간략한 요약을 출력
  • -d: 위험한 퍼미션의 리스트를 출력
  • -u: 사용자가 볼 수 있는 퍼미션의 리스트를 출력
list instrumentation모든 테스트 패키지를 출력 
옵션:
  • -f: 테스트 패키지에 대한 APK파일의 리스트를 출력
  • <TRAGET_PACKAGE>: 패키지명의 일부을 이용하여 검색
list features시스템의 모든 feature를 출력
list libraries현재 단말에서 지원하는 모든 라이브러리의 목록을 출력
list users시스템상의 모든 유저를 출력
path <PACKAGE>주어진 <PACKAGE>의 APK경로를 출력
install [options] <PATH><PATH> 경로의 apk 파일을 단말에 설치 
옵션:
  • -l: forward lock을 걸어 패키지를 인스톨함
  • -r: 존재하는 앱을 재 인스톨. 기존 데이터를 유지함
  • -t: 테스트 APK가 설치되는 것을 허용함
  • -i <INSTALL_PACKAGE_NAME>: 인스톨러 패키지 이름을 지정함
  • -s: sd카드와 같은 대용량 저장장치에 설치함5)
  • -f: 시스템 내부 메모리에 설치
  • -d: 버전 코드 다운그레이드를 허용
uninstall [options] <PACKAGE>시스템으로 부터 패키지를 삭제 
옵션:
  • -k: 패키지 삭제 후에도 data와 cache 디렉토리를 유지함
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>어플리케이션에 권한permission을 부여함. 단. 어플리케이션에 선언된 권한만 부여가능
revoke <PACKAGE_PERMISSION>어플리케이션의 권한을 취소함.
set-install-location <LOCATION>기본 설치 위치를 변경함. Location 값을 다음과 같다:
  • 0: Auto - 시스템이 적절한 location을 판단함
  • 1: Internal - 내부 메모리에 설치
  • 2: External - 외장 메모리에 설치

참고: 이것은 디버깅을 위한 용도이며, 사용시 앱이 비정상동작하거나 종료될 수 있음

get-install-location현재 설치 위치를 리턴. 리턴값은 set-install-location 참고
set-permission-enforced <PERMISSION> [true|false]주어진 퍼미션을 강제로 지정할지 결정
trim-caches <DESIRED_FREE_SPACE>주어진 free space까지 cache를 trim
create-user <USER_NAME><USER_NAME>으로 새유저를 생성하며, 유저 id를 화면에 출력함
remove-serr <USER_ID>주어진 <USER_IDENTIFIRE>를 id로 가지는 유저를 삭제함. 유저와 관련된 모든 데이터도 삭제됨
get-max-users디바이스가 지원하는 최대 유저의 수를 출력

리모트 쉘에서 sqlite3 데이터베이스 테스트하기

Adb 리모트 쉘에서 안드로이드 어플리케이션에 의해 생성된 SQLite 데이터베이스를 관리할 수 있는 커맨드라인sqlite3를 사용할 수 있다. sqlite3 도구는 테이블의 내용을 출력하는 .dump와 기존 테이블의 SQL CREATE 상태를 출력하는 .schema 등의 유용한 많은 명령이 포함되어 있다. 또한, 이도구를 이용하여 즉석에서 SQLite 명령어를 실행할 수도 있다.

sqlite3 툴을 사용하기 위해서는, 위에 서술한대로 에뮬레이터 상의 리모트 쉘에 접속한다음 sqlite3 명령어를 이용하여 도구를 호출한다. 추가적으로 sqlite3를 호출할 때 탐색하기 원하는 데이터베이스의 전체 경로를 지정할 수 있다. 에뮬레이터/단말의 SQLite3 데이터베이스는 /data/data/<package_name>/databases/ 폴더에 저장된다.

예를 보자:

adb -s emulator-5554 shell
# sqlite3 /data/data/com.example.google.rss.rssexample/databases/rssitems.db
SQLite version 3.3.12
Enter ".help" for instructions
.... enter commands, then quit...
sqlite> .exit 

sqlite3가 호출되고나면 쉘내에서 sqlite3 명령을 실행할 수 있다. adb 리모트 쉘로 빠져나오기를 원한다면 exit CTRL+D를 사용한다.

단말 화면 녹화하기

screenrecord 명령어는 안드로이드 4.4 (API level 19) 이상의 단말의 화면을 녹화하는 쉘 유틸리티이다. 유틸리티는 화면의 움직임을 다운받을 수 있는 MPEG-4 파일로 녹화한다. 이 유틸리티는 별도의 레코딩 디바이스를 사용하지 않고, 홍보나 교육용 영상을 만들고자 하는 개발자에게 유용하다.

커맨드라인에서 screenrecord를 사용하려면 다음과 같이 입력한다:

$ adb shell screenrecord /sdcard/demo.mp4

녹화의 중지는 Ctrl-C를 누르거나, 아니면 자동으로 3분후 종료되던지, –time-limit를 설정하여 종료할 수 있다.

다음은 adb 쉘을 이용하여 영상을 녹화한 후 pull명령을 이용하여 단말로 부터 파일을 다운로드 하는 예이다:

$ adb shell
shell@ $ screenrecord --verbose /sdcard/demo.mp4
(Ctrl-C 로 녹화 종료)
shell@ $ exit
$ adb pull /sdcard/demo.mp4

screenrecord 유틸리티는 장치 디스플레이의 종횡비를 유지한 채로 모든 지원하는 해상도와 당신이 원하는 모든 비트레이트를 사용하여 녹화가 가능하다. 기본적으로는 장치의 네이티브 해상도와 화면방향으로 녹화되며 최대 3분동안 녹화가 가능하다.

다음은 사용시 주의해야 할 screenrecord 유틸의 몇가지 알려진 제약사항이다:

  • 일부 단말은 장치의 네이티브 해상도로 녹화가 불가능하다. 만약 화면 녹화시 이상이 발생한다면 해상도를 낮춰서 재시도 해보길 바란다.
  • 녹화중 화면의 회전은 지원하지 않는다. 만약 녹화중 화면을 회전한다면, 녹화된 화면의 일부가 잘릴 수 있다.
  • 오디오는 녹음되지 않는다.

표 4. screenrecord 옵션

옵션설명
–help사용방법을 요약하여 화면에 표시
–size <WIDTHxHEIGHT>1280×720과 같이 비디오 크기를 설정함. 기본값은 (지원가능 하다면)단말의 해상도이거나 1280×720 이다. 최상의 결과를 얻기위해서는 단말의 Advanced Video Coding (AVC) 인코더에서 지원하는 크기를 사용한다.
–bit-rate <RATE>영상의 비트레이트를 초당 메가비트로 설정함. 기본값은 4Mbps 이다. 영상의 퀄리티를 높이기위해 비트레이트를 올리거나 작은 영상파일을 만들기위해 비트레이트를 낮출 수 있다. 다음은 비트레이트를 6Mbps로 설정하는 예이다:
screenrecord --bit-rate 6000000 /sdcard/demo.mp4
–time-limit <TIME>녹화시간을 초로 설정함. 기본 최대값은 180(3분)이다.
–lotate결과물을 90도 회전함. 이 기능은 실험적인 기능이다.
–verbose커맨드라인 스크린상에 로그를 출력한다. 만약 이 옵션을 설정하지 않는다면 유틸리티가 실행되는 동안 어떠한 정보도 화면에 표시되지 않는다.

UI/Application Exerciser Monkey

Monkey는 에뮬레이터나 단말상에서 실행되면서 클릭, 터치 또는 제스처 등의 유저 이벤트의 의사-랜덤pseudo-random스트림 뿐 아니라, 시스템 레벨의 이벤트를 생성하는 프로그램이다. 임의의 반복적인 방법으로 개발 중인 앱의 스트레스 테스트를 하기위해 Monkey를 사용할 수 있다.

Monkey를 사용하는 가장 간단한 방법은 아래의 명령처럼 어플리케이션을 실행하고 500회의 의사-랜덤 이벤트를 앱에게 전송하는 것이다.

adb shell monkey -v -p your.package.name 500

Monkey의 명령 옵션에 대한 더 자세한 정보는 전체 UI Application Exerciser Monkey 설명서 페이지를 참고한다.

기타 쉘 명령들

사용가능한 모든 쉘 프로그램의 목록을 보기위해 다음의 명령을 실행한다.

adb shell ls /system/bin

대부분의 명령은 도움말을 사용할 수 있다.

표 5는 일반적인 adb 쉘 명령어의 일부를 보여준다.

표 5. 일부의 기타 쉘 명령들

쉘 명령어설명코멘트
dumpsys화면에 시스템 데이터를 덤프한다.쉽게 찾아서 쓸 수 있도록 Dalvik Debug Monitor Server(DDMS) 툴은 통합 디버깅 환경을 제공한다.
dumpstate파일에 상태를 덤프한다.
logcat [option]… [filter-spec]…시스템 및 앱 로그를 활성화하고 화면에 결과를 출력함
dmesg커널 디버깅 메세지를 화면에 출력함
start에뮬레이터/단말을 시작(재시작)한다.
stop에뮬레이터/단말의 실행을 중지한다.

logcat 로깅 활성화하기

안드로이드 로깅 시스템은 디버그 결과를 모으고 보여주기 위한 메커니즘을 제공한다. 다양한 어플리케이션과 시스템의 일부로 부터의 로그는 일련의 원형 버퍼circular buffers로 수집되며, 이는 logcat 명령을 통해 필터되고 보여질 수 있다.

시스템의 로그 버퍼의 컨텐츠를 보기 위해 logcat 명령을 사용할 수 있다. 일반적인 사용법은 다음과 같다:

[adb] logcat [option] ... [filter-spec] ...

당신은 개발 컴퓨터에서 또는 에뮬레이터/단말의 리모트 쉘로부터 logcat 명령을 사용할 수 있다. 개발 컴퓨터에서 로그 출력을 보기 위해서는 다음과 같이 사용한다.

adb logcat

그리고, 리모트 adb 쉘에서는 다음과 같이 사용한다.

logcat

Logcat 명령 옵션과 필터 스펙에 대한 완전한 정보는 Log 읽고 쓰기를 참고한다.

adb 서버 종료하기

어떤 경우에는 adb 서버를 종료하고 재실행해야 할 필요가 있을 수 있다. 예를 들어 adb가 명령에 응답이 없을 경우 당신은 서버를 종료하고 재실행해서 문제를 해결할 수 있다.

adb 서버를 종료하기 위해서는 kill-server 명령을 사용한다. 그런 다음 아무런 다른 adb 명령으로 서버를 재시작 할 수 있다.

무선으로 사용하기

adb는 일반적으로 USB를 통해 사용한다. 그러나 다음에 서술한 것처럼 Wi-Fi를 통해서도 사용이 가능하다.

  1. 안드로이드 단말과 adb 호스트 컴퓨터를 양쪽모두 접근가능한 Wi-Fi 네트워크에 접속한다. 모든 엑세스포인트는 적합해야 하며 adb를 지원하기위해 방화벽 설정을 변경해야 할 수도 있다.
  2. 안드로이드 단말을 호스트 컴퓨터에 USB로 연결한다.
  3. adb가 호스트에서 USB모드로 동작하는지 확인한다.
    $ adb usb
    restarting in USB mode
  4. USB를 통해 장치에 연결한다.
    $ adb devices
    List of devices attached
    ######## device
  5. 호스트 adb를 tcpip 모드로 재시작 한다.
    $ adb tcpip 5555
    restarting in TCP mode port: 5555
  6. 안드로이드 단말의 IP 주소를 찾는다: 설정 → 휴대전화 정보 → 상태 → IP 주소. IP 주소는 #.#.#.#의 형태임을 기억해라.
  7. adb 호스트를 단말에 연결한다.
    $ adb connect #.#.#.#
    connected to #.#.#.#:5555
  8. USB 케이블을 단말에서 분리하고, 단말에 접속이 유지되고 있는지 확인한다.
    $ adb devices
    List of devices attached
    #.#.#.#:5555 device

이제 명령이 가능하다!

만약 adb 연결이 유실된다면:

  1. Host가 안드로이드 단말과 동일한 Wi-Fi 네트워크 상에 계속 연결되어 있는지 확인한다.
  2. “adb connect” 단계를 재실행하여 재연결한다.
  3. 그래도 동작하지 않으면 adb 호스트를 재실행한다.
    adb kill-server

    그런다음 처음의 단계부터 다시 진행한다.

1) UDS(Unix Domain Socket)은 내부 프로세스들 끼리 TCP 또는 UDP 프로토콜을 이용하여 통신할 수 있도록 도와주는 소켓이다. 이 소켓을 이용하면 기존의 TCP/IP, UDP/IP에서 사용하던 함수와 같은 방법을 사용하여 프로세스들끼리 통신할 수 있다
2) Application Not Responding
3) 대부분 null이며, play store에서 설치한 경우 com.android.vending으로 나옴
4) 테스트해보니 설명과는 달리 실제로는 삭제된 앱들은 나오지 않는다.
5) 테스트 결과 킷캣에서는 외장메모리에 설치가 되지 않아서 그런지 Failure [INSTALL_FAILED_INSUFFICIENT_STORAGE] 에러가 발생함