2011년 12월 5일 월요일

LINUX_안드로이드 개발환경 설정


http://blog.naver.com/lr1?Redirect=Log&logNo=130085464242

퍼온글입니다. 좋은정보 감사합니다.

오후 1:36 2010-03-29
안드로이드 goldfish 디버그하기 조경민 broneri@gmail.com
================================================================

본 내용은 보드없이 linux 및 android의 동작 흐름 분석을 위해서 
에뮬레이터 상의 안드로이드 동작을 커널 디버거로 연결하는 내용입니다.


안드로이드? goldfish?
----------------------------------------
안드로이드는 linux kernel위에 동작되는 java virtual machine (dalvik)을 포함한
프레임워크 소프트웨어 이다.
안드로이드 개발을 편하게 해주기 위해 가상의 보드 및 에뮬레이터를 제공하고 있다.
이 가상의 보드 또는 virtual arm soc가 goldfish이다. 
goldfish는 다음으로 구성된다.
ARM926T, Thumb, MMC, RTC, Keyboard, USB Gadget, Framebuffer, TTY Driver, NAND,

Software compiled for ARMv5TEJ instruction set(!) with EABI, no TLS yet.

이 goldfish는 qemu라는 virtual machine (vmware같은거) 안에서 동작되는 가상의 보드다.
qemu은 arm core를 에뮬레이트 해주게 되며 이 위에 goldfish향 linux가 동작된다.
당연히 이 linux 위에 안드로이드가 올라가게 된다.


cupcake? donet?
----------------------------------------
안드로이드 소스 관리 브랜치 버전
cupcake - 안정화 전의 android platform branch 중 하나
master - main branch
donut - android 1.5의 공식 release된 후의 branch


준비물
----------------------------------------
- windows xp
- virtual box 
  http://virtualbox.org
- ubuntu
  http://www.ubuntu.com


우분투 설치
----------------------------------------
virtual box를 설치한다.
우분투를 위한 하드 디스크를 만들어야 한다.
virtual박스에서 새로만들기.  
동적디스크로 한 후 20G로 잡고 cd 삽입에서 ubuntu.iso삽입후 설치
메모리 램을 511MB으로 잡아준다. (만일 컴퓨터가 좋으면 1G정도 잡아도 좋다)
사용자 이름을 bro로 잡았다. 이후 우분투 홈디렉터리는 /home/bro/로 사용된다.


virtual box 우분투 환경 만들기
----------------------------------------
기본화면인 800x600은 너무 좁다 아래처럼 해서 최적환경을 만든다.

우분투 부팅이 되면
virtualbox/주메뉴/장치/CD,DVD Devies/More CD/DVD Images...를 선택한후 
c:\program files\sun\virtualbox\VBoxAdditions.iso를 선택한다.
또는 virtualbox/주메뉴/장치/게스트 확장 장치 설치를 선택한다.
그러면 우분투 바탕화면에 VBoxAdditions cd가 추가되고 더블클릭 후 autorun.sh를 실행한다.
우분투를 꺼따가 다시 키면 꽤 괜찮아진다.


기본 라이브러리 설치
--------------------------
필요한 라이브러리 설치하기
컴파일 하기위해서 필요한 라이브러리를 한꺼번에 설치하자.
# sudo apt-get install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-

dev zlib1g-dev
# sudo apt-get install valgrind


자바 1.5 설치하기
---------------------------
안드로이드는 아직 자바 1.6을 지원하지 않는다. 그래서 1.5 를 설치해야 하는데 문제는 우

분투 9.10 에서는 자바 1.5 를 apt-get 으로 설치할수 없다는 것이다.
그래서 아래와 같은 방법이 필요하다.

시스템>관리>소프트웨어 소스를 선택하면 [소프트웨어 소스] 창이 뜬다.
여기서 기타 소프트웨어 탭에서 아래 와 같이 추가해 주자.
deb http://kr.archive.ubuntu.com/ubuntu/ jaunty multiverse
deb http://kr.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse

$ sudo apt-get install sun-java5-jdk

자바 설정 바꾸기 (현재 안해도 되는듯하다)
$ update-java-alternatives -s java-1.5.0-sun


환경변수 세팅
-------------------------
$ cd ~
$ mkdir bin
$ vi ~/.bashrc

export LANG=C
export PATH=/home/bro/bin:$PATH:.
export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun
export ANDROID_JAVA_HOME=$JAVA_HOME

터미널 껐다가 다시 실행

$ sudo -s


repo 설치
--------------------------
구글 안드로이드 소스를 받기 위해서 repo를 마련한다.
$ sudo apt-get install git-core gnupg       
$ curl http://android.git.kernel.org/repo > ~/bin/repo 
$ chmod a+x ~/bin/repo

$ mkdir mydroid
$ cd mydroid

$ repo init -u git://android.git.kernel.org/platform/manifest.git


안드로이드 소스 받기
---------------------------
$ cd ~/mydroid
$ repo sync


안드로이드 빌드 하기
---------------------------
이러면 안드로이드도 빌드되고 커널도 빌드된다 커널은 디폴트로 armv5tle로 컴파일됨
안드로이드용 linux 이미지 및 arm용 target compiler 모두 ./mydroid/prebuilt에 존재.

$ make


결과 확인하기
---------------------------
$ cd out

out 디렉토리에 build된 안드로이드 full package가 위치하게 됩니다.
~/mydroid/out/target/product/generic/ramdisk.img
~/mydroid/out/target/product/generic/system.img
~/mydroid/out/target/product/generic/userdata.img

에뮬레이터 띄워보기
-------------------------------------------------
안드로이드에 prebuilt된 리눅스 zImage와 아까 만든 out의 세개 img를 사용하여
에뮬레이터를 띄워볼수 있다. 물론 에뮬레이터도 이미 내장되어 있다.
$ cd ~/mydroid/out/target/product/generic
$ cp userdata.img userdata-qemu.img
$ cd ~/mydroid
$ ./out/host/linux-x86/bin/emulator -system out/target/product/generic -kernel prebuilt/android-arm/kernel/kernel-qemu
기다리면 창이 뜨면서 ANDROID 로고 나오다가 화면이 나온다.

goldfish 리눅스 커널 다운받기
-------------------------------------------------
리눅스 커널에 디버그 옵션을 더 넣거나 수정한 리눅스로 에뮬레이터를 돌리려면
goldfish용 리눅스를 받아서 빌드해야한다.
먼저 gi clone을 위해서 mydroid위치로 들어가야한다.

$ cd ~/mydroid
$ git clone git://android.kernel.org/kernel/common.git kernel-goldfish
$ cd kernel-goldfish
$ git branch -r
  origin/HEAD
  origin/android-2.6.25
  origin/android-2.6.27
  origin/android-2.6.29
  origin/android-goldfish-2.6.27
  origin/android-goldfish-2.6.29
$ git checkout --track -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29
$ export ARCH=arm
$ export CROSS_COMPILE=/home/qt/android.blee/prebuilt/linux-x86/toolchain/arm-eabi-4.3.1/bin/arm-eabi-
$ make goldfish_defconfig ARCH=arm CROSS_COMPILE=/home/bro/mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
$ vi .config
연다음 DEBUG_INFO로 찾아내서 아래와 같이 만듦 (커널 디버깅 정보 포함)
CONFIG_DEBUG_INFO=y
$ make ARCH=arm CROSS_COMPILE=/home/bro/mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-

eabi-4.2.1/bin/arm-eabi-


에뮬레이터 실행 (with dbg 디버깅)
-------------------------------------------------

$ cd ~/mydroid
$ ./out/host/linux-x86/bin/emulator -show-kernel -system out/target/product/generic -kernel kernel-goldfish/arch/arm/boot/zImage  -logcat *:v -qemu -monitor telnet::4444,server -s
하면 대기 상태가 된다.

다른 터미널을 띄워서 
$ telnet localhost 4444
한후 바로 아래 처럼 stop을 입력한다.
(qemu) stop
이 창은 이제 그냥 냅둔다.

다른 터미널을 띄워서
$ cd ~/mydroid
$ ./prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gdb kernel-

goldfish/vmlinux
디버거 실행후 (no debugging symbols found)라고 안나와야 한다.

(gdb) br sys_open (브레이크 포인트 추가)
(gdb) br start_kernel (이거는 위에 stop을 얼마나 빠르게 치느냐에 의존한다--)
(gdb) target remote localhost:1234
(gdb) c
하면 start_kernel에서 운이좋으면 멈추고 -_-.
sys_open이 호출될때 알아서 멈춘다.


ddd로 디버깅하기
-------------------------------------------
$ sudo apt-get install ddd

$ cd ~/mydroid
$ ./out/host/linux-x86/bin/emulator -show-kernel -system out/target/
product/generic -kernel kernel-goldfish/arch/arm/boot/zImage  -logcat *:v -qemu
-monitor telnet::4444,server -s
하면 대기 상태가 된다.

다른 터미널을 띄워서 
$ telnet localhost 4444
한후 바로 아래 처럼 stop을 입력한다.
(qemu) stop
이 창은 이제 그냥 냅둔다.

다른 터미널을 띄워서
$ cd ~/mydroid
$ ddd --debugger ./prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gdb

kernel-goldfish/vmlinux
(gdb) br sys_open (브레이크 포인트 추가)
(gdb) br start_kernel (이거는 위에 stop을 얼마나 빠르게 치느냐에 의존한다--)
(gdb) target remote localhost:1234
(gdb) c
하면 start_kernel에서 운이좋으면 멈추고 -_-.
sys_open이 호출될때 알아서 멈춘다.


문제 해결
------------------------------------

안드로이드 컴파일하는데 classes.dex에서 멈춤
-------------------------------------------------------
오후 6:18 2010-03-30
make: *** [out/target/common/obj/JAVA_LIBRARYES/framework_itnermediates/classes.dex

Killed
=> 메모리가 모자름 Virtual box에서 메모리를 1024램으로 올려줌.
=> 비됴메모리 2M, 메모리 600M로 테스트 중. (익스플로러프로세스죽이고, 테마없애고, 바

탕화면도 없앰--), 중간 중간 virtual box가 일시중지 (메모리 부족,스왑하는듯)되면 기다

렸다가 스왑끝나면 다시 주메뉴 머신/다시 시작을 누르기 반복)
원래는 10기가 하드에 1.5기가 램을 요구한다는데..
=> 집에서 511MB를 잡아서 했는데 classes.dex 넘어간다.


하드 디스크를 넘 적게 잡았을 때
-------------------------------------------------------
오후 7:49 2010-03-30
vdi 사이즈 조절
virtualbox 주메뉴/파일/disk manager 실행
new로 새로운 디스크 생성
리눅스 파티션 관리프로그램 GParted가 있는 CD를 CD에 설정
기존vdi를 IDE primary master로 설정
생성한 vdi를 IDE primary slave로 설정
씨디 부팅후 GParted실행한 후 기존 vdi를 선택후 복사 한 후(왼편상단의 콤보박스이용) 생

성한 vdi로 paste하고
오른클릭후 manage flag를 선택후 플래그를 boot을 선택해 줌.


방화벽 안에 있어서 repo안될때 repo proxy 설정
--------------------------
만일 repo가 실행 안되고 timeout된다면 proxy 설정을 해야 한다.
http://www.agroman.net/corkscrew/ 여기 들어가서 다운받은 후

$ tar zxvf  corkscrew-2.0.tar.gz 
$ cd corkscrew-2.0 
$ ./configure 
$ make

한 후 
$ cp corkscrew ~/bin
$ vi ~/bin/git-proxy

파일 내용은 아래 두줄 추가 아래 프록시 주소랑 포트를 넣음
#!/bin/sh 
exec /home/bro/bin/corkscrew 12.34.56.12 8080 $*

그런 후 아래처럼 git 프록시 설정을 한 다음
$ git config --global core.gitproxy '/home/bro/bin/git-proxy' 
$ chmod +x ~/bin/git-proxy

그런 후 다시 repository 설정을 한다.
$ cd ~/mydroid
$ repo init -u git://android.git.kernel.org/platform/manifest.git


오후 1:03 2010-04-01
----------------------------------------------------------
15G로 하드 잡고 하고 있는데, 안드로이드 다 컴파일하고 나니 3.5G밖에 안남았다.
지금 리눅스 다운받고 있는데 걱정 -_-..
다행히 다 잘된다.


오후 7:58 2010-04-01
실수로 ddd의 폰트를 작게 했을때
-----------------------------------------------------------
기본이 120인데 잘못해서 10으로 바꾸면 깨알같아서 보이지도 않는다.
vi ~/.ddd.init
에서 폰트 찾아서 숫자를 바꿔준다.


오후 9:25 2010-04-01
classes-full-debuger.jar Error 41
-------------------------------------------------------------
make: *** [out/target/common/obj/JAVA_LIBRARIES/core_intermediates/classes-full-debug.jar] Error 41
기존 설치 되어 있는 java,javac 때문에 발생되는 에러로 아래를 실행해보도록 한다.
$ update-java-alternatives -s java-1.5.0-sun
그리고 다시 make clean; make로 실행해본다.
오전 1:35 2010-04-05
위처럼 해도 안된다. 아무래도 첨에 apt-get할때 sudo 를 앞에 안붙여서 그런건 아닌가 의심해보고 있다.

댓글 1개:

  1. 안녕하세요!

    질문이 있어서 이렇게 올립니다.

    KVM- QEMU 상에서 androidx86을 올렸을때

    해상도를 조정하는 환경설정이나 실행시 조건이있나요!?

    답글삭제