android 의 dumpsys를 이용한 분석 방법
Posted on 07/10/2018 in tech
얼마 전에 과일님이 쌩고생하며 디버깅했던 경험을 공유해주었는데, 약간 더 곁들여서 끄적여봅니다.
dumpsys
dumpsys 명령어는 IBinder의 dump 메소드의 결과를 표준 출력으로 출력해주는 유용한 개발도구입니다. adb만 사용 가능한 상태면 손쉽게 기기의 상태를 확인해볼 수 있고, PC가 없더라도 개발자 옵션에 포함되어 있는 버그 신고 기능을 이용해서 출력을 뽑아낼 수 있습니다. 그런데 아무 IBinder 객체에게 사용할 수 있는 것은 아니고, system service manager에 등록된 항목에 한해서 가능합니다. system service manager에 등록된 IBinder객체는 다음의 명령을 이용해 확인가능합니다.
## android 4.3 이전
$ adb shell service list
## android 4.4 이후
$ adb shell dumpsys -l
출력물은 각 시스템 서비스의 dump 메소드의 구현을 확인하면 정확하게 어떤 값을 출력하는 지 알 수 있습니다. 예를 들면 다음과 같습니다.
dumpsys activity service
그리고 앱에서 작성하는 Service 클래스에도 시스템 서비스와 유사하게 dump 메소드 인터페이스가 제공됩니다. 위에 이야기했듯이 dumpsys는 system service manager에 등록된 IBinder 객체에만 접근할 수 있기 때문에, 앱에서 작성한 서비스에서 정보를 얻기 위해서는 ActivityManagerService를 경유해야 합니다.
Android에서 ActivityManagerService는 앱에 포함된 activity, service, broadcast receiver, provider등을 관리해주며, 각 컴포넌트의 상태를 확인할 수 있는데요. dumpsys 명령을 이용하면 정말 상세하게 알 수 있습니다.
$ adb shell dumpsys activity -h
Activity manager dump options:
[-a] [-c] [-p PACKAGE] [-h] [WHAT] ...
WHAT may be one of:
a[ctivities]: activity stack state
r[recents]: recent activities state
b[roadcasts] [PACKAGE_NAME] [history [-s]]: broadcast state
broadcast-stats [PACKAGE_NAME]: aggregated broadcast statistics
i[ntents] [PACKAGE_NAME]: pending intent state
p[rocesses] [PACKAGE_NAME]: process state
o[om]: out of memory management
perm[issions]: URI permission grant state
prov[iders] [COMP_SPEC ...]: content provider state
provider [COMP_SPEC]: provider client-side state
s[ervices] [COMP_SPEC ...]: service state
as[sociations]: tracked app associations
settings: currently applied config settings
service [COMP_SPEC]: service client-side state
package [PACKAGE_NAME]: all state related to given package
all: dump all activities
top: dump the top activity
WHAT may also be a COMP_SPEC to dump activities.
COMP_SPEC may be a component name (com.foo/.myApp),
a partial substring in a component name, a
hex object identifier.
-a: include all available server state.
-c: include client state.
-p: limit output to given package.
--checkin: output checkin format, resetting data.
--C: output checkin format, not resetting data.
--proto: output dump in protocol buffer format.
여기서 특정 앱의 service에 포함된 dump 메소드(SystemUI 또는 TelephonyService)의 출력 결과를 알고 싶다면 다음과 같이 명령을 실행하면 됩니다.
$ adb shell dumpsys activity service com.android.systemui/.SystemUIService
$ adb shell dumpsys activity service com.android.phone/.TelephonyDebugService
만약에 여러분이 작성한 앱의 서비스에서 다양한 디버깅 정보를 출력하고 싶다면, dump메소드를 채우면 됩니다.
dumpsys activity broadcasts
intent broadcast 타이밍 때문에 고통받는 개발자들도 dumpsys를 이용하면 큰 도움이 됩니다.
다음의 명령을 이용하면 intent broadcast가 발생했던 시간, intent 내용 및 처리 시간과 receiver 등을 쉽게 확인해볼 수 있습니다.
$ adb shell dumpsys activity broadcasts history