안드로이드 프레임워크 빌드환경 구축 (14/03/13 확인)

|

이 글은 http://source.android.com/index.html 에 있는 내용을 기본으로 한다.


1. OS선택

진저브레드(2.3.x) 이상은 64비트 환경이 필요하다. 그 이전 버전은 32비트에서도 빌드가 가능하긴 하지만.... (라고 쓰여 있음)

그리고 가이드문서 자체가 우분투 12.04를 기준으로 하기 때문에 ubuntu Desktop 12.04 LTS로 결정합니다.


LTS는 Long Term Support Release. 현재 소개에는 2017년까지 지원된다고 나와있다.

다운로드는 http://www.ubuntu.com/download/desktop 이고,

설치 USB담는 방법은 http://www.ubuntu.com/download/desktop/create-a-usb-stick-on-windows 에서 참고.




2. 설치

는 그닥 어려울게 없으니 생략.

리눅스계열은 기본적으로 swap 파티션과 / 파티션만 만들어주면 끝.... swap은 가상메모리 개념으로, 보통 물리적 메모리의 두배 정도.

안드로이드 빌드를 하려면 30G 이상의 공간을 필요로 하니 VM에서 돌릴 경우 적당한 용량을 할당하면 된다.



3. 기본 환경 구축

설치해야 할 패키지가 상당히 많다.




어째 예전과 좀 바뀐 듯한 느낌...



패키지 설치는 어짜피 root 권한으로 해야하니 sudo -i 명령으로 아예 루트쉘을 만들어놓는게 편하다.


가이드 문서(위 캡춰)처럼 한방에 해도 되지만, 오류 발생시 원인 찾기가 힘드므로 한줄씩 끊어서...



# apt-get install git gnupg flex bison gperf build-essential
# apt-get install zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev
# apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386
# apt-get install libgl1-mesa-dev g++-multilib mingw32 tofrodos
# apt-get install python-markdown libxml2-utils xsltproc zlib1g-dev:i386



근데 libgl1-mesa-glx:i386 패키지를 설치할때 오류가 발생한다...




apt-get 으로 하면 보통 의존성 검사 하여 자동으로 설치 해주는데 이건 왜 안해주는건지.

그래서 필요하다는 패키지 먼저 설치를 해준다.


# apt-get install libgl1-mesa-dri:i386 libglapi-mesa:i386



당연한 말이지만, JDK도 필요함...

하지만 우분투 기본 repository에 있는 jdk는 openjdk.... 빌드시 openjdk는 사용 불가하다고 빌드 진행이 안됨...

Sun (지금은 오라클...)의 jdk를 설치해야 하는데 우분투 리파짓에는 EoL (End of License인듯) 로 인하여 없다.


설치된 버전 확인

# java -version


openjdk는 여기에 OpenJDK라고 뜬다. 오라클 자바는 오라클이라고 안뜸.


우분투 리파짓에 있는지 확인

# apt-cache search java6


아마 기본값이면 여기에 default-jdk랑 openjdk-java6만...


오라클 사이트에서 jdk6를 찾아 설치해줘도 되지만, 거기서 제공하는 bin 바이너리는 압축만 풀고 땡이라

좀 더 자동화되어있는 녀석이 필요함.


그러려면 oracle java를 받을 수 있는 리파짓이 있어야 하는데 아래와 같이 추가.


# add-apt-repository ppa:webupd8team/java
# apt-get update
# apt-cache search java6


apt-cache search 명령에서 oracle-java6-jdk 가 없거나 apt-get update도중 오류가 발생했다면

해당 위치가 더이상 제공이 안되는 상태...


현재 ppa:ferramroberto/java 에서도 제공이 되는데 언제 끊길지는 알수업ㅂ다.


그래서 인스톨러 첨부.



oracle-java6-installer_6u45.deb



# dpkg -i oracle-java6-installer_6u45.deb


명령으로 설치하면 되며, 이 파일은 바이너리가 아닌 인스톨러만 담고있다.

즉, 설치시 오라클 서버로 접속하여 바이너리를 받아온다는 뜻이고, 당연히 인터넷 연결이 있어야 하고 주소가 바뀌면 인스톨러가 안될 수 있음.



설치하고 환경까지 잡아줌.




수동으로 bin 파일을 받아 압축을 풀었다면 update-alternative 명령으로 추가를 하고, 기본값을 바꿔줘야 하는데....

여기에 설명하자면 길어지므로 구글링.





bin 파일은 이렇게 파일만 만들어주고 끝임. 환경설정 안해줌.






4. 소스 다운로드


공식 가이드는 이렇게 되어있다.


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


근데 뭐 repo 파일을 다른이름으로 해도 되고, 그냥 /bin 디렉토리에 넣어도 되고...

그냥 위 주소로부터 다운받은 파일에 실행권한만 있음 됨.



그리고 다운받을 디렉토리를 생성하고 그곳으로 이동. 예전 가이드엔 mydroid라고 되어있었는데

지금 보니 WORKING_DIR 이라고... 뭐 그건 각자 맘이니.


디렉토리로 이동한 후 초기화.


최신 마스터를 받으려면


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


특정 브렌치을 받으려면


$ repo init -u https://android.googlesource.com/platform/manifest -b [브렌치]


브렌치 목록은 위 주소 (https://~)를 브라우저 들어가보면 리스트가 있다.



이게 한번에 안되면 (받다가 중단하고 다른 브렌치를 받는 등) repo init 시 오류가 발생하는데

그럴땐 그냥 .repo 디렉토리 (숨겨져있음)를 날리고 다시 하면 된다.


repo init시 이름이랑 이메일 넣으라고 하는데

수정해서 커밋할거 아니면 그냥 엔터엔터엔터.


그리고


$ repo sync


실행. 실제 다운받는 작업. 꽤 오래 걸림.




5. 빌드


컴파일러 캐시는 씁시다. 몇번 해보니 쓰는게 낫긴 함....


$ export USE_CCACHE=1



각종 명령을 사용하기 위한 스크립트 실행


$ source build/envsetup.sh


또는


$ . build/envsetup.sh


그냥 스크립트 실행하는거임



빌드 타겟 지정





lunch 를 실행하면 위 항목이 조합된 형태로 선택지가 나오는데,

arm / maguro / panda 는 아키텍처로 실제 돌릴 보드나 AVD에서 돌릴거면 해당 AVD설정에 맞게 고르고

user / userdebug / eng 는 개발용이냐 배포용이냐를 선택하는거. 어짜피 개발용(디버깅용)일테니 eng가 붙은넘으로 선택하면 됨.



lunch를 실행 후에 빌드 시작


$ make -j4


-j 뒤에 붙는 숫자는 한번에 돌릴 태스크 갯수를 지정하는데,

이 숫자는 실제 하드웨어 스레드의 1~2배수를 지정해주면 됨.


쿼드(4)코어에 하이퍼스레딩(x2) 이 지원되는 cpu라면 4 * 2 = 8 이므로 -j8이나 -j16으로 돌려주면 됨.


알겠지만, 빌드중에는 거의 cpu 100% 이므로 다른거 돌리는건 비추

어짜피 딴거하면 느려터져서 할 마음도 안듬




빌드가 완료되면 out 디렉토리가 생기고, 여기에 빌드중 만들어지고 사용되는 각종 파일들이 위치함 (class, jar 등)

다시 클린빌드를 하려면 make clean 후 빌드를 하거나 그냥 out 디렉토리 날리고 빌드하면 됨.




덧.

12.04에서 ICS를 빌드하는 경우 이런 오류가 발생한다.


ERROR: :0:0: error: "_FORTIFY_SOURCE" redefined [-Werror]


ERROR: external/gtest/src/../include/gtest/internal/gtest-param-util.h:122:11: error: 'ptrdiff_t' does not name a type


ERROR: external/oprofile/libpp/format_output.h:94:22: error: reference 'counts' cannot be declared 'mutable' [-fpermissive]


ERROR: frameworks/compile/slang/slang_rs_expert_foreach.cpp:247:23:error: variable 'ParamName' set but not used [-Werror=unused-but-set-variable]


ERROR: Numerous pthread errors w/llvm: Example: external/llvm/lib/Support/Threading.cpp:96: undefined reference to 'pthread_create'



환장하는건 이 오류들이 한번에 나는게 아니라 하나 수정하고 빌드 돌리면 하나 뜨고 또 수정하고 돌리면 또 하나 뜨고 이런식인거다

안그래도 빌드 돌리는데 겁나 오래 걸리는데...


그냥 빌드만 정상적으로 끝나면 된다 하면 오류 소스 고쳐서 돌리면 되고

(맨 위에껀 redefine 한거 빼주면 되고, 나머지는 멀티스레드 관련 define을 undef 해주면 되긴 한다)


근본적인 해결 방법은 아래와 같다.


우분투 12.04에 기본적으로 설치된 gcc와 g++은 4.6이다 (확인방법은 gcc -version)


소스는 4.4 기준이라 오류가 발생하는 것.


apt-get 으로 gcc-4.4와 g++-4.4 를 설치해주고

gcc-4.6 과 g++-4.6을 삭제하거나,

/usr/bin/gcc 를 /usr/bin/gcc-4.4로 링크,

/usr/bin/g++ 를 /usr/bin/g++-4.4 로 링크해주면 된다.


# rm /usr/bin/gcc
# rm /usr/bin/g++
# ln -s /usr/bin/gcc-4.4 /usr/bin/gcc
# ln -s /usr/bin/g++-4.4 /usr/bin/g++



And