티스토리 뷰

728x90

 안드로이드 Full source를 다운 받아서 PDK 개발을 진행할 수 있습니다. PDK는 Platform Developer's Kit의 약자로써 안드로이드 전체 소스코드 내에서 플랫폼의 프레임워크를 개발하거나 SDK, NDK를 모두 개발 할 수 있습니다. 각각 간단하게 정의하면 SDK는 안드로이드를 Java로 개발하는 것이고, NDK는 Java와 C/C++을 이용하여 개발하는 것입니다.

 PDK를 개발하기 위한 과정으로 안드로이드 전체 소스코드를 다운 받아서 진행해야 합니다. 이 전체 소스코드를 다운 받는 방법은 AOSP(Android Open Source Project)에 잘 설명되어 있습니다.



현재 PDK및 안드로이드 빌드를 위한 환경

 저는 Ubuntu 를 이용하여 안드로이드 빌드를 진행하였습니다. 최근 권장하는 안드로이드 빌드 환경으로 Ubuntu 12.04 버전을 추천하고 있습니다. AOSP 홈페이지에서도 12.04 64 bit를 기준으로 빌드 환경 구성에 대해서 가장 잘 설명하고 있습니다.

 저는 가상 머신을 이용하여 환경을 구성하고, Ubuntu 12.04 64 bit 환경을 기준으로 설명합니다. AOSP 버전으로 4.4.2 버전을 다운 받아 빌드하였습니다.


 사용 OS : Ubuntu 12.04 64bit

 아래 링크를 통해서 Virtualbox에 ubuntu 설치하기를 따라하실 수 있습니다.

 Virtualbox Ubuntu 12.04 설치하기http://thdev.net/237


 가상 머신 환경 : 2 GB 메모리, 40 GB 이상의 디스크 공간 정도면 충분한것 같습니다. 메모리는 꼭 2 GB 이상이면 좋습니다.

                        make 시에 상당한 메모리를 사용하고 1 GB로 진행하였을 경우 메모리 부족 오류가 발생하였습니다.

 JDK : JDK 1.6(진저브레드 이상은 JDK 1.6을 요구하고, 프로요 이하는 JDK 1.5를 요구합니다.)

 Git : 1.7

 Python : 2.6

 GNU Make : 3.81

 GCC의 경우 ubuntu 12.04를 설치하면 4.6 버전이 설치되어 있습니다.


빌드 환경 구성

 빌드 환경 구성으로 AOSP 홈페이지에 설명되어 있는 프로그램을 다운 받아 설치하면 됩니다. 설치 중에 이미 설치되어 있거나, 약간 다른이름이 존재할 수 있습니다. 아래가 1줄의 명령어이지만 1개씩 설치하는걸 추천합니다.

 빌드 환경 구성 : http://source.android.com/source/initializing.html


Java 설치

 Java의 경우 AOSP 홈페이지의 설명으로는 설치가 불가능합니다. Ubuntu에서 기본 패키지에서 빠져서 아래와 같이 설치해야합니다. 그리고 오픈 JDK로는 안드로이드 빌드가 되지 않습니다.

sudo add-apt-repository ppa:webupd8team/java

sudo apt-get update

sudo apt-get install oracle-java6-installer


 만약 java가 6, 7이 두개가 설치되어 있는 경우가 있을 수 있습니다. 아래 명령어를 통해서 java 6으로 변경하시면 됩니다.

sudo update-alternatives --config java


를 실행하시고, java 6 버전으의 숫자를 입력하시면 됩니다.

출처 : http://askubuntu.com/questions/272187/setting-jdk-7-as-default


빌드용 프로그램 설치

 빌드에 필요한 프로그램은 아래와 같습니다. 상당히 많이 존재하는데 가능하다면 1개씩 설치하시길 권장드립니다. 이미 설치되어 있으면 아래 명령어가 안먹히는 경우가 있습니다.

$ sudo apt-get install git-core gnupg flex bison gperf build-essential \

  zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \

  x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \

  libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \

  libxml2-utils xsltproc


Java Path 등록

 아래와 같이 Java Path를 등록해야 합니다. JAVA_HOME의 경로는 아래와 같은 경로가 아닐 수 있으니 직접 경로를 확인하신 다음 등록하시기 바랍니다.

vi ~/.bashrc에 등록한다.

# Java Setting

export JAVA_HOME=/usr/lib/jvm/java-6-oracle

export ANDROID_JAVA_HOME=$JAVA_HOME


안드로이드 4.4.2 다운로드

 빌드환경 구성이 끝났습니다. 어렵지 않게 간단하게 환경을 구성할 수 있습니다. 안드로이드 4.4.2를 빌드하기에 가장 적합한 환경으로 Ubuntu 12.04 64 bit가 가장 좋다고 생각하고, 실제로 문제 없이 빌드가 된 환경이라서 위와 같이 구성하였습니다. 이제 환경 구성이 끝났으니 안드로이드 Full Source를 다운 받아야겠습니다. 저는 안드로이드 4.4.2 최신버전을 다운로드 받았습니다.

 안드로이드 소스코드 다운로드 방법http://source.android.com/source/downloading.html


 아래 링크를 통해 안드로이드 버전과 기기 정보를 확인하신 후 다운로드 주소가 변경될 수 있습니다.

 안드로이드 버전 확인 : http://source.android.com/source/build-numbers.html


Installing Repo 설정

 repo를 등록할 임시 폴더를 생성합니다. 저는 ~/ 아래에 bin 폴더를 생성하였습니다. mkdir ~/bin 명령으로 bin 폴더를 생성하고, PATH 등록하였습니다. 여기서 PATH를 등록하지 않으시면 풀 소스 다운로드시에 진행이되지 않습니다. 진행 중에 경로를 찾지 못한다는 오류가 난다면 여기의 PATH 등록이 되지 않은것이므로 PATH 등록을 다시해주시면 됩니다.

1. bin 폴더 생성

$ mkdir ~/bin

$ PATH=~/bin:$PATH


Repo 등록

 안드로이드를 다운받을 repo를 등록하고 권한을 a+x 권한을 주면 됩니다. 바로위에서 생성한 ~/bin/ 아래 repo라는 폴더를 생성하여 repo 등록을 진행합니다.

$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo

$ chmod a+x ~/bin/repo


Android를 다운 받을 폴더 생성

 안드로이드를 다운 받을 폴더를 생성합니다. 이 폴더는 안드로이드 전체 소스코드가 다운 받아져야하는 폴더로 bin 폴더가 있는 곳에 아래와 같이 생성하셔도 됩니다. 아니면 원하시는 경로 상관 없이 생성하시면 됩니다.(Ubuntu이니 ~/ 폴더 아래가 좋습니다. / 폴더는 관리자 권한을 필요로 하니 피하는게 좋습니다.)

 저는 ~/temp 폴더를 생성하였습니다.

$ mkdir temp

$ cd temp


안드로이드 소스 다운로드

 이제 모든 설정이 끝났습니다. 안드로이드 Full Source를 다운 받으실 수 있는 환경이 구성되었습니다. repo init 명령어를 통해서 어느 주소에서 안드로이드 소스를 받을지를 지정하면 됩니다. 이후 sync 명령어를 통해서 소스를 다운 받으면 됩니다.


 여기서 중요한 init 명령어를 살펴보겠습니다.

 안드로이드 버전 확인http://source.android.com/source/build-numbers.html 에서 확인하고, 내가 필요로하는 Source를 다운 받을 수 있습니다. init 명령어를 아래와 같이 2가지로 사용할 수 있습니다.


 옵션의 -b를 지정하면 특정 소스코드를 다운 받게되고, -b를 지정하지 않으면 기본 소스코드를 다운 받습니다. 최신 버전을 받으실 것이라면 -b 옵션을 사용하시고, 안드로이드 버전 확인 페이지에서 버전 확인 후 진행하시면 됩니다. 현재 가장 최신은 android-4.4.2_r1 버전으로 Nexus 4, 5, 7, 10용입니다.

repo init -u https://android.googlesource.com/platform/manifest

또는

repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1


 repo sync를 진행합니다. 진행하는 방법은 2가지입니다. -j 옵션을 지정하면 다중 다운로드가 됩니다. 다중 다운로드를 진행하므로 다운로드 속도는 그냥 sync 보다 빠릅니다. 그만큼 메모리를 많이 차지하니.. 적당한 옵션을 지정하여 사용하시면 됩니다.

repo sync

또는

repo sync -j3


 다운이 완료되면 아래와 같습니다. 총 407개의 리스트를 각각 다운로드 완료하면 됩니다. 중간에 중단되신다면 repo sync 명령으로 다시 진행이 가능합니다.




Android 4.4.2 빌드

 안드로이드 4.4.2 빌드를 하기 위한 환경이 모두 끝났습니다. repo sync를 통해서 다운 받은 소스코드를 확인하실 수 있습니다. 다운 받은 소스코드를 make 명령어를 통해서 빌드할 수 있지만.. 4.4.2에는 GCM이 비어있어서 오류가 발생하더군요. GCM을 다운 받고 복사한 후에 make를 진행하도록 하겠습니다.


GCM 다운로드 및 폴더 생성

 GCM 다운로드는 :http://stackoverflow.com/questions/16385927/building-aosp-4-2-2-on-ubuntu-12-10-x64-fail 을 참고하여 작성하였습니다.

 GCM 코드는 안드로이드 Full source에 포함되어 있지 않습니다. 더군다나 폴더가 vendor 아래에 포함되어 있더군요. 그래서 아래와 같이 GCM 소스코드 다운로드 방법을 함께 추가하였습니다.

 GCM 소스 다운로드 : https://code.google.com/p/gcm/source/checkout


 다운 받은 안드로이드 temp 폴더에서 아래 명령어를 입력합니다. vendor/unbundled_google/libs 폴더를 생성하고 이동합니다.

$ mkdir -p vendor/unbundled_google/libs

$ cd vendor/unbundled_google/libs


 libs 폴더에서 아래 명령을 이용해 gcm 소스코드를 다운 받습니다.

git clone https://code.google.com/p/gcm/


Android 명령셋 등록

 안드로이드에서 제공하는 명령셋을 등록합니다. 추후 mm 등의 명령어를 사용할 때 필요로 합니다.

$ source build/envsetup.sh

또는

$ . build/envsetup.sh


make

 최종적으로 make를 진행할 수 있는 환경이 만들어졌습니다. 이번글에서는 make까지 진행하는 작업을 하므로 아래와 같이 마지막 명령어를 진행합니다.

 역시 repo sync 명령어와 마찬가지로 -j 옵션을 통해서 추가 쓰레드를 진행할 수 있습니다. 가상 머신을 기본값으로 하셨다면 -j3이 적당해보입니다. 기본적으로 자신의 CPU Thread 수만큼 지정해주시는게 가장 좋은 성능을 보입니다.

 적당한 멀티 쓰레드 수는 Cores(실제 코어) * 1.1 을 해주는 값이 적당하다고 합니다. i7의 경우는 실제 코어가 4개이니 4 * 1.1의 4 또는 5가 적당하고 i5는 2 * 1.1 = 3 또는 2가 적당한값 같습니다.

$ make

또는

$ make -j3


마무리

 안드로이드 AOSP 홈페이지에 모두 설명이 잘되어 있지만 저는 Android 4.4.2를 Ubuntu 12.04 64 bit 가상 머신 환경에서 진행하는 방법을 설명하였습니다. 그냥 Ubuntu를 설치된 환경이라도 똑같은 코드를 통해서 진행할 수 있습니다. 참고로 Ubuntu 12.04 이상의 버전에서 하였을 경우 풀 소스 make 시에 오류가 날 수 있다는 점 주의하시기 바랍니다. 검색하면 오류가 나는 이유가 대부분 자세하게 나와있으며 해결 방법 역시 잘 나와있습니다.

 저는 위의 환경에서 위와 같은 방법으로 했을 때 오류 없이 진행할 수 있었습니다. 일단은 완벽한 환경으로 위와 같이 진행할 수 있었기에 흔적을 남겨두려고 작성하는 글입니다. 만약 진행 상 오류가 있으시다면 질문 주시면 확인을 해보도록 하겠습니다.

 이상입니다.



댓글