'Technical Note'에 해당되는 글 134건
- 2015.01.02 Maven에 Main Class 실행
- 2015.01.02 안드로이드 시스템 분석에 사용할만한 shell 명령을 알아보자.
- 2015.01.02 안드로이드 시스템 메모리 사용 현황
- 2015.01.02 모바일 성능 테스트
- 2015.01.02 wireless usage
안드로이드 시스템 분석에 사용할만한 shell 명령을 알아보자.
시스템 기본 정보: 하드웨어, 커널 등
cat /proc/version : 커널 버전
cat /proc/cpuinfo : 프로세서 정보. CPU 타입, 모델, 제조사 등
cat /proc/meminfo : 메모리 정보. 실제 메모리 및 가상 메모리
cat /proc/devices : 현재 커널에 설정되어 있는 장치 목록
mount : 마운트된 모든 장치 정보
df : 하드디스크 사용량
cat /proc/filesystems : 커널에 설정되어 있는 파일시스템 목록
cat /proc/swaps : 스왑 파티션의 크기와 사용량
cat /proc/interrupts : 장치가 사용중인 인터럽트(IRQ) 목록 표시
cat /proc/ioports : 현재 사용중인 Input/Output 포트
cat /proc/loadavg : 시스템의 평균부하량
cat /proc/partitions : 파티션 정보
cat /proc/uptime : 시스템이 얼마나 살아있었는지.
cat /proc/stat : 시스템 상태에 관한 다양한 정보. CPU 사용통계, 부팅이후 page fault 발생횟수 등
cat /proc/zoneinfo : ZONEINFO ?
dmesg : 시스템 부팅시 나왔던 메시지
ps : 실행중인 프로세스 정보
ps -p -t : 프로세스와 쓰레드 목록
set 또는 printenv : 환경설정값 출력
시스템 리소스 사용 현황
vmstat : 시스템의 리소스 상황 모니터링. CPU, I/O, 메모리 등
cat /proc/diskstats : 디스크 utilization과 throuthput. 즉 디스크 IO 현황
top : 시스템의 프로세스 상황 모니터링. 프로세스별 CPU 사용량, 메모리와 스왑 사용량 등
procrank : 프로세스별 메모리(VSS,RSS,USS, PSS)
dumpsys meminfo [PID] : 해당 프로세스의 메모리 상세 정보
cat /proc/[PID]/stat : 해당 프로세스에 대한 정보. 시작시간, 상태, CPU 사용량 등
cat /proc/[PID]/maps : 해당 프로세스의 메모리 맵 정보
cat /proc/vmstat : 버추얼 메모리 통계?
librank : 라이브러리별 메모리 사용량?
네트워크 관련
cat /proc/net/netlink : 네트워크 정보
netcfg : 네트워크 인터페이스와 IP주소 목록
netstat : 네트워크 연결상태 확인
nc : 네트워크용 cat 명령어(netcat)
ifconfig : 네트워크 인터페이스 설정 정보. 장치명을 파라미터로 받음. IP 주소, 서브넷마스크 등
tcpdump : 실시간 패킷 모니터링
iftop : 네트워크를 위한 top
route : 해당 호스트까지 연결하는 중간 경로 정보인 라우팅 테이블 표시
ping : 원격 호스트와의 연결 테스트
cat /proc/net/route : Routes
안드로이드 제공
logcat : 로그캣 보기
pm : package manager의 약자. 패키지/permission/instrumentation/feature 목록, 패키지 설치/제거 등
am : activity manager의 약자. 액티비티 시작, Intent 브로드캐스팅, Instrumentation 시작, profiling 시작/중지 등
service : 안드로이드 서비스 목록 표시, 서비스에 명령 전달
monkey : 애플리케이션에 랜덤 이벤트 발생시킴. 사용자 이벤트, 시스템 이벤트의 무작위 발행
cat /data/anr/traces.txt : VM TRACES (쓰레드 덤프)
cat /proc/binder/proc/[PID] : 바인더 프로세스 상태
cat /proc/binder/xxx : 바인더 관련 정보(xxx는 transactions, transaction_log, failed_transaction_log, stats 등)
cat /data/system/packages.xml : 설치된 패키지 세팅 정보
setprop : system property 세팅
getprop : 세팅된 system property 목록 출력
종합 리포트
dumpsys [service]: app/service 상태정보 덤프. 서비스별로 추가 파라미터 받을 수 있음
dumpstate : device 상태정보 덤프(cpu,mem,ps 등). 상태정보를 추출하는 여러 명령어들의 조합으로 구성
dumpcrash : 애플리케이션이 crash될 때의 상태정보 덤프?
bugreport : logcat+dumpsys+dumpstate
그밖에...
그밖의 안드로이드 shell 명령어는 /system/bin 및 /system/xbin을 뒤져보면 많이 나온다. 이제 남은 일은 찾아낸 명령어의 사용법, 출력결과를 어떻게 해석할지, 어떤 상황에서 이들을 활용할지 사례조사, 그리고 직접 활용해보는 것일게다.
* 참조
http://www.cyworld.com/polox94ii/312644
http://tkhwang.pe.kr/archives/65
http://en.androidwiki.com/wiki/ADB_Shell_Command_Reference
http://elinux.org/Using_Bootchart_on_Android
http://elenoa.tistory.com/52
게시일: 2014. 1. 27.
How to View Device Specification android With Adb Command
"ADB COMMAND"
@echo off
echo Waiting for device
adb wait-for-device
echo Manufacturer
adb shell getprop ro.product.manufacturer
echo Name adb shell getprop ro.product.name
echo Model adb shell getprop ro.product.model
echo Android version
adb shell getprop ro.build.version.release
echo Platform
adb shell getprop ro.board.platform
echo CPU
adb shell getprop ro.product.cpu.abi
echo cpu abi2
adb shell getprop.ro.product.cpu.abi2
echo Description
adb shell getprop ro.build.description
echo Fingerprint
adb shell getprop ro.build.fingerprint
echo Flexversion
adb shell getprop ro.gsm.flexversion
echo locale language
adb shell getporp ro.product.locale.language
echo locale region
adb shell getprop ro.product.locale.region
echo wifi.channels
adb shell getprop ro.wifi.channels
echo board platform
adb shell getprop.ro.board.platform
echo board
adb shell getprop ro.product.board
echo display id echo serial number
adb get-serialno
echo imei
abb shell getprop gsm.baseband.imei
adb shell getprop ro.build.display.id
ceho version incremental
adb shell getprop ro.build.version.incremental
echo version sdk
adb shell getprop ro.build.version.sdk
echo version codename
adb shell getprop ro.build.version.codename
echo version release
adb shell getprop ro.build.version.release
echo date
adb shell getprop ro.build.date
echo type
adb shell getprop ro.build.type
echo user
adb shell getprop ro.build.user
adb kill-server
pause
More Stuf About Android : http://www.adbcommand.com/
안드로이드에서 프로세스가 도대체 얼만큼의 메모리를 사용하고 있는지 분석해본다.
시스템 메모리 사용 현황
우선 전체 시스템의 메모리부터 파악하자. $> adb shell 로 접속한 후 /proc/meminfo를 열어본다.
MemTotal: 94172 kB
MemFree: 2136 kB
Buffers: 12 kB
Cached: 46380 kB
SwapCached: 0 kB
Active: 36868 kB
Inactive: 46140 kB
Active(anon): 18548 kB
Inactive(anon): 19584 kB
Active(file): 18320 kB
Inactive(file): 26556 kB
Unevictable: 264 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 36892 kB
Mapped: 29344 kB
Slab: 2952 kB
SReclaimable: 740 kB
SUnreclaim: 2212 kB
PageTables: 3176 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 47084 kB
Committed_AS: 914824 kB
VmallocTotal: 876544 kB
VmallocUsed: 11376 kB
VmallocChunk: 863236 kB
MemTotal, MemFree 같은 필드는 대충 감이 잡히는데, 모르는 항목이 많이 보인다. 넘어가자. -.-;;
VSS와 RSS
이론적으로(?) 프로세스가 차지하는 정확한 메모리의 크기를 알 수는 없다고 한다. 다만, 프로세스에 매핑되는 page 수를 해석하는 다양한 방법이 있는데, VSS, RSS, USS, PSS 등이 그것이다.
- VSS(Virtual Set Size) : 프로세스와 관련된 버추얼 메모리(virtual memory) 크기. 메모리 맵(나도 자세한 건 모른다)이 1M이면 프로세스가 어떤 리소스도 사용하지 않아도 VSS는 1MB가 된다. 의미있는 수치라고 볼 수 없음.
- RSS(Resident Set Size) : 프로세스와 관련된 물리적 페이지(physical pages) 수. 여러 프로세스 사이에서 공유된 페이지(shared pages) 수를 확인할 수 없어 별 의미없음. A프로세스의 RSS가 2MB, B프로세스의 RSS가 2MB일 때 실제 물리 페이지 수는 4MB이거나 2MB일 수 있다.
어쨌거나 프로세스별 VSS와 RSS 값은 top 명령어로 구할 수 있다.
User 1%, System 6%, IOW 0%, IRQ 0%
User 6 + Nice 0 + Sys 20 + Idle 293 + IOW 0 + IRQ 0 + SIRQ 0 = 319
PID CPU% S #THR VSS RSS PCY UID Name
205 4% R 1 888K 368K fg root top
54 1% S 40 149592K 31644K fg system system_server
99 0% S 17 117416K 22028K fg radio com.android.phone
4 0% S 1 0K 0K fg root events/0
5 0% S 1 0K 0K fg root khelper
6 0% S 1 0K 0K fg root suspend
7 0% S 1 0K 0K fg root kblockd/0
8 0% S 1 0K 0K fg root cqueue
9 0% S 1 0K 0K fg root kseriod
10 0% S 1 0K 0K fg root kmmcd
11 0% S 1 0K 0K fg root pdflush
12 0% S 1 0K 0K fg root pdflush
1 0% S 1 296K 204K fg root /init
14 0% S 1 0K 0K fg root aio/0
21 0% S 1 0K 0K fg root mtdblockd
22 0% S 1 0K 0K fg root hid_compat
23 0% S 1 0K 0K fg root rpciod/0
24 0% S 1 0K 0K fg root mmcqd
25 0% S 1 728K 308K fg root /system/bin/sh
26 0% S 1 796K 260K fg system /system/bin/servicemanager
27 0% S 1 832K 384K fg root /system/bin/vold
28 0% S 1 656K 248K fg root /system/bin/debuggerd
29 0% S 4 5420K 728K fg radio /system/bin/rild
30 0% S 1 81428K 25528K fg root zygote
31 0% S 6 20944K 3332K fg media /system/bin/mediaserver
32 0% S 1 784K 284K fg root /system/bin/installd
33 0% S 1 1616K 404K fg keystore /system/bin/keystore
34 0% S 1 728K 324K fg root /system/bin/sh
35 0% S 1 824K 336K fg root /system/bin/qemud
37 0% S 4 3372K 184K fg root /sbin/adbd
46 0% S 1 780K 308K fg root /system/bin/qemu-props
94 0% S 6 109168K 18604K bg system com.android.settings
97 0% S 7 107548K 18784K fg app_4 com.android.inputmethod.latin
102 0% S 12 133720K 28496K fg app_4 android.process.acore
132 0% S 6 102392K 18260K bg app_6 com.android.alarmclock
144 0% S 7 103136K 18908K bg app_1 android.process.media
165 0% S 6 114060K 19036K bg app_12 com.android.mms
183 0% S 7 105492K 19592K bg app_21 com.android.email
197 0% S 1 728K 324K fg root /system/bin/sh
13 0% S 1 0K 0K fg root kswapd0
2 0% S 1 0K 0K fg root kthreadd
3 0% S 1 0K 0K fg root ksoftirqd/0
USS와 PSS
VSS나 RSS보다 조금 더 의미있는 수치는 USS와 PSS인데, procrank 명령어로 구할 수 있다.
- USS(Unique Set Size) : 프로세스만의 고유한 페이지 수. 공유되지 않는 프로세스에 private한 메모리 크기이다.
- PSS(Proportional Set Size) : USS + (공유 페이지 / 공유하는 프로세스 수). 즉, 프로세스 고유 메모리 사용량 + 하나의 프로세스가 차지하는 공유 메모리 비율이다. 만약 A프로세스가 6MB 메모리를 사용하고 그 중 2MB가 그 프로세스의 고유 영역이라면, 나머지 4MB는 공유 메모리이다. 4MB의 공유메모리를 4개의 프로세스가 공유하고 있다면 PSS는 2MB + (4MB/4) = 3MB가 된다.
PSS는 공유되는 페이지를 공유 프로세스의 수로 나누어서 좀더 정확한 메모리 사용량을 파악할 수 있게 해준다. 이게 프로세스가 사용하는 실제 메모리 크기에 가장 근접한 값이라고 볼 수 있다.
PID Vss Rss Pss Uss cmdline
54 32244K 31644K 14353K 10860K system_server
102 28496K 28496K 10835K 7164K android.process.acore
30 25528K 25528K 8585K 5636K zygote
99 22028K 22028K 6146K 3604K com.android.phone
183 19592K 19592K 4461K 2480K com.android.email
165 19036K 19036K 4122K 2136K com.android.mms
144 18908K 18908K 3953K 2148K android.process.media
94 18604K 18604K 3868K 1780K com.android.settings
97 18784K 18784K 3734K 1712K com.android.inputmethod.latin
132 18260K 18260K 3352K 1508K com.android.alarmclock
31 3332K 3332K 1002K 628K /system/bin/mediaserver
203 456K 456K 269K 260K procrank
29 728K 728K 258K 220K /system/bin/rild
1 204K 204K 185K 184K /init
37 184K 184K 169K 168K /sbin/adbd
27 384K 384K 156K 144K /system/bin/vold
35 336K 336K 134K 124K /system/bin/qemud
33 404K 404K 107K 88K /system/bin/keystore
34 324K 324K 102K 68K /system/bin/sh
197 324K 324K 102K 68K /system/bin/sh
25 308K 308K 96K 68K /system/bin/sh
46 308K 308K 95K 84K /system/bin/qemu-props
32 284K 284K 93K 84K /system/bin/installd
26 260K 260K 92K 84K /system/bin/servicemanager
28 248K 248K 84K 76K /system/bin/debuggerd
프로세스별 PSS 수치는 DDMS의 Sysinfo 탭을 통해서도 볼 수 있다. 파이그래프로 비주얼하게 보여주므로, 메모리 사용 비율을 쉽게 파악할 수 있다.
Currently running services:
meminfo
----------------------------------------------------------
DUMP OF SERVICE meminfo:
Applications Memory Usage (kB):
Uptime: 3793754 Realtime: 3793754
** MEMINFO in pid 183 [com.android.email] **
native dalvik other total
size: 3436 3139 N/A 6575
allocated: 3425 2639 N/A 6064
free: 10 500 N/A 510
(Pss): 824 1893 1461 4178
(shared dirty): 1888 4916 972 7776
(priv dirty): 620 540 552 1712
Objects
Views: 0 ViewRoots: 0
AppContexts: 2 Activities: 0
Assets: 2 AssetManagers: 2
Local Binders: 4 Proxy Binders: 8
Death Recipients: 0
OpenSSL Sockets: 0
SQL
heap: 56 dbFiles: 0
numPagers: 3 inactivePageKB: 13
activePageKB: 0
- Pss 필드 : procrank에 나온 PSS 값과 동일
- shared dirty : 다른 프로세스와 공유하는 dirty pages(디스크로부터 페이징 불가능?)
- private dirty : 프로세스 고유의 dirty pages
참고로 위의 Objects와 SQL 섹션에는 View/Context/Activity 등의 개수와 SQL 페이지 크기 등 중요한 정보를 제공하므로 활용가치가 높다.
dumpsys meminfo 출력 결과에 나온 dalvik 컬럼의 size, allocated, free 필드값은 DDMS의 VM Heap 탭을 통해서도 확인할 수 있다. 각각 VM Heap 탭의 Heap Size, Allocated, Free 컬럼에 해당한다. DDMS의 VM Heap 탭의 정보는 달빅 VM만의 메모리 정보일 뿐, 애플리케이션의 native 라이브러리가 사용하는 메모리 정보는 제외되었다.
- 앱이 오작동하는 버그는 잡을수 없는가?
usb 없이 무선으로 PC와 안드로이드 폰 연결 방법
adb는 일반적으로 USB통해서 사용가능하다. 그런데 wifi로 가능할수있는 방법이 있다
1. 안드로이드 장비와 PC가 같은 wifi 공간에 있어야 한다.
2. 처음 한번은 USB로 연결을 해야 합니다. 안드로이드 장비가 USB 디버깅 모드가 설정되어 있다면 usb로 PC와 연결합니다.
그리고 아래와 같이 PC의 터미널에서 adb devices란 명령어를 통해 모바일 장비와 연결이 되어있는지 확인해봅니다.
$ adb devices
List of devices attached
######## device
3. tcpip 모드로 adb를 재시작 한다.
$ adb tcpip 5555
restarting in TCP mode port: 5555
4. 그 다음 안드로이드 장비의 ip를 찾는다. 장비의 Setting > 디바이스 정보 > 상태 > ip 주소 로 찾거나 현재 wifi가 연결되어 있다면 wifi 설정 정보로 가서 ip 주소를 찾을수도 있다.
5. 이 ip를 가지고 안드로이드 장비와 connection을 시도한다. (usb를 뽑은 후에 시도 해도 되더라)
$ adb connect #.#.#.#
connected to #.#.#.#:5555
6. usb 없이 계속 접근할 수 있다.
$ adb devices
List of devices attached
#.#.#.#:5555 device
만약 모바일 장비가 재부팅이 되더라도 ip 가 변하지 않는한 여전히 connection을 유지할수있다.
다시 연결하려면 adb connect 를 수행해서 다시 연결하면 된다
그래도 잘 안되면,,, adb를 reset해보자 (위에 1번 부터 다시 시작)
adb kill-server