최근 Android에서 Miracast의 User Input Back Channel을 구현하여 양방향 제어 솔루션 프로젝트를 진행하였습니다.
그러면서 프레임워크를 수십번 받고 수천번(?)은 조금 과장일지라도...하여튼 많이 빌드하였습니다..ㅎㅎ 이 때 얻은 팁들을 공유하려고 합니다.
굉장히 바쁜데 진행하느라 힘들었던(?) 프로젝트였는데.. 프로젝트 소개는 다음 번에 동영상과 같이 소개하도록 하겠습니다. :)
어쨌든 오늘 주제는 Android Framework 환경 구축과 빌드에 대해서 진행하겠습니다.
프로젝트를 진행하면서 AOSP에서 Android Framework를 내려받아 tweak 및 새로 구현하여 빌드하였던 적이 있습니다.
이 때 필요한 빌드 환경 구축과 빌드시 유용하고 필요한 팁들을 정리해보려고 합니다.^^
그럼 빌드 환경 구축을 시작하겠습니다.
본 환경 구축은 https://source.android.com/source/initializing.html 을 참조하였습니다.
빌드 시스템은 다음과 같습니다.
CPU : Intel i7-3770@3.4Ghz
RAM : DDR3 8GB Memory
Host OS : Linux Ubuntu 12.04 LTS 64bit (32bit환경에서는 Build가 되지 않습니다.)
Target Device : Nexus5(LG-D850) 에서 진행하였습니다.
아무래도 대규모 컴파일을 진행하다보니 빠른 CPU와 고용량 메모리가 필요합니다.
그러나 가장 중요한 것은 넉넉한 시간과 마음가짐이면 되겠네요 ㅎㅎ
최신 Ubuntu LTS는 14.04버전입니다. 구글에 의하면 Ubuntu 14.04LTS에서도 테스트가 완료되었으며 간혹 예기치 않은 문제가 발생할 수도 있다고 합니다만, 테스트 해봤을 때 크게 문제가 있진 않았습니다. ^^ 그러나 전통적으로 12.04LTS에서 해왔기에 여기서는 12.04LTS를 기준으로 설명하겠습니다.
14.04LTS에서는 중간에 Install해야하는 package가 조금 다른데 그것만 말씀 드리겠습니다 :)
1. JDK설치
먼저 JDK 설치가 필요합니다. 현재 master branch인 (branch 개념은 뒤에서 설명하겠습니다.)
Lolipop(5.x)에서는 Java7버전이 필요하며 그 이하 버전인 GingerBread(2.2.x) ~ Kitkat(4.4.x)이하에서는 Java6버전이 필요합니다.
(Cupcake ~ Froyo에서는 Java5가 필요합니다만 아마 Cupcake를 빌드하실 분은 없으시라 생각됩니다 ㅎㅎ)
Java7설치는 터미널에서 다음과 같은 명령어를 입력하여 openjdk를 설치하여 줍니다.
$ sudo apt-get update
$ sudo apt-get install openjdk-7-jdk
이어서 환경 변수에 Java의 경로 설정을 위해 다음과 같이 입력하여 줍니다.
키캣이하의 버전을 빌드하기 위해서는 Java6버전을 설치하여야 합니다.
Java6버전은 Oracle Download site에서 다운로드 받으셔야 합니다. 다만 가입하시고 로그인해야 다운로드가 가능합니다.
구글링을 잘 해보시면, jdk-6u45-linux-x64.bin 이름을 가진 JDK6u45를 받으실 수 있습니다.^^
그 후 바이너리에 chmod a+x jdk-6u45-linux-x64.bin 를 입력하여 권한을 주고 ./jdk-6u45-linux-x64.bin 로 실행하시면 설치를 할 수 있습니다.
2. package설치
이제 빌드에 필요한 패키지들을 설치합니다.
여기서 Ubuntu 버전에 따라 설치하는 패키지가 조금 다르니 확인하시고 설치하시기 바랍니다.
Ubuntu 14.04를 사용하시면 아래와 같이 입력하셔서 패키지를 설치하시면 됩니다.
$ sudo apt-get install bison g++-multilib git gperf libxml2-utils make zlib1g-dev:i386 zip
Ubuntu 12.04를 사용하시면 좀 더 많은(?)패키지를 설치해야 합니다.
$ sudo apt-get install git gnupg flex bison gperf build-essential \
zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
libgl1-mesa-dev g++-multilib mingw32 tofrodos \
python-markdown libxml2-utils xsltproc zlib1g-dev:i386
$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
명령어를 잘 보시면 처음에는 apt-get을 root권한으로 실행하여 zlib1g-dev:i386패키지 까지 설치합니다.
그 다음 심볼릭링크로 libGL.so파일을 링크 거는 것입니다 :)
Ubuntu 11.10이하 버전의 설치 방법도 따로 존재하지만 필요하시면 구글 개발자 사이트에서 확인하시면 됩니다 :)
3. ccache 설정 (옵션)
ccache설정 방법입니다. 말머리와 같이 꼭 설정하지 않아도 빌드하는데는 무방합니다. :) 따라서 바로 4번으로 가셔도 됩니다만 한번쯤 읽어보세요 ㅎㅎ
또한 프레임워크 소스를 다운로드 후에 설정하셔야 합니다. 그 전에는 캐시를 설정할 수 있는 바이너리가 존재하지 않습니다 ㅎㅎ
ccache는 안드로이드 프레임워크 빌드에서만 사용하는 것이 아니라 대규모 컴파일시에 자주 사용하는 기능입니다.
결론부터 말씀드리면 사용하실 경우 더 빨리 빌드가 가능합니다. 다만 말그대로 cache를 해놓기 때문에 용량을 많이 차지합니다 ㅎㅎ
방법은 빌드 오브젝트를 캐싱해놓고 변화된 파일을 체크하여 새롭게 빌드합니다. 따라서 make clean을 하여도 따로 캐싱해놓기 때문에 빠른 빌드가 가능합니다.
(이 기능은 안드로이드 프레임워크 빌드시스템에서 지원하는 부분 빌드와는 다릅니다 :))
설정을 위해서 bashrc를 오픈합니다.
vim ~/.bashrc
bashrc파일 맨 아래에 export USE_CCACHE=1 를 추가하여 CCACHE를 ON해줍니다.
또한 CCACHE_DIR에 캐시를 저장할 디렉터리를 설정합니다. 설정하지 않을 경우 기본적으로 ~/.ccache에 저장됩니다.
export USE_CCACHE=1
export CCACHE_DIR=<path-to-your-cache-directory>
다음으로 캐시 사이즈를 설정합니다.
prebuilts/misc/linux-x86/ccache/ccache -M 50G
(Android ICS 이전 버전이라면)
prebuilt/linux-x86/ccache/ccache -M 50G
구글에서는 50~100GB정도를 권장한다고 합니다.
이제 캐시 설정이 완료되었고 빌드를 하면 캐시되어 다음 번 빌드를 좀 더 빠르게 해줍니다.
4. 소스 Downloads
Android Framework는 https://android.googlesource.com 에서 Git으로 관리되고 있습니다.
Git은 리눅스를 만든 리누즈 토발즈가 개발한 버전관리 시스템이죠 :) 역시 리눅스가 뿌리(?)인 만큼 Git을 사용하여 버전관리를 하고 있습니다.
저도 Git을 잘쓰고 싶네요 ㅎㅎㅎ
어쨌든 소스를 받으러 가봅시다.
Android Framework는 특이하게도 Git을 뿌리로 둔 조금은 다른 Repo라는 바이너리를 통해 관리됩니다. Repo는 Git에 구글이 필요로 하는 기능을 추가시킨 버전이라고 생각하시면 되겠습니다.
자세한 Build workflow를 알고 싶으시다면 https://source.android.com/source/developing.html 이 곳을 참조해주세요 :)
다음 명령어로 home디렉터리에 bin디렉터리를 생성하고 bash에 PATH를 추가합니다.
$ mkdir ~/bin
$ PATH=~/bin:$PATH
그 곳에 curl를 이용하여 repo binary를 다운로드하고 실행 권한을 줍니다.
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
이어서 프레임워크 소스를 받을 디렉터리를 생성하여 줍니다.
$ mkdir WORKING_DIRECTORY
$ cd WORKING_DIRECTORY
ex)
$ mkdir ~/android_framework
$ cd ~/android_framework
저는 mkdir ~/android_framework 로 home디렉터리에 android_framework 디렉터리를 생성하였습니다.
다운로드 준비가 거의다 되어갑니다. repo initialize를 한 다음 소스를 다운로드 받습니다.
다음과 같이 입력하면 master branch를 다운로드 준비합니다.
$ repo init -u https://android.googlesource.com/platform/manifest
그러나 개발자마다 필요한 branch가 있기 때문에 tag나 branch를 선택하여 다운로드할 수도 있습니다.
저희 팀은 kitkat 중 가장 최신 빌드인 4.4.4_r1.0.1을 택하여 진행하였습니다. 따라서 아래와 같이 입력하시면 가능합니다.
branch목록은 https://android.googlesource.com/platform/manifest/+refs 에서 확인하시면 됩니다. :)
$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.4.4_r1.0.1
repo init을 하면 몇가지 다운로드가 되고 잠시후 sync준비가 완료됩니다.
자~ 이제 모든 설정이 끝나고 repo를 통해 소스를 다운로드 받습니다. repo in참고로 다운로드 용량은 약 11GB정도 되며 네트워크 상황에 따라 다운로드 시간이 다릅니다.
100Mbps회선을 기준으로 약 5시간정도 걸린것 같습니다 ㄷㄷ
$ repo sync
이제 git에서 android framework를 다운로드합니다. 이제 잠시 잊고 나가서 놀거나 한숨 자도록 합니다.
다만, 가끔 불안정한 이유로 다운로드가 멈추기도..합니다..ㅠㅠ
그럴 때는 다시 sync해주시면 이어 받습니다. (가끔 안이어 받기도 하더라구요..ㅋㅋㅋ)
자 이제 다운로드가 완료되었습니다!!!
오랜만에 장문의 글을 쓰다보니(?)매끄럽지 않은 부분도 있습니다. ㅠㅠ 보면서 계속 수정할터이니 참고 봐주세요 ^^
다음 편에서 빌드방법을 이어나가겠습니다~~
감사합니다 :)