안드로이드의 유용한 shell 커맨드

앱 메모리 정보 확인하기

안드로이드는 리눅스 기반 O/S로 쉘을 사용할 수 있다. 가장 기본은

adb shell

인데, 위의 명령어만 치면 shell로 진입한다. 그 후 안드로이드에서 지원하는 명령창 툴들을 사용할 수 있다. 하지만, shell로 진입하는게 부담스럽다면

adb shell dumpsys

와 같이 shell 다음에 바로 툴을 입력할 수도 있다. 위 명령어는 너무 많은 데이터를 한번 쳐보면 알겠지만, 너무 많은 데이터가 보인다. 그래서 어떤 서비스의 정보만 보고 싶은지 ‘meminfo’와 같이 추가적으로 서비스 이름을 바로 입력할 수 있다.

adb shell dumpsys meminfo

meminfo는 짧을 것 같지만 여전히 길다. 메모리의 모든 정보를 알고 싶은 경우는 별로 없다. 전체 메모리 사용 자료 중에서 원하는 앱만 찾기가 쉽지 않은데, Linux의 grep과 같이 동작하는  윈도우의 커맨드 중 find 같은 것을 사용하면 유용하다.

adb shell dumpsys meminfo | find "com.google.android"

예를 들어 위와같은 명령어를 입력하면, 아래와 같이 메모리 정보중에서 com.google.android라는 문자열을 가진 열만 데이터가 출력된다.

C:\Java\android-sdk\platform-tools>adb shell dumpsys meminfo | find "com.google.android"
    15078 kB: com.google.android.apps.plus (pid 15239)
    13311 kB: com.google.android.gms (pid 15272)
    11854 kB: com.google.android.googlequicksearchbox:search (pid 18999)
     9254 kB: com.google.android.music:main (pid 19964)
     9038 kB: com.google.android.talk (pid 18976)
     5213 kB: com.google.android.gsf.login (pid 19246)
     3542 kB: com.google.android.partnersetup (pid 19047)
               15078 kB: com.google.android.apps.plus (pid 15239)
               13311 kB: com.google.android.gms (pid 15272)
               11854 kB: com.google.android.googlequicksearchbox:search (pid 18999)
                9254 kB: com.google.android.music:main (pid 19964)
                9038 kB: com.google.android.talk (pid 18976)
                5213 kB: com.google.android.gsf.login (pid 19246)
                3542 kB: com.google.android.partnersetup (pid 19047)

혹은 아래와 같이 바로 프로세스 번호나 패키지 이름을 쳐도 된다.

adb shell dumpsys meminfo [프로세스 번호|패키지 이름]

Application manager에서 versionCode나 versionName을 확인할 수 있다. 만약 adb 명령어를 이용해 커맨드로 하고 싶다면 아래와 같이 할 수 있다.

adb shell dumpsys package [package name] | find [versionCode|versionName]

위와 같이 입력하면 패키지 정보 중에서 versionCode나 versionName이 표시되는 부분만 결과로 표시된다.

 설치된 어플리케이션 목록 보기

어플리케이션에 설치된 앱의 정보를 AndroidManifest.xml 안의 package name 기준으로 보고 싶다면 아래 명령어가 유용하다.

adb shell pm list packages

위 명령어는 전체 목록이 나오는데 한 어플리케이션이 설치되었는지 확인하고 싶다면 뒤에 패키지 정보를 붙이면 된다.

adb shell pm list packages [패키지 이름]

예를 들면,

com.samsung.android.emailsync

와 같다.

설치된 어플리케이션 강제 종료

강제종료는 Settings > Application manager 메뉴를 통해 할 수 있다. 만약 adb 명령어를 이용해 커맨드로 하고 싶다면 아래와 같이 할 수 있다.

adb shell am force-stop  [package name]

참고로, 안드로이드 스투디오나 DDMS 등에서는 앱을 죽이는 버튼(보통, 빨간색에 X 자 마크)도 제공한다.

설치된 어플리케이션 데이터 삭제/캐시 삭제

데이터 삭제/캐시 삭제는 Application manager에서 한다. 만약 adb 명령어를 이용해 커맨드로 하고 싶다면 아래와 같이 할 수 있다.

adb shell pm clear [package name]

참고로,  Application Manager에서 패키지 명에 해당하는 앱의 상세정보 창을 보는 상태에서 위 명령을 시도해보면, “success”라는 결과가 나와도 창의 정보는 업데이트 되지 않는다. 그래도 삭제는 제대로 된 것이니 신경쓰지말자. 잘 지워졌는지 추가적으로 확인하고 싶다면, 다른창으로 이동했다가 다시 오면 지워져있다.

Preference 보기

Preference는 데이터를 XML 형식으로 파일에 저장해두는 것이다. 그러므로, Preference 파일의 위치만 안다면 리눅스의 cat과 같이 파일을 읽는 명령어를 통해 파일의 내용을 들여다 볼 수 있다.

adb shell cat /data/data/[package name]/shared_prefs/[preference name].xml

예를 들면 아래와 같이 쓸 수 있겠다.

adb shell cat /data/data/me.sunphiz.android.test/shared_prefs/my_preference.xml

Intent가 바르게 전달되었는지 확인하기

다른 앱 간 intent를 통한  전달이 잘 되었는지 확인해야할 때가 있다. (아무래도 네탓 내탓 공방을 할때..) 이 때, 아래의 명령어를 사용하면 컴포넌트가 어떤 Intent를 받을 때 어떤 데이터를 받았는지 확인해 볼 수 있다.

adb shell dumpsys activity activities

위 명령어를 실행하면, 현재 단말의 테스크가 나오고 상세 정보에 받은 Intent 정보가 들어 있다. 예를 들면,

ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)
Display #0 (activities from top to bottom):
  Stack #0:
    Task id #92
    * TaskRecord{1392a53e #92 A=com.sec.android.app.launcher U=0 sz=1}
      userId=0 effectiveUid=u0a2 mCallingUid=0 mCallingPackage=null
      affinity=com.sec.android.app.launcher
      intent={act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10800000 cmp=com.sec.android.app.launcher/com.android.launcher2.Launcher}
      realActivity=com.sec.android.app.launcher/com.android.launcher2.Launcher
      autoRemoveRecents=false isPersistable=false numFullscreen=1 taskType=1 mTaskToReturnTo=0
      rootWasReset=false mNeverRelinquishIdentity=true mReuseTask=false
      Activities=[ActivityRecord{d2a87de u0 com.sec.android.app.launcher/com.android.launcher2.Launcher t92}]
      askedCompatMode=false inRecents=true isAvailable=true
      lastThumbnail=null lastThumbnailFile=/data/system/recent_images/92_task_thumbnail.png
      hasBeenVisible=true firstActiveTime=1433815768381 lastActiveTime=1433815768381 (inactive for 3s)
      * Hist #0: ActivityRecord{d2a87de u0 com.sec.android.app.launcher/com.android.launcher2.Launcher t92}
          packageName=com.sec.android.app.launcher processName=com.sec.android.app.launcher
          launchedFromUid=0 launchedFromPackage=null userId=0
          app=ProcessRecord{356c1b02 1500:com.sec.android.app.launcher/u0a2}
          Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10800000 cmp=com.sec.android.app.launcher/com.android.launcher2.Launcher }
          frontOfTask=true task=TaskRecord{1392a53e #92 A=com.sec.android.app.launcher U=0 sz=1}
          taskAffinity=com.sec.android.app.launcher
          realActivity=com.sec.android.app.launcher/com.android.launcher2.Launcher
          baseDir=/system/priv-app/TWLauncherESS/TWLauncherESS.apk
          dataDir=/data/user/0/com.sec.android.app.launcher
          stateNotNeeded=true componentSpecified=false mActivityType=1
          compat={320dpi} labelRes=0x7f0d002e icon=0x7f02006e theme=0x7f0e001f
          config={0 1.0 themeSeq=0 ?mcc?mnc ko_KR ?layoutDir sw360dp w360dp h616dp 320dpi nrml long port finger -keyb/v/h -nav/h s.5}
          taskDescription: iconFilename=null label="null" color=ff00a5c4
          launchFailed=false launchCount=0 lastLaunchTime=-1m3s494ms
          haveState=false icicle=null
          state=RESUMED stopped=false delayedResume=false finishing=false
          keysPaused=false inHistory=true visible=true sleeping=false idle=true
          fullscreen=true noDisplay=false immersive=false launchMode=2
          frozenBeforeDestroy=false forceNewConfig=false
          mActivityType=HOME_ACTIVITY_TYPE
          waitingVisible=false nowVisible=true lastVisibleTime=-1m1s817ms

처럼 Intent의 act(액션), cat(카테고리), flg(플래그), cmp(컴포넌트)를 볼 수 있고, 여기에는 없지만, dat(데이터)를 통해 전달된 데이터도 확인할 수 있다. 다만, extra는 확인할 수 없으니 주의하자.

와이파이 켜고 끄기

svc 명령어를 이용하면 와이파이(WiFi)를 켜거나 끌 수 있다.

>adb shell svc wifi enable
>adb shell svc wifi disable

 

참고

“안드로이드의 유용한 shell 커맨드”에 대한 4개의 생각

  1. 핑백: 인텔리 제이에서 시스템 정보 확인하기(adb shell dumpsys) | Dog발자

  2. 핑백: adb shell로 대량의 apk 설치하기 – Dog발자

  3. 핑백: OOM(Out of Memory) – Dog발자

  4. 핑백: 안드로이드의 메모리 릭(Memory leak) – Dog발자

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.