태그 보관물: ADB

서브라임 텍스트(Sublime Text)를 사용해서 안드로이드 로그를 확인하자.

안드로이드 로그는 로그캣(Logcat) 이라는 툴을 사용해서 에뮬레이터나 기기의 로그를 확인할 수 있다. 일반적으로 안드로이드 스튜디오(Android Studio)나 이클립스(Eclipse)의 로그캣 창으로 확인한다. 아래의 간단한 명령을 사용해서 리눅스 계열의 쉘이나 윈도의 커멘트 창에서 안드로이드 로그도 확인할 수 있다. 아래는 윈도에서 로그를 확인하는 예제이다.

C:\dev>adb logcat

하지만 위 방법으로 안드로이드 로그를 확인하는 과정은 좀 불편하다. 안드로이드 스튜디오나 이클립스에서 로그를 확인하기 위해서 로그캣 창을 조절해야 하는 불편함이 있고, 2개의 모니터를 사용하는 경우 별로도 분리해서 좀 편리하게 사용할 수 있지만 그래도 역시 불편하다.

그래서 로그를 확인하는데 텍스트 작업에 많이 사용하는 편집기로 안드로이드 로그를 확인한다면 위 IDE에서 창을 이동시키거나 2번째 모니터에 로그 창을 이동시켜 놓는 번거로운 과정이 필요 없다. 안드로이드 스튜디오는 Android Device Monitor라는 툴을 제공해서 별도로 분리할 수 있게 한다. 이 툴은 단지 로그만 확인하는 데 사용하기에는 무거운 편이라서 편집기로 확인하는 것이 좋다. 또한, 로그를 검색하거나 이동(스크롤)해서 확인하는 데 편집기가 편하다. 그래서 이 글에서는 개인적으로 많이 사용하는 텍스트 툴인 서브라임 텍스트(Sublime Text)를 사용해서 안드로이드 로그를 확인하는 방법을 살펴보자.

서브라임 텍스트 플러그인으로 안드로이드 로그를 확인할 수 있는 툴은 아래에서 확인할 수 있고, 이 플러그인을 사용하는 방법을 살펴보자.
https://github.com/quarnster/ADBView

* 필수 구성요소

1. 안드로이드 SDK와 ADB 명령이 PATH에 추가되어 있어야 한다.
2. 윈도를 사용하는 경우 텔넷(Telnet) 클라이언트가 설치되어 있어야 한다.
2.1. 확인은 아래의 명령으로 확인할 수 있다.

C:\dev>telnet


이 화면은 텔넷이 활성화된 상태이다.

2.2 설치는 아래의 위치에서 활성화 시키면 된다.
2.2.1 제어판 > 프로그램 추가 삭제 > Windows 기능 사용/사용 안함 > 텔넷 클라이언트 활성
자세한 과정은 이곳(http://ansths.tistory.com/210)을 참고해 보자.

* 설치과정

설치 과정은 Package Control Plugin을 설치하고, 플러그인을 설치해서 로그캣을 연동하는 방법이다.

1. Package Control Plugin(https://packagecontrol.io)을 설치한다.
이 플러그인을 설치하는 방법은 https://packagecontrol.io/installation 에서 확인할 수 있다. 이 페이지에서 서브라임 2, 3 버전에서 View > Show Console 메뉴를 실행해서 나오는 명령 창에, 파이썬 코드를 붙여넣기 해서 실행해서 설치한다. 이 과정의 결과는 아래 화면에서 확인할 수 있다.

그리고 설치를 완료하면 서브라임 텍스트를 재실행한다.

설치 확인은 Preferences > Package Control 메뉴를 실행해서 확인할 수 있다.

2. ADBView 플러그인을 설치하자.
Preferences > Package Control 메뉴를 실행하고, Install Package를 실행하면 패키지를 검색할 수 있다.
아래의 화면은 ADB로 검색된 패키지 목록이고, 선택된 패키지를 설치한다.

3. 로그캣 화면을 실행하자.
Tools > Command Palette…를 실행해서 ADB:Launch를 실행하면 서브라임 텍스트에서 안드로이드 로그를 확인할 수 있다.

이 화면은 필자의 에뮬레이터에 연결해서 보고 있는 로그이다.

4. 로그를 원하는 입맛에 맞게 수정하자.
로그를 원하는 형태로 보려면, 아래 화면으로 확인할 수 있는 설정파일을 수정하면 된다.

이 과정으로 서브라임 텍스트를 사용해서 안드로이드 로그를 편하게 확인할 수 있다.

* Reference

1. https://github.com/quarnster/ADBView
2. http://developer.android.com/tools/help/logcat.html

안드로이드 기기 정보 확인하기

안드로이드 기기 정보는 디버깅을 위해서 꼭 필요한 정보이다. 그래서 기기 정보를 확인하는 방법을 살펴보자. 안드로이드 기기 정보를 확인하는 방법으로 Adb 툴을 사용할 수 있고, 리플렉션을 이용해서 코드로 정보를 확인할 수 있다.  코드에서 안드로이드 기기의 정보를 얻기 위해서 android.os.Build 클래스에서 제공하는 각종 static 변수의 값을 사용한다. 하지만 이 클래스가 제공하는 정보는 제한적이어서 더 많은 정보가 필요할 수 있다. 이런 경우, android.os.SystemProperties 클래스를 사용해서 더 많은 기기의 정보를 확인할 수 있다. 그리고 이 클래스를 사용하기 위해서는 시스템 앱으로 개발되지 않는 이상 기기의 정보를 확인할 수 없게 되어 있다. 그래서, 안드로이드가 제공하는 기기의 정보를 앱 레벨에서 확인하는 방법에 대해서 살펴보자.

1. Adb를 사용하는 방법

1.1 Adb를 사용해서 기기 설정 파일 가져오기..

mcsong@mcsong-ubuntu:~$ adb -d pull /system/build.prop
45 KB/s (3212 bytes in 0.069s)

1.2 기기 설정 파일 정보..

# begin build properties
# autogenerated by buildinfo.sh
ro.build.id=JDQ39
ro.build.display.id=JDQ39
ro.build.version.incremental=573038
ro.build.version.sdk=17
ro.build.version.codename=REL
ro.build.version.release=4.2.2
ro.build.date=Fri Feb  8 22:38:31 UTC 2013
ro.build.date.utc=1360363111
ro.build.type=user
ro.build.user=android-build
ro.build.host=wpef10.hot.corp.google.com
ro.build.tags=release-keys
ro.product.model=Galaxy Nexus
ro.product.brand=google
ro.product.name=mysid
ro.product.device=toro
ro.product.board=tuna
ro.product.cpu.abi=armeabi-v7a
ro.product.cpu.abi2=armeabi
ro.product.manufacturer=samsung
ro.product.locale.language=en
ro.product.locale.region=US
ro.wifi.channels=
ro.board.platform=omap4
# ro.build.product is obsolete; use ro.product.device
ro.build.product=toro
# Do not try to parse ro.build.description or .fingerprint
ro.build.description=mysid-user 4.2.2 JDQ39 573038 release-keys
ro.build.fingerprint=google/mysid/toro:4.2.2/JDQ39/573038:user/release-keys
ro.build.characteristics=nosdcard
# end build properties
#
# system.prop for toro
#

rild.libpath=/vendor/lib/libsec-ril_lte.so
rild.libargs=-d /dev/ttys0
telephony.lteOnCdmaDevice=1

# Ril sends only one RIL_UNSOL_CALL_RING, so set call_ring.multiple to false
ro.telephony.call_ring.multiple=0

# Turn on IMS by default
persist.radio.imsregrequired=1
persist.radio.imsallowmtsms=1

# Default ecclist
ro.ril.ecclist=112,911,#911,*911

#
# ADDITIONAL_BUILD_PROPERTIES
#
ro.com.google.clientidbase=android-verizon
ro.com.google.locationfeatures=1
ro.url.legal=http://www.google.com/intl/%s/mobile/android/basic/phone-legal.html
ro.url.legal.android_privacy=http://www.google.com/intl/%s/mobile/android/basic/privacy.html
ro.setupwizard.mode=OPTIONAL
ro.cdma.home.operator.numeric=310004
ro.cdma.home.operator.alpha=Verizon
ro.cdma.homesystem=64,65,76,77,78,79,80,81,82,83
ro.cdma.data_retry_config=default_randomization=2000,0,0,120000,180000,540000,960000
ro.gsm.data_retry_config=max_retries=infinite,default_randomization=2000,0,0,80000,125000,485000,905000
ro.gsm.2nd_data_retry_config=max_retries=infinite,default_randomization=2000,0,0,80000,125000,485000,905000
ro.config.vc_call_vol_steps=7
ro.cdma.otaspnumschema=SELC,1,80,99
wifi.interface=wlan0
media.aac_51_output_enabled=true
ro.opengles.version=131072
ro.sf.lcd_density=320
ro.hwui.disable_scissor_opt=true
# 디바이스 별 힙 정보
dalvik.vm.heapstartsize=8m
dalvik.vm.heapgrowthlimit=96m
dalvik.vm.heapsize=256m
dalvik.vm.heaptargetutilization=0.75
dalvik.vm.heapminfree=512k
dalvik.vm.heapmaxfree=8m
ro.config.ringtone=Themos.ogg
ro.config.notification_sound=Proxima.ogg
ro.config.alarm_alert=Cesium.ogg
ro.com.android.dateformat=MM-dd-yyyy
ro.com.android.dataroaming=false
ro.carrier=unknown
ro.com.android.wifi-watchlist=GoogleGuest
ro.error.receiver.system.apps=com.google.android.feedback
ro.setupwizard.enterprise_mode=1
keyguard.no_require_sim=true
drm.service.enabled=true
ro.facelock.black_timeout=1250
ro.facelock.det_timeout=1500
ro.facelock.rec_timeout=2500
ro.facelock.lively_timeout=2500
ro.facelock.est_max_time=800
ro.facelock.use_intro_anim=true
camera.flash_off=0
dalvik.vm.dexopt-flags=m=y
net.bt.name=Android
dalvik.vm.stack-trace-file=/data/anr/traces.txt

2. 리플렉션을 사용하는 방법

2.1 리플렉션을 사용하는 코드..

public static String get(String key) {
	try {
		Class clazz = Class.forName("android.os.SystemProperties");
		if(clazz == null)
			return "";
		
		Method method = clazz.getDeclaredMethod("get", String.class);
		if(method == null)
			return "";
		
		return (String) method.invoke(null, key);
	} catch (Exception e) {
		ZLog.e("WHOOPS", "Exception during reflection: " + e.getMessage());
	}
	
	return "";
}

2.2 위 코드의 결과

ZLog.e(TAG, "HeapStartFree --> " + SystemProperties.get("dalvik.vm.heapstartsize"));
ZLog.e(TAG, "HeapMaxFree --> " + SystemProperties.get("dalvik.vm.heapmaxfree"));
HeapStartFree --> 8m
HeapMaxFree --> 8m

이 코드로 간단하게 로그를 확인하면, 위에서 확인한 설정파일인 build.prop의 안드로이드 기기 정보를 확인할 수 있다. 변경도 가능하겠지만, 시스템 정보라서 권한 문제가 발생할 수 있다. 만약 앱이 시스템 권한을 가진다면 이런 리플렉션을 사용하지 않아도 바로 사용할 수 있겠다.

ADB를 사용해서 에뮬레이터나 디바이스에 네트웍으로 연결하기..

ADB는 Android Debug Bridge의 약자로 에뮬레이터나 디바이스에 연결해서, 앱을 설치하거나 디버깅을 도와주는 아주 유용한 툴입니다. 대부분 USB로 연결해서 사용하는데, 매번 연결해 놓는 게 귀찮은 경우 debugging 옵션을 켜 놓고 연결해서 adb툴을 이용해 디버깅과 각종 유용한 기능을 사용할 수 있다. 아래는 같은 네트웍에서 에뮬레이터나 디바이스를 연결해서 사용하는 방법이다.

// device에서 usb debugging 옵션을 키지 않은 경우 연결이 되지 않는다.

C:\>adb tcpip 5555
error: device not found

// device에서 usb debugging 옵션을 키고 아래처럼 adbd의 리스닝 포트를 5555로 세팅한다.

C:\>adb tcpip 5555
restarting in TCP mode port: 5555

기기의 Wi-Fi 옵션에서 IP를 확인한다.

// 아래의 명령으로 device에 연결한다.

C:\>adb connect 192.168.123.176:5555
connected to 192.168.123.176:5555

// 연결된 디바이스 목록을 확인한다.

C:\>adb devices
List of devices attached
192.168.123.176:5555    device

// adb shell 명령으로 에뮬레이터나 디바이스에 접근해서 각종 명령을 사용할 수 있다.

자세한 내용은 Android Developer 사이트(http://developer.android.com/tools/help/adb.html)에서 확인할 수 있다.