출처 : http://cs.sch.ac.kr/cs_homepage/seminar/android/Android.htm
Android 연구실문서젨젨� 젨젨젨젨젨젨젨젨� 2009.6.30
1. 안드로이드 응용 프로그램
젨 * Java 프로그램
젨 * 09-안드로이드개요-이상정.pdf
2. 안드로이드 포팅
� * 실제보드, 에뮬레이터 포팅
* 참고자료
� . 칸드로이드, http://www.kandroid.org/board/board.php?board=androidsource&command=body&no=4
� . 안드로이드, http://source.android.com/download#TOC-Setting-up-your-machine
� 호스트 Ubuntu Linux 설치
- http://www.ubuntu.com/� http://ubuntu.or.kr/ ftp://ftp.daum.net/ubuntu-releases
- 리눅스 설치 CD 생성
� ftp://ftp.daum.net/ubuntu-releases/9.04/ubuntu-9.04-desktop-i386.iso 다운 받아 생성
- 루트 패스워드 설정 및 ssh 설치
젨 $ sudo passwd root
젨 $ sudo apt-get install ssh
� 개발 툴 설치
- 기본적인 패키지 설치
$ sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl
$ sudo apt-get install valgrind젨� -> Valgrind: memory leaks, stack corruption, array bounds overflows 감지 툴
젨 -> 안드로이드는 Phython 2.4 이상이 요구되나, 우분투에 이미 포함
- JDK 5.0, update 12 또는 그 이상 설치
� $ sudo apt-get install sun-java6-jdk
� Git 설치
- 안드로이드 소스는 Git(버전 컨트롤 시스템)를 사용하여 관리
- 환경설정
$ cd ~
$ mkdir bin
$ vi ~/.bashrc
� export LANG=c
export PATH=/home/<your_home>/bin:$PATH:.
export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.07
export ANDROID_JAVA_HOME=$JAVA_HOME
젨 $ sh ~/.bashrc젨 -> 위 환경변수 반영을 위해 ~/.bashrc 실행
- Git 버전 1.5.4 또는 그 이상과 과 GNU Privacy Guard 설치
� $ sudo apt-get install git-core gnupg
� Repo 설치
- 툴 소개
� . Repo는 Git 상에서 설치되는 안드로이드 개발 관리 툴
젨젨 -> . Using Repo and Git, http://source.android.com/download/using-repo
- 다음과 같이 호스트 컴퓨터에 repo를 설치
� . Repo를 설치할 ~/bin 디렉토리를 생성하고 실행 경로 환경 변수에 추가한다.
젨� -> Curl 명령을 실행할 때 실행 권한 문제가 발생하는 경우 root 계정으로 변경한 후 repo를 설치
- Repo 스크립트를 다운로드하고 실행 파일로 속성을 변경
젨� $ curl http://android.git.kernel.org/repo > ~/bin/repo
젨� $ chmod a+x ~/bin/repo
- Repo 클라이언트 초기화
� $ mkdir ~/mydroid젨 -> 안드로이드 소스를 다운 받을 작업 디렉토리를 생성
� $ cd ~/mydroid
� $ repo init -u git://android.git.kernel.org/platform/manifest.git�
젨� -> 최신 버전의 repo를 다운 받기 위해 repo init을 실행
젨� ->� repo init을 실행할 때 이름과 이메일 주소를 물어 보는데 자신이 수정한 안드로이드 소스를 배포할 계획이 없다면 적당히 입력해도 상관 없음
젨� -> 설치 성공하면 repo initialized in /home/<your_home>/mydroid 란 메시지 표시
� Git 태그 확인
- GnuPG 키 데이터베이스에서 공유 키 로드, 이 키는 릴리즈를 표시하는 annotated tags에 등록하는데 사용
$ gpg --import
- 아래의 키를 잘라내고 ^D로 입력을 끝내고 키를 처리(?), 키를 가져온 후 다음 명령으로 키를 확인 (?)
$ git tag -v tagname
젨� key 9AB10E78: "The Android Open Source Project <initial-contribution@android.com>"
젨� -----BEGIN PGP PUBLIC KEY BLOCK-----
젨� Version: GnuPG v1.4.2.2 (GNU/Linux)
젨� mQGiBEnnWD4RBACt9/h4v9xnnGDou13y3dvOx6/t43LPPIxeJ8eX9WB+8LLuROSV
젨� 뀉�
젨� -----END PGP PUBLIC KEY BLOCK-----
� 안드로이드 소스 다운로드 및 안드로이드 빌드
- 안드로이드 소스를 다운로드할 디렉토리로 이동하여 다음 명령을 실행
� $ cd ~/mydroid
� $ repo sync젨�
- 안드로이드 소스 트리의 최상위 디렉토리에서 make를 실행하여 소스코드 전체(커널 제외)를 빌드
� $ make
젨� -> 이 과정을 수행하는 동안 zlib.h error가 발생할 수 있습니다.
젨 이 경우에는 아래와 같이 zlibb1g-dev를 설치하시고 계속 make를 수행하면 됩니다.
$ sudo apt-get install zlib1g-dev
� $ make
� $ cd out �
젨� -> out 디렉토리에 build된 안드로이드 full package가 생성되었는가를 확인
젨� -> 안드로이드 플랫폼 소스 전체를 빌드하려면 7GB 정도의 공간이 필요하고 호스트 컴퓨터의 성능 에 따라 다르겠지만 많은 시간이 소요
젨� -> 안드로이드 소스는 프로젝트 이름 디렉토리에 위치
젨젨젨 -> 안드로이드 프로젝트 http://source.android.com/projects
- Ubuntu 9.04 에서� Android 1.5 Build� 시 에러 수정
� . �http://www.kandroid.org/board/board.php?board=androidsource&command=body&no=41
. 우분투 9.04 에서 안드로이드 1.5 빌드시 다음 에러가 발생합니다.
$ make
make: execvp: /bin/bash: Argument list too long
host C: emulator <= external/qemu/sockets.c
external/qemu/sockets.c: In function �sock_address_init_resolve�:
external/qemu/sockets.c:637: error: �EAI_NODATA� undeclared (first use in this function)
external/qemu/sockets.c:637: error: (Each undeclared identifier is reported only once
external/qemu/sockets.c:637: error: for each function it appears in.)
make: *** [out/host/linux-x86/obj/EXECUTABLES/emulator_intermediates/sockets.o] 오류 1
=> 2003년에 만들어진 RFC3493에 따라서 EAI_NODATA가 삭제되었기 때문이고
이제는 EAI_NODATA를 쓰던 getaddrinfo에서 이제는 EAI_NONAME를 리턴하기 때문에
EAI_NODATA는 의미 없는 값이 되어서 무시해도 상관이 없습니다.
기존의 코드는 예외 발생 방지용& 하위 호환용으로 있던 코드일 뿐입니다.
결론은 637번 라인을 주석처리하거나 아래처럼 EAI_NODATA 부분을if defined 로 커버해 주시면 됩니다.
#if defiined(EAI_NODATA) && EAI_NODATA != EAI_NONAME
case EAI_NODATA:
#endif
case EAI_NONAME:
err = ENOENT;
break;
� Cupcake 빌드
- 안드로이드 원본 소스 대신에 업그레이드된 cupcake 빌드
- cupcake의 주요 특징, http://source.android.com/roadmap/cupcake
� $ mkdir cupcake
� $ cd cupcake
� $ repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake
� $ repo sync
$ make
� 커널 빌드
- msm: Qualcomm의 MSM(mobile station modem) 칩�
� $ cd ~/mydroid/kernel
$ make msm_defconfig ARCH=arm
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
- goldfish
$ cd ~/mydroid/kernel
$ make goldfish_defconfig ARCH=arm
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
- ? PXA320
� . 커널 설정, 소스 수정 후
� $ make or make zImage
� 자료, 에뮬레이터 빌드 (Linux) http://www.kandroid.org/board/board.php?board=AndroidPlatform&page=3&command=body&no=31
� 안드로이드 에뮬레이터 최신 소스를 다운로드, 압축 해제
다운로드 : http://android.googlecode.com/files/android-emulator-m3-rc37.tar.bz2
$ bzip2 -d android-emulator-m3-rc37.tar.bz2
$ tar xvf android-emulator-m3-rc37.tar
� 컴파일
$ cd /android-emulator-20071212
$ ./build-emulator.sh
�=> 이 과정에서 두가지의 Bug가 발생할 수 있음.
젨 1> CLOCK_MONOTONIC Not Defined Error 발생시
qemu/vl.c 의659 라인과 678 라인을 다음과 같이 바꾼다.
- #ifdefined(__linux__)
+ #if 0 // defined(__linux__)
2> XRRSetScreenConfig 에 대한 different prototype Error 발생시
sdl/src/video/x11/SDL_x11sym.h 의 195 라인을 다음과 같이 바꾼다.
-SDL_X11_SYM(Status,XRRSetScreenConfig,(Display *dpy, XRRScreenConfiguration *config,
Drawable draw, int size_index,
Rotation rotation, Time timestamp),
(dpy,config,draw,size_index,rotation,timestamp),return)
+ SDL_X11_SYM(Status,XRRSetScreenConfig,(Display *dpy, XRRScreenConfiguration *config,
Drawable draw, int size_index, int visual_group_index,
Rotation rotation, Time timestamp),
(dpy,config,draw,size_index, visual_group_index, rotation,timestamp),return)
sdl/src/video/x11/SDL_x11modes.c 의 255 라인과 1083라인을 다음과 같이 바꾼다.
- XRRSetScreenConfig(SDL_Display, screen_config, SDL_Root,
size_id, saved_rotation, CurrentTime);
+ int visual_group_index = 0;
+ XRRSetScreenConfig(SDL_Display, screen_config, SDL_Root,
size_id, visual_group_index, saved_rotation, CurrentTime);
- 위와 같이 Patch 한 후 다시� 빌드
$ ./build-emulator.sh
� emulator를 실행하기 위한 안드로이드 kernel image 및 기타 화면 skin등을 설치
- Windows 용으로 Release되고 있는 android_sdk_windows_m3-rc37a 의 tools/lib 디렉터리를 압축하여 Linux의 emulator가 있는 디렉토리에 푼다.
- emulator를 실행
$./emulator
� => 위 과정에서 다음과 같은 오류가 발생할 수 있다.
젨� qemu: fatal: Bad mode 8
젨� 이 오류는 emulator의 두 구성요소, 즉 SDL과 QEMU중 QEMU를 GCC3.X.X 버전으로 빌디하지 않았기 때문이다.
젨� 이를 해결하기 위해서는 다음과 같이 해결한다.
젨 먼저 GCC 3.X.X 버전을 다운로드 받는다
젨� 다운로드 : ftp://ftp.kaist.ac.kr/gnu/gcc/gcc-3.4.6/gcc-3.4.6.tar.bz2
젨 그리고 qemu 디렉토리에 GCC를 Compile 하여 설치한다.
젨젨 $ bzip2 -d gcc-3.4.6.tar.bz2
젨젨 $ tar xvf gcc-3.4.6.tar
젨젨 $ cd gcc-3.4.6
젨젨 $ ./configure --prefix=[emulator 설치 Directory]/qemu
젨젨 $ make
젨젨 $ make install
젨 GCC 3.4.6 버전이 설치 완료되면 qemu/config-host.mak를 다음과 같이 수정한다.
젨� - CC=gcc
젨� +CC=[emulator 설치 Directory]/qemu/bin/gcc
젨� - HOST_CC=gcc
젨� +HOST_CC=[emulator 설치 Directory]//qemu/bin/gcc
- emulator를새롭게 Build한다.
� $ cd qemu
� $ make clean
� $ make
� $ cp arm-softmmu/qemu-system-arm ../emulator
- emulator를 다시 실행한다.
$ ./emulator
� Ubuntu8.04에서는 에러가 발생
�qemu/skins/skin_argb.h:286: error: incompatible
�= > 일단 _mm_add_si64 =>_mm_add_pi16 으로 교체 하고 GCC4.x==>GCC3.x 로 교체하고 빌드하니
젨젨� 제대로 빌드됩니다. 그리고 참고로 config-host.mak 화일을 수정하는거보다 android-rebuild.sh에서 gcc path를 잡아주는게 좋을듯하네요.
(에뮬레이터를 사용한 안드로이드 테스트)
� 자료, Android Porting on X86 PC� http://www.kandroid.org/board/board.php?board=androidsource&command=body&no=40
� 안드로이드 소스 코드 빌드 테스트, http://www.kandroid.org/board/board.php?board=androidsource&command=body&no=8.
� 먼저 mydroid 의 out directory에서 아래의 세가지 image를 android sdk가 설치된 desktop에 download
~mydroid/out/target/product/generic/ramdisk.img
~mydroid/out/target/product/generic/system.img
~mydroid/out/target/product/generic/userdata.img
� android sdk 1.0 이 설치된 desktop의 아래의 directory에서 ramdisk.img, system.img, userdata.img를 임시로 다른 곳으로 저장
android-sdk-windows-1.0_r1/tools/lib/images� � ?? 윈도우 SDK? 리눅스에서는?
� 위에서 다운로운한 세가지 img 파일을 위의디렉토리에위치시킨 후 후, android-sdk-windows-1.0_r1/tools/emulator.exe를 실행합니다.
� 만약 emualor가 정상적으로 실행되고, 내부 app. 들이정상적으로 작동한다면, 안드로이드 source는 정상적으로 build되었다고 볼 수 있습니다.
� 매번 복사기 귀찮을때는
./emulator -kernel <file> -ramdisk <file> -image <file> -initdata <file> 옵션을 사용하는 것이 유용합니다.
� 마찬가지로 goldfish 로 컴파일된 커널의 zImage ( ~mydroid/kernel/arch/arm/boot/ ) 를 kernel-qemu ( SDK/tools/lib/images/ ) 로 이름을 바꿔 copy 해 놓으면 emulator 에서 실행이 됨을 확인 할수 있는 것 같습니다. 미리 backup 은 잊지 마시고요...
� => ?? 빌드된 소스를 에뮬레이터에서 실행?
(QEMU를 활용하여 안드로이드 포팅)
? 안드로이드 에뮬레이터를 사용하지 않는가?
� QEMU 를 활용하여 안드로이드 포팅기술을 실습해 볼 수 있는 방법
� 자료
- REAL TARGET BOARD 없이 안드로이드 포팅기술 익히기
- http://www.kandroid.org/board/board.php?board=androidsource&command=body&no=24
- http://mdcamp.kr/?mid=techdata
� 업그레이드 된 QEMU 바이너리 설치
- 우분투에서 다음과 같이 최신의 QEMU 바이너리를 설치
$ sudo apt-get install qemu
� QEMU용 안드로이드 루트파일시스템 생성하기
- 먼저, 안드로이드 전체소스를 빌드
- 파일시스템이 저장될 디스크이미지 생성
$ dd if=/dev/zero of=rootfs.ext2 bs=1024 count=128000
- ext2 파일시스템으로 포멧하기
$ mkfs.ext2 rootfs.ext2
- loop back디바이스로 마운트 하기
$ mkdir tmproot
$ sudo mount -o loop rootfs.ext2 tmproot
- 안드로이드 파일시스템을 마운트된 디스크이미지로 복사하기
$ cd tmproot
$ cp <여러분의 안드로이드 소스 저장된 경로>/out/target/product/generic/root/* .
$ cp <여러분의 안드로이드 소스 저장된 경로>/out/target/product/generic/data/ .
$ cp <여러분의 안드로이드 소스 저장된 경로>/out/target/product/generic/system/ .
- 안드로이드 루트파일 시스템이 rw로 mount 되도록 init.rc 수정
$ vi init.rc
다음의 부분을 찾아서
mount rootfs rootfs / ro remount
다음과 같이 수정합니다.
mount rootfs rootfs / rw remount
저장후 빠져나옵니다.
- 루프백 디스크이미지 언마운트 하기
$ cd ..
$ sudo umount tmproot
� QEMU를 기동하여 안드로이드를 부팅하기
- 첨부된 커널이미지를 받아서 pwd에 저장
- 다음의 명령으로 안드로이드를 기동
$ qemu-system-arm -kernel zImage.versatile -M versatilepb -hda rootfs.ext2 -usb -usbdevice wacom-tablet -no-reboot -append "root=/dev/sda rw rootfstype=ext2 init=/init "
� QEMU용 안드로이드 커널 빌드하기
$ cd <여러분의 안드로이드 소스 저장된 경로>/kernel
$ make menuconfig ARCH=arm
- 타겟 디바이스를 versatile 로 설정하고, 각종 안드로이드 feature와, SCSI하드디스크, 등 적절한 디바이스를 설정합니다.
다음의 명령으로 커널을 빌드합니다.
$ make ARCH=arm CROSS_COMPILE=<여러분의 안드로이드 소스 저장된 경로>/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
=> 현재, 안드로이드 부팅화면만 볼 수 있고, 마우스 이벤트는 전달되는데,.. 좌표값이 제데로 전달되지 않고 있습니다.
젨� 안정적인 동작을 위해서는 더 많은 삽질이 필요할 것 같습니다.
� http://www.android.com/
- Open Source Project http://source.android.com/
� . Git, Repo version control system
� . Ubuntu linux, Ecllipse
- Android Developers http://developer.android.com/
� . Android 1.1 SDK r1
- Android Market http://www.android.com/market/
- Google Group, Android Internals
� . http://groups.google.com/group/android-internals
'Computer Science' 카테고리의 다른 글
ubuntu 이클립스 cdt 설치 (0) | 2010.07.20 |
---|---|
리얼타겟에서 안드로이드 프로그래밍 (0) | 2010.07.18 |
FLTK on Ubuntu (0) | 2010.07.04 |
Ubuntu 우분투에서 QT4 설치 개발하기... (0) | 2010.07.03 |
안드로이드 빌드하여 eeepc 에서 부팅하기 (0) | 2010.07.03 |