Linux

안드로이드 풀 소스 빌드 (android full source build)

raulyo 2013. 2. 20. 12:58

안드로이드 소스를 가져와서 빌드하는 일은 아는 사람에겐 매우 쉽고 모르는 사람에겐 어려운 일입니다. 구글이 repo라는 특이한 도구를 사용하고 있기 때문에 그렇습니다. repo는 구글이 만들었는데, 리누스 토발즈가 만든 DVCS Git을 응용하는 도구입니다. repo가 하는 일을 정리하면 다음과 같습니다.

  1. 복수개의 저장소(repository)에서 원하는 버전을 가져와서 지정된 디렉토리에 저장합니다. 예를 들어 platform/bionic.git은 ./bionic/에 저장됩니다. 어떤 저장소가 어떤 디렉토리에 저장될지는 platform/manifest.git에 있는 default.xml 파일 안에 약속이 되어 있습니다. 이 절차를 통해 우리는 빌드에 필요한 모든 파일트리를 얻게 됩니다.

  2. 우리가 브랜치를 만들어서 작업할 때 저장소 각각에 브랜치를 만들어서 관리를 해줍니다. gingerbread 브랜치를 가져와서 saenggangbbang이라는 우리만의 버전을 만들 수 있습니다. 만약 160개가 넘는 저장소에 각각 브랜치를 만들어야 한다고 어떻게 하시겠습니까?

  3. 수정한 코드 묶음(패치)을 Android Review 사이트에 올려줍니다. 여러 저장소에서 딱 우리가 수정한 내용만을 묶어 구글에 전송하는 것입니다. 구글의 코드 리뷰와 질의를 통과하면 구글 안드로이드에 우리 코드를 추가할 수 있게 됩니다.

repo가 여러가지 용도로 사용될 수 있지만 이번에는 1번: 복수개의 저장소에서 원하는 버전을 가져오기에만 관심을 가지겠습니다. 우리는 안드로이드를 빌드만 해볼겁니다.

무엇보다 먼저 우리 지금 우분투 리눅스를 쓰고 있는 것이 맞죠? 그렇지 않다면 조금 어렵거나 짜증납니다. 적어도 가상머신에라도 우분투를 설치하시는 것을 추천합니다.

안드로이드 기반의 임베디드 환경을 스터디하기 위해서는 우분투 리눅스 기반에서 작업이 진행되어야 합니다. 그 이유는 안드로이드가 리눅스 커널에 기반하고 있으며, 그 중에서도 구글에서 우분투 리눅스를 권장하고 있기 때문입니다. (자세한 이야기는 구글 개발자 사이트를 참고하시기 바랍니다.)

이번 포스팅에서는 우분투 리눅스 기반에서 소스코드를 다운로드 받아서 빌드하는 과정을 알아보도록 하겠습니다.


#01. 선행조건

이 포스팅의 내용을 수행하시기 위해서는 우분투 리눅스 환경에서 JDK가 설치되어 있어야 합니다. 저는 VMWare8 상에서 우분투 리눅스 11.10을 설치하였으며 JDK6 버전을 설치하였습니다. 해당 과정에 대한 내용은 다음의 포스팅들을 참조하시기 바랍니다.

우분투 리눅스 설치를 위한 VMWare8 가상머신 생성
우분투 리눅스 기본설정으로 설치하기
리눅스 관리자(root) 패스워드 지정
우분투 리눅스에 JDK6 설치하기 (11.10 기준)

1)ubuntu 11.04

sudo add-apt-repository ppa:ferramroberto/java

sudo apt-get update

sudo apt-get install sun-java6-jdk

2) ubuntu 12.04

sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy main multiverse"
sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy-updates main multiverse"
sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
sudo apt-get update
sudo apt-get install sun-java6-jdk

이걸 구체적으로 알아보려면 다음과 같이 확인해볼 수 있다.

 sudo update-alternatives --config java

1,2,3 과 같이 여러 개가 나오면

 java-6-sun 이름이 있는 것으로 선택을 바꿔준다.

sun용 자바를 디폴트로 해준다. openjdk는 빌드가 안됨




JDK7은 지원하지 않습니다. 처음에 JDK7을 설치한 상태에서 진행했다가 지원하지 않는기 때문에 JDK6이 필요하다는 에러메시지를 만나서 JDK를 재설치 하고 다시 진행했습니다.



#02. 빌드를 위한 패키지 다운로드

우분투 리눅스는 기본적으로 데스크탑 환경에 맞추어진 운영체제이기 때문에 소스코드를 빌드하기 위한 패키지는 포함되어 있지 않습니다. 선행조건에 따라서 JDK까지 설치가 된 후에는 추가적으로 빌드를 위한 패키지들을 다운받아 설치해야 합니다. 다음의 명령어를 입력하면 빌드를 위한 추가 패키지들을 다운로드 받을 수 있습니다.

1) ubuntu 11.04

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 ant gcc-multilib g++-multilib lib32z1

2) ubuntu 12.04

    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 ant gcc-multilib g++-multilib lib32z1 libxml2-utils




계속하겠다는 의미로 "Y"키를 입력한 이후부터는 패키지 다운로드 및 설치까지 약 30~60분 정도의 시간이 소요됩니다. 아래 화면은 설치가 완료된 화면입니다.





 

#03. 안드로이드 소스코드 다운로드 하기

안드로이드 소스코드 다운로드 작업을 진행할 디렉토리를 사용자 홈디렉토리 안에 bin이라는 이름으로 생성합니다.

cd
mkdir ./bin


 





curl 명령을 사용해서 repo 스크립트를 지정해 놓은 디렉토리에 repo라는 파일이름으로 받아 놓습니다. repo 스크립트는 git 분산 코드 관리시스템으로 저장되어 있는 안드로이드 코드를 한꺼번에 다운로드할 때 사용합니다.

curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ./bin/repo


 





다운로드가 완료된 후에는 실행 가능하도록 퍼미션을 조정합니다.

chmod a+x ./bin/repo


 





이제 스크립트를 내려받은 bin 디렉토리로 이동하여 repo 스크립트를 초기화시켜 다운받을 준비를 완료합니다.초기화 과정의 맨 끝에 -b 옵션과 함께 다운로드할 안드로이드의 프로젝트 코드 이름을 적어줍니다. 여기서 다운로드 받을 진저브레드의 코드명은 gingerbread 입니다.

cd bin
~/bin/repo init -u https://android.googlesource.com/platform/manifest -b gingerbread


 





일련의 과정을 거쳐서 명령어 수행후에 이름과 이메일주소 그리고 색상에 대한 몇가지 질문을 합니다. 적절히 응답하시면 소스코드를 다운로드 받기 위한 스크립트의 초기화가 완료됩니다.





이제 소스코드를 다운로드 받는 명령어를 수행합니다. 안드로이드 소스코드의 전체 크기는 약 2.6G 정도를 차지하며, 다운로드 하는 데에는 상당한 시간이 소요되므로 명령을 내린 후에는 다른 작업을 하시는 것이 좋습니다.

~/bin/repo sync


다운로드가 완료된 화면입니다. 이 화면을 보기까지 약 2시간 정도 소요되었습니다.




ls 명령어로 다운로드 받은 파일들을 확인합니다.






 

#04.안드로이드 소스 코드 컴파일하기

안드로이드 코드를 다 내려받았으면 컴파일을 시도해 볼 차례입니다. 안드로이드 코드를 다운로드받은 디렉토리안에서 다음의 명령을 내립니다.

source build/envsetup.sh


 





다음과 같이 명령을 내리면 컴파일 메뉴가 나타납니다. 에뮬레이터 이외에 두 개의 레퍼런스 Android Phone 용으로 빌드할 수 있습니다. 하나는 Nexus-One이고 다른 하하는 비교적 최근에 발표된 Nexus-S 입니다. 1번을 선택하면 안드로이드 에뮬레이터용으로 빌드됩니다. 4번을 선택할 경우에는 Nexus-One용, 5번을 선택할 경우에는 Nexus-S용으로 빌드됩니다.

lunch


 




여기까지 모든 설정을 마치면 이제 최종적으로 컴파일을 수행하면 됩니다. 컴파일에 사용되는 명령어는 make 입니다. 컴파일에 걸리는 시간은 CPU의 성능과 물리적으로 설치된 메모리의 크기에 좌우되지만 보통 듀얼코어 데스크톱 컴퓨터의 경우 대략 2~3시간 정도 소요됩니다. 쿼드 코어 CPU와 다량의 램을 장착하면 시간을 많이 단축할 수 있습니다.

만약에 램이 1기가 이하라면 실패할겁니다. 혹시 가상 머신을 쓰신다면 메모리 사용량을 올려주시고 아니라면 지금 용산에 가세요.

명령어의 끝에 붙여주는 -j 옵션은 CPU가 여러개일 때 사용할 수 있는 분산 컴파일 옵션입니다. 컴파일 과정을 여러개의 CPU에 분배시켜 컴파일 속도를 높여줍니다. CPU 개수에 따라서 적절하게 숫자를 적어주면 됩니다.

make -j4


 




빌드가 완료되고나면 다음과 같이 out 이라는 디렉토리 생성됩니다.







안드로이드 컴파일 후 생성되는 이미지는 Eclipse + ADT 플러그인 조합으로 개발하는 안드로이드 SDK와 연동시켜 테스트하면 되고, Nexus-One 혹은 Nexus-S용으로 빌드된 이미지 파일은 안드로이드 해킹 사이트를 참고하여 실제의 기기에 넣어주면 됩니다.



#05. 빌드한 결과물로 에뮬레이터 실행하기

이제 빌드가 완료되었으면 안드로이드 에뮬레이터를 구동해 볼 차례입니다. 이 단계부터는 우분투 리눅스의 로컬상에서 진행하시기 바랍니다.

이 단계부터는 안드로이드 SDK및 이클립스가 설치되어 있어야 합니다. 우분투에서 안드로이드 SDK를 설치하는 과정은 다음의 포스팅을 참조하시기 바랍니다.

우분투 리눅스에 안드로이드 개발환경 구축하기


안드로이드 SDK안의 tools 디렉토리에 보면 emulator라는 프로그램이 있습니다. 이 프로그램을 사용하여 빌드의 결과물로 에뮬레이터를 생성해 낼 수 있습니다.

우선 빌드의 결과물이 저장되어 있는 디렉토리로 이동합니다. 앞에서 진행한 환경에 따라 저는 다음과 같이 디렉토리를 이동했습니다.

cd ~/bin/out/target/product/generic


그런다음 안드로이드 SDK안에 있는 emulator 프로그램을 이용하여 에뮬레이터를 구동시킵니다. 그러기 위해서는 먼저 자신의 환경에서 안드로이드 SDK가 어느 경로에 있는지를 확인하셔야 합니다.
명령어는 다음과 같습니다.

[자신의 Android SDK경로]/tools/emulator -system system.img -data userdata.img