티스토리 뷰

반응형

일반 기능

앞선 글에서 실습한 것과 같이,
연결된 장치의 목록을 확인하기 위해서는
adb devices 명령어를 사용한다.

출력목록은 '시리얼 번호, 상태'로 구성된다.
시리얼 번호는 포트 번호를 포함한다.
장치가 ADB 서버와 연결된 경우에는 device 상태로,
그렇지 않은 경우 offline 상태로 출력된다.


nox_adb devices 명령어로 녹스 에뮬레이터 접속을 확인할 수 있다.




아래 글처럼 접속할 수도 있다.

https://tkdrms568.tistory.com/219





디버깅 기능

ADB는 연결된 안드로이드 장치에 대한 디버깅을 위한
몇 가지 명령이 있는데,
예로 logcat, bugreport, jdwp가 있다.
각 명령어를 간단히 실습해본다.



로그캣을 활용한 로그 분석

로그캣은 안드로이드 장치에서 발생하는
로그 메시지를 화면으로 출력하거나 파일 형태로 저장한다.
로그캣 명령어로 메시지들을 확인할 수 있다.
명령어는 adb logcat [옵션][필터스펙] 이다.


1) adb logcat을 명령 프롬프트에서 실행하면,
아래와 같이 메시지들이 출력된다.



2) 또는, adb shell로 장치의 쉘에 접속하여
logcat 명령어를 실행하는 방법도 있다.


1)과 2)는 수행결과가 모두 동일하다.




🏴󠁧󠁢󠁥󠁮󠁧󠁿 로그의 기본 구성

안드로이드에서 발생하는 로그는 우선순위와 태그로 구성된다.



우선순위는 다음과 같다.


  • V - Verbose(일반적)
  • D - Debug
  • I - Info
  • W - Warning
  • E - Error
  • F - Fatal
  • S - Silent(우선순위가 가장 높음)

태그는 시스템 구성 요소를 나타내는 짧은 문자열로,
로그 메시지들을 구분할 수 있다.


◻ 예를 들어, E/ClipboardService: Denying clipboard access to com.android.chrome라는
로그 메시지가 있다면,
E에 해당하는 Error 수준의 ClipboardService 태그를 갖는 항목에서
발생한 메시지를 출력하고 있다는 뜻이다.




🏴󠁧󠁢󠁥󠁮󠁧󠁿 로그캣 옵션

  • -b <buffer>
    안드로이드 로그 시스템은 로그 버퍼의 유형이
    radio, events, main과 같이 다양하다.
    그러므로 -b 옵션을 사용하여 출력 로그 내용을 선택할 수 있다.
    radio는 radio 관련, events는 이벤트 관련, main은 기본값인 메인 로그 버퍼이다.


  • -c
    기록된 로그 메시지를 삭제하고 종료함


  • -d
    로그 메시지를 화면에 덤프하고 종료
    (덤프 : 덤프는 컴퓨터 주기억장치나 레지스터, 데이터, 프로그램의 전체 또는 일부 자료에 기억시킨 내용을 보조기억장치 등 기록 매체에 복사 또는 전이하는 조작을 말합니다. 알기쉽게 풀어 이야기하면 기억장치의 내용을 전부 또는 일부를 인쇄하여 출력하는 것입니다. 출처: https://ohdiki1314.tistory.com/67)


  • -f <filename>
    로그 메시지를 <filename>으로 저장한다.
    "/경로/파일명" 형태로, -d 옵션을 포함하여 사용해야 한다.
    예시로, adb logcat -d -f /경로/파일명과 같이 쓴다.


  • -g
    선택된 버퍼의 크기를 출력하고 종료한다.
    adb logcat -g -b <buffer>(radio | events | main)과 같이 사용한다.


  • -n <count>
    로그 파일을 몇 개 저장할 것인지를 지정한다.
    -r 옵션을 포함하여 용량을 설정하고,
    -f 옵션으로 파일 이름도 설정해야 한다.
    기본값은 4개이다.


  • -r <kbytes>
    기본값은 16이다. 파일의 용량을 설정한다.


  • -s
    기본 필터의 종류를 S(Slient)로 변경하도록 설정한다.
    즉 모든 메시지를 출력하지 않는다.
    다만, adb logcat -s ActivityManager:I와 같이 쓰면,
    ActivityManager 태그가 I 우선순위를 갖는 로그 메시지만 출력한다.


  • -v
    로그 메시지는 메타데이터 필드와 태그, 우선순위를 갖는데,
    이 옵션으로 메타데이터 필드를 선택할 수 있다.
    메타데이터는 brief, process, tag, raw, time, threadtime, long 등이 있다.


  • filtering expressions
    필터링 구문은 tag:priority와 같이 구성되며,
    이 우선순위 이상의 메시지만 출력된다.
    각 구문을 공백으로 구별하여 다중 필터링 적용도 가능하다.
    adb logcat ActivityManager:I art:I *:S와 같이 쓸 수 있다.
    *:S 구문으로 모든 메시지가 출력되지 않도록 했고,
    ActivityManagerart 태그를 갖고 I(Info) 우선순위를 갖는 메시지만 출력한다.
    출력 결과는 아래와 같다.




로그캣을 이용해
안드로이드에서 발생하는 로그 메시지 중
원하는 항목을 출력할 수 있었다.





bugreport로 버그 보고서 확인

bugreport 명령으로 dumpsys, dumpstate, logcat 명령의 결과를
한꺼번에 출력할 수 있다.



🏁 필요한 정보만 출력

  • Dumpsys
    연결된 안드로이드 장치의 애플리케이션 및 장치 정보를 자세히 표시함
    meminfo, cpuinfo, account, activity, window, wifi, power 등을
    하위 명령으로 사용할 수 있음
    adb shell dumpsys meminfo와 같이 사용 가능함
    위 명령어는 장치의 메모리 사용 정보를 표시함


  • Dumpstate
    현재 연결된 안드로이드 장치의
    모든 상태정보(state)를 출력함
    adb shell dumpstate와 같이 사용함


  • logcat
    안드로이드 시스템에서 발생하는 로그 정보를 표시




🏁 한꺼번에 출력

adb bugreport 명령어로 위의 내용을
한꺼번에 출력할 수 있다.
bugreport 자체가 그런 기능이다.


명령어를 실행하면 C:\Android-InsecureBankv2-master\AndroLabServer 디렉터리에
zip 파일로 bugreport 파일이 새로 생성되며,
해당 bugreport 텍스트 파일을 확인하면
아래와 같이 로그가 기록되어 있다.





bugreport 명령으로
연결된 안드로이드 장치에 대한 정보를
한 번에 출력할 수 있다.
하지만 정보가 많으므로 별도로 저장하여 확인하는 것이 권장된다.





Jdwp를 이용한 프로세스 정보 확인

Jdwp는 Java Debug Wire Protocol의 약자로,
자바 애플리케이션 디버깅에 이용된다.
디버거와 디버그를 하고자 하는 JVM 간의 프로토콜이다.


이 명령은 연결된 안드로이드 장치에서
사용할 수 있는 jdwp 프로세스의 목록을 출력한다.


jdwp 명령으로 특정 애플리케이션의 프로세스 번호를 알아낸 다음,
이것을 디버거에 연결하면 디버그가 가능하다.





데이터 기능

install/uninstall, pull, push ADB 명령어
연결된 안드로이드 장치에서
파일이나 애플리케이션을 제어할 수 있다.


Install 명령어

연결된 안드로이드 장치에
사용자가 원하는 애플리케이션을 설치할 수 있다.


🏴󠁧󠁢󠁥󠁮󠁧󠁿 애플리케이션 설치

adb install c:\android\InsecureBankv2.apk 명령어로
인시큐어뱅크 앱을 녹스에 설치한 것과 같은 경우이다.


⛔ 만약 동일한 앱이 설치된 경우
Failure [INSTALL_FAILED_ALREADY_EXISTS] 메시지가 출력된다.



🏴󠁧󠁢󠁥󠁮󠁧󠁿 같은 애플리케이션이 이미 설치된 경우

adb install -r c:\android\InsecureBankv2.apk처럼,
-r 옵션을 추가하여
이미 설치된 경우라도 애플리케이션을 재설치하게 할 수 있다.
성공적으로 설치되면, Success 메시지가 출력된다.




Uninstall 명령어

애플리케이션을 삭제할 때는
apk 파일명만 입력하면 되었는데,
uninstall 명령어로 삭제할 때는
대상 애플리케이션의 패키지명을 입력해야 한다.


🏁 패키지명 확인

adb uninstall <패키지명> 명령어를 수행해야 하며,
패키지명 확인은 아래와 같이
ADB 명령의 PM(패키지 매니저)로 확인할 수 있다.
adb shell pm list packages -f를 수행한다.


인시큐어뱅크 앱의 패키지명을 찾기 위해
먼저 adb shell로 연결된 안드로이드 장치의 쉘로 접속했고,
pm list packages -f | grep insecurebankv2 명령어로
insecurebankv2가 포함된 패키지명을 검색했다.




🏁 애플리케이션 삭제

위 그림에서 base.apk= 뒤에 있는
com.android.insecurebankv2를 패키지명으로 하여 삭제 명령을 한다.
adb uninstall com.android.insecurebankv2를 실행한다.
-k 옵션을 추가하면 데이터 삭제를 제외하고 애플리케이션 삭제만 진행할 수 있다.




pull/push 명령어

pull 명령은 연결된 장치에 저장된 파일을
PC로 복사하는 기능을 수행하며,
adb pull [장치 경로/파일] [저장 위치] 형태로 사용한다.


예를 들어,
adb pull /sdcard/testfile.txt c:\android\testfile.txt 명령은
sdcard 디렉터리에 위치한 testfile.txt 파일을
사용자 PC의 andriod 디렉터리에 testfile.txt 파일로 저장하도록 한다는 뜻이다.


push 명령어는 pull 명령어와 반대로,
adb push [파일 위치] [저장 위치/파일명] 형태로 쓴다.





포트와 네트워킹 기능

Forward 명령어

특정 로컬 포트를 안드로이드 장치의 특정 포트와
소켓 통신이 가능하도록 포워딩 하는 명령어이다.
adb forward [로컬-tcp:7777] [원격지-tcp:8888]처럼 사용한다.


❗ 장치에서 USB 디버깅 옵션이 활성화 되어야 한다.
tcp 프로토콜 외에도 local, dev, jdwp 항목을 사용 가능하다.


adb jdwp 명령으로 대상 애플리케이션의 PID를 알아내고,
그것을 대상으로 jdb를 활용하여 디버깅이 가능한 상태로 만들 수 있다.





스크립팅 기능

get-serialno, get-state, wait-for-device 명령으로
스크립트에 연결된 장치 시리얼 번호, 기기 정보 등의
특정한 정보를 출력할 수 있다.


get-serialno 명령어

연결된 장치의 시리얼 번호를 문자열로 출력한다.
adb devices 명령어를 수행했을 때
출력되는 장치의 이름과 같다.


get-state 명령어

연결된 장치의 상태를 문자열로 출력한다.
안드로이드 에뮬레이터나 기기가 연결된 상태여야 한다.
마찬가지로 adb devices 명령어를 수행했을 때
device 또는 offline로 출력되는 것과 같다.


wait-for-device 명령어

연결 장치가 구동될 때까지 ADB 명령 실행을 멈춰두었다가,
장치가 device 상태가 되면 명령어를 실행하는 것이다.
adb wait-for-device shell getprop과 같이 사용한다.





서버 기능

ADB 서버의 상태를 확인하고
ADB와의 통신에 문제가 있을 시 서버를 재시작하는 등의 역할을 한다.
start-server, kill-server 명령이 있다.


  • start-server
    ADB 서버 프로세스가 동작하는지 확인 후 결과를 표시한다.
    동작하지 않는 상태라면 서버를 구동시킨다.


  • kill-server
    ADB 서버에 문제가 발생하거나 상태가 좋지 않다면
    서버를 종료시킨다.
    ADB 명령이 입력되면 서버를 다시 시작한다.




쉘 기능

안드로이드 에뮬레이터나 장치에서
원격 쉘을 사용할 수 있도록 한다.
리눅스와 비슷한 환경에서 대상 장치를 제어할 수 있어,
리눅스의 기본 명령어와 함께 쉘 환경에서 사용할 수 있는 명령이 존재한다.


adb shell과 adb shell <명령어>의 차이

adb shell 명령은 결과출력 이후에도 동일 쉘을 이용할 수 있지만,
adb shell <명령어> 명령은 명령을 수행하고 나면 ADB 명령을 수행했던
운영체제의 프롬프트 상태로 되돌아오게 된다.
즉, 쓰던 쉘을 쓸 것인지, 본래 운영체제의 쉘로 복귀할 것인지에 따라 사용하면 된다.





참고자료




반응형
댓글
반응형
Recent Post.
Recent Reply.
Thanks for comming.
오늘은
명이 방문했어요
어제는
명이 방문했어요