12 장안드로이드개발지원환 경및분석
2 목차 안드로이드개발홖경 안드로이드개발지원도구 에뮬레이터에안드로이드용 busybox 설치 파일추출실습 안드로이드에 SD 카드를가상장치로연결하기
12.1 안드로이드개발환경 3 계층구조의안드로이드플랫폼을어떻게빌드할것인가? X86, 윈도우기반애플리케이션 -> ARM, 리눅스기반의타깃에적재 -> 마켓에배포 윈도우기반개발환경의구성및동작과정 이클립스 (IDE) 지원 QEMU 가상머신, ARM 과리눅스지원에뮬레이터 [ 그림 12-1] 윈도우기반개발환경
12.1 안드로이드개발환경 4 X86, 리눅스기반의안드로이드개발환경 안드로이드커널빌드에활용 하드웨어드라이버개발에활용 [ 그림 12-2] 리눅스기반의안드로이드개발환경
12.1 안드로이드개발환경 5 ARM 기반실행환경 실제모바일장치 실제타깃에커널, 플랫폼, 파일시스템적재방법 apk 파일만실행할수있는환경적재 자바, 리눅스빌드도구필요없음 [ 그림 12-3] ARM 기반실행환경
6 주개발도구 자바코드에디터, 컴파일러, 빌더 개발지원도구 디버거, 파일관리, 인증, 배포도구 aapt adb mksdcard ddms sqlite [ 그림 12-4] 개발지원도구
7 adb 에뮬레이터상태조회및관리 리눅스쉘명령어구동 파일복사및이동 Port forward 클라이언트 / 서버 (adbd) 로동작, TCP/IP 통신 서버는에뮬레이터에서백그라운드프로세스로동작 Adb 클라이언트로에뮬레이터와연결 adb [-d -e -s <serialnumber>] <command>
8 adb 실습 [ 실습 12-1] (1) 윈도우의명령창 command shell 을띄운다. (2) adb 프로그램이있는디렉토리 (D:\android\android-sdk\tools) 로이동한다. (3) adb 를실행한다. [ 그림 12-5] 에뮬레이터가동작하지않고있는경우오류메시지
9 adb 실습 [ 실습 12-1] (4) 이클립스에서 com.corea.android 패키지를실행시켜에뮬레이터를구동시킨다. 실행과정을 [ 그림 12-6] 처럼이클립스콘솔화면에서관찰할수있다. 안드로이드가런치 Launch 하면서, adb 데몬, Android 애플리케이션도런치되고, myavd 라는가상장치를기반으로에뮬레이터도동작한다. 에뮬레이터에 com.corea.android 애플리케이션이업로드되어동작한다. [ 그림 12-6] myavd 에뮬레이터에 Android 패키지동작과정
10 adb 실습 [ 실습 12-1] (5) 다시 adb 프로그램을실행시킨다. 에뮬레이터의 adbd 서버가동작됨으로 adb 로연결되어리눅스쉘명령어를사용할수있다. adb shell 를입력하면 [ 그림 12-7] 처럼쉘프롬프트 shell prompt 가 > 에서 # 로변경된다. DOS 모드에서 ubuntu 리눅스의쉘모드에들어간것이다. ls 같은리눅스쉘명령어를사용할수있다. 안드로이드는일반리눅스쉘명령어를최적 화한극히일부명령어만지원한다. [ 그림 12-7] 원격쉘접속
11 [ 실습 12-2] 호스트컴퓨터에현재연결되어동작중인에뮬레이터및단말기같은장치목록을검색하는실습 (1) 이클립스 Windows' 메뉴의 Android SDK and AVD Manager' 를선택한다. 그리고 Virtual Devices 를선택하여새로운가상장치를만들기위해 'New' 를선택한다. [ 그림 12-8] 처럼 API Level 3 의 'test' 라는가상장치를등록한다. [ 그림 12-8] test 라는가상장치를등록
12 [ 실습 12-2] 호스트컴퓨터에현재연결되어동작중인에뮬레이터및단말기같은장치목록을검색하는실습 (2) 생성한 'test' 라는가상장치에뮬레이터를 [ 그림 12-9] 처럼 emulator -avd test' 명령으로 1 개더시동시킨다. [ 그림 12-9] test 라는이름의가상장치를시동
13 [ 실습 12-2] 호스트컴퓨터에현재연결되어동작중인에뮬레이터및단말기같은장치목록을검색하는실습 (3) 두개의에뮬레이터가 [ 그림 12-10] 처럼호스트에서동작중인것을확인한다. [ 그림 12-10] 두개의에뮬레이터가동작
14 [ 실습 12-2] 호스트컴퓨터에현재연결되어동작중인에뮬레이터및단말기같은장치목록을검색하는실습 (4) 또다른명령창을열고, adb devices 을입력한다. [ 그림 12-11] 처럼두개의에뮬레이터가동작중인것을확인한다. [ 그림 12-11] adb devices 명령사용
15 [ 실습 12-3] 복수에뮬레이터고급활용하기 (1) adb -s emulator-5556 shell 을입력한다. [ 그림 12-12] 는 5556 번 test 에뮬레이터가상장치에쉘모드로연결한상태를보여준다. [ 그림 12-12] 쉘모드연결하기
16 [ 실습 12-3] 복수에뮬레이터고급활용하기 (2) 쉘모드에서 ls -l 명령어를입력한다. adb 를통하여쉘명령어를사용해보면안드로이드가리눅스기반이란것을이해할수있다. 쉘명령어 "ls -l" 을사용하여루트 root 디렉토리구조를살펴보고 [ 그림 12-13] 처럼리눅스파일시스템을관찰을실습한다. [ 그림 12-13] 리눅스파일시스템관찰
17 [ 실습 12-3] 복수에뮬레이터고급활용하기 (3) 5554 번에뮬레이터명령창을띄운다. (4) 쉘모드에서 ifconfig eth0 를입력한다. 쉘모드에서 5554 번에뮬레이터의 IP 번호설정상태를확인하기위하여명령창에서네트워크해석도구인 netstat -anob 입력한다. IP 주소가 10.0.2.15 로 [ 그림 12-14] 처럼 확인된다. [ 그림 12-14] 에뮬레이터 IP 주소확인
18 [ 실습 12-3] 복수에뮬레이터고급활용하기 (5) 쉘모드에서 netstat -anob 를입력한다. 5554 번에뮬레이터에서동작중인 TCP 통신프로토콜연결상태를확인하는명령어이다. 모든 adb 클라이언트는서버와의통신에 TCP 5037 포트를바인딩하여사용하며, [ 그림 12-15] 처럼에뮬레이터서버 5555 번포트로 adb 와 TCP 연결이설정이이루어진것을확인할수있다. [ 그림 12-15] TCP 연결상태
19 [ 실습 12-3] 복수에뮬레이터고급활용하기 (6) 호스트명령창에서 netstat -anob 를입력한다. 호스트관점에서는 2 개의에뮬레이터가동작하고있음으로, [ 그림 12-16] 처럼 2 개의에뮬레이터가동작중인상태를확인할수있다. adb 클라이언트와에뮬레이터의 IP 주소가동일하지만포트번호가다름을주목하라. [ 그림 12-16] netstat -anob 를사용한에뮬레이터연결상태확인
20 < 저자한마디 > adb 명령을사용한파일이동명령어 adb pull 는휴대단말기의파일이나에뮬레이터파일시스템파일을호스트 PC 로이동, 명령어 adb push 는호스트 PC 의파일을주변의휴대단말기또는에뮬레이터장치로이동. adb push <SDK 원본 > < 에뮬레이터경로 > adb pull < 에뮬레이터경로 > <SDK 경로 > [ 그림 12-17] adb 를사용한파일이동
21 에뮬레이터 가상의휴대폰장치 ARM, QEMU 가상머신에 안드로이드커널탑재 윈도우, 리눅스버전존재 Goldfish 실제타깃과차이 : 부동소수점처리 property:ro.kernel.qemu=1 [ 그림 12-18] QEMU 가상머신
22 [ 실습 12-4] 에뮬레이터에서 QEMU, /proc 확인하기 (1) adb shell 로쉘모드로간다. (2) cd proc 로 /proc 디렉토리로이동한다. (3) cat cmdline 명령을실행한다. cmdline 은커널이시작될때커널에젂달하는매개변수를갖는다. qemu=1 를젂달하고있다. [ 그림 12-19] QEMU 동작확인
23 [ 실습 12-4] 에뮬레이터에서 QEMU, /proc 확인하기 (4) cd /proc/1 명령을실행한다. 주메모리에생성되는 /proc 디렉토리에는현재동작중인프로세스와커널의실행상태를기록하고있다. /proc/1 는부팅시가장먼저시작하는프로세스번호이다. cmdline 을사용하여 /proc/1 번프로세스에대한커널로의입력변수를확인해보니 init 인것으로확인된다. [ 그림 12-20] 프로세스 1 번 /proc 확인
24 sqlite 관계형데이터베이스 SQL 표준명령어사용 MySQL 보다최소 2 배이상빠르다. 기존임베디드는 JFFS 같은파일시스템에데이터저장 안드로이드는 sqlite 사용하여빠른검색특징 개별애플리케이션마다 /data/data/< 패키지이름 >/databases/ 생성 에뮬레이터내의데이터베이스접속가능 $ adb -s emulator-5554 shell # sqlite3 /data/data/com.example.google.rss.rssexample/databases/rssitems.db CREATE TABLE < 테이블이름 > (Column 정의, [ 테이블제약 ]); CREATE TABLE contact_list (id INTEGER, name TEXT, tel TEXT);
25 [ 실습 12-5] Sqlite 사용법및데이터베이스읽기 (1) 데이터베이스관리실습을위하여에뮬레이터 5554 번 1 개만을남겨둔다. adb shell 쉘모드로이동한다. (2) cd /data/data/com.android.browser/databases 디렉토리로이동한다. (3) ls 명령으로 webview.db 존재를확인한다. (4) sqlite3 명령으로 webview.db 파일을열어본다. [ 그림 12-21] sqlite3 사용법
26 [ 실습 12-5] Sqlite 사용법및데이터베이스읽기 (5) /data/system/ 디렉토리에있는 syncmanager.db 데이터베이스내용을살펴본다. sqlite 를사용하여 [ 그림 12-22] 처럼데이터베이스에접속을하고,.tables 명령을입력하면 active, history, settings, status 등의테이블이나온다. (6) select * from history 명령을입력한다. history 테이블의내용을본다. [ 그림 12-22] 데이터베이스내용보기
27 기타도구 Dx Dexdump Ant Valgrind AIDL
12.3 안드로이드용 busybox 설치 28 리눅스 1,000 여개의시스템관리를위한명령어 : toolbox 제공 안드로이드 toolbox 는단지 50 여개의리눅스명령어만제공 [ 그림 12-23] toolbox 에들어있는명령어들
12.3 안드로이드용 busybox 설치 29 단점 : cp, tar 같은명령어없어개발및디버그시불편 busybox 를통한해결
Busybox 소스다운로드하기
12.3 안드로이드용 busybox 설치 31 [ 실습 12-6] busybox 설치하기 (1) 명령창을연다. (2) d: 로하드디스크 D 로이동한다. (3) cd D:\android\android-sdk\tools 명령을실행한다. (4) adb push busybox /data 를입력한다. adb 를이용해 SDK 의 busybox 실행파일을에뮬레이터파일시스템 /data 아래로복사한다. (5) adb shell 명령어를입력한다. adb 를이용해 android 에뮬레이터의 shell(/system/bin/sh) 명령실행후쉘프롬프트 # 로젂홖한다. (6) cd data; ls -l 명령으로복사된 busybox 파일존재여부를확인한다. [ 그림 12-25] 처럼 busybox 가설치된것을확인한다. (7) chmod 777 busybox 명령을실행하여 busybox 명령을사용하기위해실행가능한권한으로설정한다. [ 그림 12-25] busybox 파일의에뮬레이터설치
12.4 파일추출실습 32 [ 실습 12-7] 파일압축및추출하기 (1) adb shell 쉘모드로이동한다. (2) /data/busybox tar cvf /data/system.tar /system 을입력한다. busybox 의 tar 명령을사용하여에뮬레이터의 /system 디렉토리를 /data/system.tar 파일로압축한다. [ 그림 12-26] 은에뮬레이터 /system 디렉토리의압축및복사하기를보여준다. [ 그림 12-27] 은에뮬레이터 /data 디렉토리에 system.tar 압축파일이복사된것을 ls -l 명령어로보여준다. [ 그림 12-26] 에뮬레이터 /system 디렉토리의압축및복사하기 [ 그림 12-27] system.tar 복사확인
12.4 파일추출실습 33 [ 실습 12-7] 파일압축및추출하기 (3) exit 명령어수행하여 shell 을빠져나온다. (4) 에뮬레이터 /data/ 디렉토리에있는 system.tar 압축파일을데스크탑컴퓨터의 SDK 로추출하는실습이다. adb pull /data/system.tar system.tar 명령을실행한다. [ 그림 12-28] 는 system.tar 가 SDK 의 /tools 디렉토리에복사된것을보여준다. [ 그림 12-28] SDK 디렉토리로파일추출결과
12.4 파일추출실습 34 cpio 사용 이미지압축파일관리도구 ramdisk, sdcard 이미지파일관리 [ 그림 12-29] 램디스크이미지내용확인
12.5 에뮬레이터에 SD 를가상장치로연결 35 SD는대용량메모리장치 플래시메모리 32MB 로동영상파일저장에한계 주변장치로활용 SD : Secure digital SD는골드피시장치에속하지않음 따라서에뮬레이터에 SD를추가하는방법필요
36 12.5 에뮬레이터에 SD 를가상장치로연결 [ 실습 12-8] SD 카드생성및파일추출하기 (1) 명령창을띄운다. (2) D:\android\android-sdk\tools 디렉토리로이동한다. (3) mksdcard 256M sd.img 명령을실행한다. (4) dir 명령을실행하여 [ 그림 12-30] 처럼 256MB 의 sd.img 가생성된것을확인한다. [ 그림 12-30] sd.img 파일생성확인
37 12.5 에뮬레이터에 SD 를가상장치로연결 [ 실습 12-8] SD 카드생성및파일추출하기 (5) sd.img 를 c:\temp 로복사한다. \tools 폴더에 sd.img 를넣고 SD 카드실습하면에뮬레이터에가상장치로연결이되지않고있다. 그래서다른폴더에옮겨놓는것이다. (6) emulator -avd myavd -sdcard c:\temp\sd.img 명령을실행하여에뮬레이터에 sd.img 이미지를가상장치로연결한다. [ 그림 12-31] AVD 지원에의한 sdcard 장치연결명령
38 12.5 에뮬레이터에 SD 를가상장치로연결 [ 실습 12-8] SD 카드생성및파일추출하기 (7) 에뮬레이터에서 setting 메뉴 -> SD card & phone storage settings 를클릭한다. [ 그림 12-31] 실행결과자동으로에뮬레이터가구동되고 SD 카드가인식된것을 [ 그림 12-32] 1) 과 2) 처럼확인할수있다. 약 256MB 메모리용량이할당되어있다. 여기서 avd 이름은이클립스 Run Configurations' 메뉴에서 target 탭의 avd 이름설정에서사용한것과동일하여야한다. 에뮬레이터에는 myavd 라는 avd 가가상장치로서연결 되었고, 이제 sd.img 이미지가 SD 카드로서연결이되어사용가능하다. 1) 초기화면 2) SD 가상장치연결 [ 그림 12-32] SD 카드인식화면
39 12.5 에뮬레이터에 SD 를가상장치로연결 [ 실습 12-8] SD 카드생성및파일추출하기 (8) SDK 에있는 busybox 파일을에뮬레이터 /sdcard 디렉토리에복사과정을실습한다. [ 그림 12-31] 의명령창이정지해있음으로또하나의명령창을열어서 SDK 에있는 busybox 파일을에뮬레이터 /sdcard 디렉토리에복사하는실습을한다. [ 그림 12-33] 에나타난것처럼 adb push busybox /sdcard 명령을실행한다. [ 그림 12-33] 또다른명령창열기및 busybox 추출하기
40 12.5 에뮬레이터에 SD 를가상장치로연결 [ 실습 12-8] SD 카드생성및파일추출하기 (9) 에뮬레이터가상장치인 SD 카드에있는파일을 SDK 로복사하는과정이다. adb pull /data/app/com.corea.android.apk. 명령을실행한다. /data/app 디렉토리에있는 com.corea.android.apk 파일을데스크탑 SDK 의하드디스크로다운로드하는과정을 [ 그림 12-34] 에보여준다. [ 그림 12-34] com.corea.android.apk 파일추출결과
41 12.5 에뮬레이터에 SD 를가상장치로연결 [ 실습 12-8] SD 카드생성및파일추출하기 (10) 리눅스에서실제타겟을사용한실습과정이다. 본실습을위해하이버스의 xhyper320tku 보드를사용하여야하며구체적인것은연습문제를참고한다. 에뮬레이터의 SD 카드에들어있는 apk 파일을실행하기위해서는안드로이드애플리케이션소스에서변경이필요하다. 통상적인애플리케이션 apk 는개발시 /data/data/packagename/ 에생성및저장된다. /data/data/packagename/ 가아닌 SD 카드에저장된애플리케이션파일을실행하려면자바소스에서데이터에대한경로설정을변경해주어야한다. 예를들면, 비디오를재생하려면자바소스에서 SD 카드의데이터를사용할수있도록 Video 클래스의해당메소드를변경해주어야한다. 즉, Video.java 프로그램소스에서 Video.setVideoPath("/sdcard/MiniRobot.mp4") 를수정한다. 그러면애플리케이션에서비디오데이터를 /sdcard 에서읽게된다. 본실습에대한구체적인것은연습문제를참고한다.
끝! 42