출처 : 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 디렉토리에 GCCCompile 하여 설치한다.
젨젨 $ 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 PChttp://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-

=>
현재, 안드로이드 부팅화면만 볼 수 있고, 마우스 이벤트는 전달되는데,.. 좌표값이 제데로 전달되지 않고 있습니다.
젨�
안정적인 동작을 위해서는 더 많은 삽질이 필요할 것 같습니다.

3. 안드로이드 링크

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

http://www.kandroid.org


+ Recent posts