728x90

원본 글 http://source.android.com/source/initializing.html

이 섹션은 안드로이드 소스 파일을 빌드하는 로컬 환경을 설정하는 방법에 대해 설명한다. Linux 또는 Mac OS만 지원하며, Windows는 현재 지원하지 않는다.

참고: 소스 다운로드 사이즈는 8.5GB 정도이다. single build를 위해 30GB의 여유공간이 필요하며, full set을 빌드하기 위해서는 100GB이상의 여유공간이 필요하다.

전체 코드리뷰 및 코드 업데이트 프로세스에 대한 Overview는 Life of a Patch을 참고한다.

목차

Branch 선택하기

빌드 환경에 대한 요구사항 중 일부는 컴파일 하려는 소스 코드의 버전에 따라 결정된다. 선택할 수 있는 branch의 전체 목록에 대한 빌드 넘버를 참조한다. 아니면 최신 빌드 소스("마스터"라 부른다)를 다운로드하고 빌드할 수도 있는데, 이 때는 repository를 초기화할 때 branch 사양을 생략할 수 있다.

일단 branch를 선택하여 빌드를 하기 위해서는 아래의 절차를 따르도록 한다.

리눅스 빌드환경 셋팅하기

이 지침은 마스터를 포함한 모든 브랜치에 적용된다.

안드로이드 빌드는 주기적으로 사내에서 최신의 우분투 LTS버전(10.04)으로 테스트 되지만, 대부분의 배포판의 경우 필요한 빌드툴을 구축해야만 한다. 우리는 다른 배포판에서의 성공 또는 실패에 대한 리포트를 환영한다.

진저브래드(2.3.x) 이상의 버전(마스터 branch를 포함한)은 64비트 환경이 필요하다. 이전의 버전들은 32비트 시스템에서 컴파일이 가능하다.

참고: 가상머신에서도 빌드가 가능하다. 만약 리눅스 가상머신이라면 안드로이드 tree를 빌드하기 위해 적어도 16GB의 RAM/swap 과 30GB 이상의 디스크 공간이 필요하다.

  • Python 2.6 -- 2.7 버전이 필요하다. python.org에서 받을 수 있다.
  • GNU Make 3.81 -- 3.82 버전이 필요하다. gnu.org에서 받을 수 있다.
  • 진저브레드 이상을 빌드하기 위해서는 JDK 6 버전이 필요하며, 프로요 이전버전을 빌드하기 위해서는 JDK 5 버전이 필요하다. java.sun.com에서 받을 수 있다.
  • Git 1.7 이상의 버전이 필요하다. git-scm.com에서 찾을 수 있다.

JDK 설치

Sun JDK는 더이상 우분투 기본 패키지 저장소에서 사용할 수 없다. JDK를 사용하기 위해서는 시스템에 적절한 저장소를 추가하여야 한다.

Java 6: 진저브레드 이상 [1]

1
2
3
$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk

Java 5: 프로요 이하

1
2
3
4
$ 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 apt-get update
$ sudo apt-get install sun-java5-jdk

참고: 빌드단계에서의 lunch 명령은 이전에 설치된 JDK 대신에 Sun JDK의 것이 사용되도록 하여야 한다.

필요한 패키지 설치 (우분투 10.04 ~ 11.10)

당신은 우분투 64비트 버전이 필요하다. 우분투 10.04를 권장한다. 우분투 최신버전을 사용하여 빌드하는 것은 현재 실험적으로 지원되며 마스터가 아닌 다른 branch의 동작을 보증하지 않는다.

1
2
3
4
5
$ 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

우분투 10.10이라면:

1
$ sudo ln -s /usr/lib32/mesa/libGL.so.1 /usr/lib32/mesa/libGL.so

우분투 11.10이라면

1
$ sudo apt-get install libx11-dev:i386

필요한 패키지 설치 (우분투 12.04)

우분투 12.04를 사용하여 빌드하는 것은 현재 실험적으로 지원되며 마스터가 아닌 다른 branch의 동작을 보증하지 않는다.[2]

1
2
3
4
5
6
$ 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

USB Sccess 설정

GNU/리눅스 시스템(특히 우분투 시스템)상에서는 일반 사용자가 직접 기본적으로 USB 장치를 액세스 할 수 없다. 시스템이 액세스를 허용하도록 구성해야한다.

권장하는 방법은 /etc/udev/rules.d/51-android.rules 파일을 만들고(루트 권한으로) 그 안에 아래 내용을 복사하는 것이다. <username>은 USB를 통해 휴대전화에 엑세스할 권한이 있는 user의 실제 이름으로 대체하여야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# adb protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"
# fastboot protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"
# adb protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"
# fastboot protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>"
# adb protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username>"
# fastboot protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username>"
# adb protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>"
# fastboot protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>"
# adb protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username>"
# fastboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username>"
# usbboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", MODE="0600", OWNER="<username>"
# usbboot protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER="<username>"
# adb protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e42", MODE="0600", OWNER="<username>"
# fastboot protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e40", MODE="0600", OWNER="<username>"
# adb protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee2", MODE="0600", OWNER="<username>"
# fastboot protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0600", OWNER="<username>"

이러한 새로운 규칙은 다음번에 장치가 연결될 때 효과가 나타난다. 그러므로 장치를 분리한 후 다시 컴퓨터에 연결할 필요가 있다.

이 방법은 우분투 Hardy Heron (8.04.x LTS) 과 Lucid Lynx (10.04.x LTS) 양쪽다 동작하는것으로 알려져 있다. 다른 버전의 우분투나 다양한 GNU/리눅스에서는 다른 설정이 필요할 수도 있다.[3]

ccache 설정

선택적으로 ccache 컴파일 도구를 사용하여 빌드를 할 수 있다. Ccache는 빠른 재 빌드시에 사용되는 컴파일러 캐시 역할을 한다. "make clean"을 할 때, 혹은 다른 빌드 product 사이를 자주 전환할 때 ccache는 아주 잘 동작한다.

당신의 .bashrc 파일이나 그와 같은 역할을 하는 파일에다 다음의 내용을 적는다.

1
export USE_CCACHE=1

기본적으로 캐시는 ~/.ccache에 저장된다. 만약 당신의 홈디렉토리가 NFS나 다른 non-local 파일시스템일 경우 당신의 .bashrc 파일에 다른 특정 디렉토리를 명시하는 것이 좋다.

1
export CCACHE_DIR=<path-to-your-cache-directory>

제안하는 캐시 사이즈는 50~100GB이다. 소스코드를 다운로드한 다음에는 아래의 명령을 실행해야 한다:

1
prebuilts/misc/linux-x86/ccache/ccache -M 50G

아이스크림 샌드위치(4.0.x) 이상의 버전을 빌드할 때는 ccache는 다른 위치에 존재한다:

1
prebuilt/linux-x86/ccache/ccache -M 50G

이 설정은 CCACHE_DIR 값으로 영구히 저장된다.

별도의 output 디렉토리 사용하기

기본적으로 각 빌드의 결과물은 매칭되는 각 소스트리의 out/ subdirectory에 저장된다.

여러개의 storage 장치를 가지는 일부 머신에서는 output 파일을 별도의 볼륨에 저장하는 것이 빌드가 더 빠르다. 성능향상과 더불어 파일시스템이 손상되는 경우 모든 파일을 다시 생성해야 하기 때문에, 속도 대신에 안정성이 최적화 된 파일시스템에 output 파일을 저장할 수도 있다.

이것을 설정하기위해 output 디렉토리를 가르키는 OUT_DIR_COMMON_BASE 변수를 export 해야 한다.

1
export OUT_DIR_COMMON_BASE=<path-to-your-out-directory>

output 디렉토리는 각각의 소스트리의 이름으로 만들어진다.

예를들어, /source/master1/source/master2 두개의 소스트리를 갖고 있고 OUT_DIR_COMMON_BASE 값이 /output으로 셋팅되어 있다면, output 디렉토리는 /output/master1/output/master2가 된다.

여러개의 소스트리가 같은 이름을 가질 경우 output 디렉토리를 공유하게 되어 예상치 못한 결과를 낼 수도 있음을 주의한다.

이 기능은 마스터 브랜치를 포함한 젤리빈(4.1)이상에서만 지원된다.

맥 OS X 빌드환경 셋팅하기

이하의 내용은 맥 OS에서의 빌드환경을 설정하는 부분이므로 따로 번역하지 않는다. 맥으로 빌드할일은 없을 듯.

http://source.android.com/source/initializing.html#setting-up-a-mac-os-x-build-environment 파트를 참고한다.

Next: 소스 다운로드

빌드환경이 완성되었다! 이제 소스 다운로드하기를 진행한다.

역주

  1. 정작 해보니 우분투 12.04에서는 잘 되지 않는다. 아래의 방법으로 JDK 6을 설치했다.
    1
    2
    3
    $ sudo add-apt-repository ppa:webupd8team/java
    $ sudo apt-get update
    $ sudo apt-get install oracle-java6-installer
  2. 오류가 나며 설치가 실패될 경우 원인은 libgl1-mesa-glx:i386 패키지의 의존성 문제 때문이다. 다음과 같이 libgl1-mesa-dri:i386 패키지를 설치한 후 재시도하면 해결된다.
    1
    $ sudo apt-get install libgl1-mesa-dri:i386
  3. 우분투 12.04 LTS에서도 잘 동작한다.

출처 : http://wiki.sogeuni.com/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C_%EC%86%8C%EC%8A%A4_%EB%B9%8C%EB%93%9C%ED%95%98%EA%B8%B0/%EB%B9%8C%EB%93%9C_%ED%99%98%EA%B2%BD_%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0

728x90

+ Recent posts