728x90

안드로이드 커널 및 SDK 소스 코드를 컴파일 하기 위한 환경 설정은

아래 구글 안드로이드 사이트에 명시되어 있다.

http://source.android.com/source/initializing.html

 

 

 

1 . 기본적으로 설치되어야 하는 패키지들

 

위의 안드로이드 사이트에 명시된 기본적으로 필요한 패키지들은 다음과 같다.

 

 

   -  Python 2.5 -- 2.7, which you can download from python.org.

 

  - GNU Make 3.81 -- 3.82, which you can download from gnu.org,

 

  - JDK 6 if you wish to build Gingerbread or newer; JDK 5 for Froyo or older.
     You can download both from 
java.sun.com.

 

  - Git 1.7 or newer. You can find it at git-scm.com. 

 


① Python and Make Utility 

  Python이나 Make 유틸리티 같은 경우에는 기본적으로 리눅스 패키지에 포함되어 있다.

혹시 설치 시에 누락되었을 경우 apt-get 설치 관리자를 통하여 쉽게 다음 명령어로 쉽게 설치 가능하다.

 

  $ sudo apt-get install python

  $ sudo apt-get install make

 

 

② JAVA JDK

  JDK를 설치하는 방법은 다음과 같이 안드로이드 사이트에 명시되어 있다.

 

 sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"

 

 sudo apt-get update

 sudo apt-get install sun-java6-jdk

 

 

 

하지만, JAVA가 Oracle에 인수되서 그런지 sun-java6-jdk 패키지는 존재하지 않는다.

따라서, 다른 방법을 통해 설치해야 한다.

 

먼저, python-software-properties 패키지가 필요한데 보통은 기본적으로 깔려있다.
하지만 없는 경우도 있으니 다음 커맨드로 먼저 설치하여 준다.

  $ sudo apt-get install python-software-properties

 

그리고 나서 다음 명령을 입력하여 준다. 

첫 번째 명령을 치면 계속하려면 Enter, 중지하려면 Ctrl + C 키를 입력하라고 나오는데
ENTER를 쳐주면 계속해서 다운로드 패키지를 등록한다.

  $ sudo add-apt-repository ppa:ferramroberto/java

  $ sudo apt-get update

 

그러면 sun-java6-jdk 패키지가 등록이 되고 설치가 된다. java6-jdk와 플러그인 설치를 위해
다음의 명령어로 설치 할 수 있다.

  $ sudo apt-get install sun-java6-jdk sun-java6-plugin

 

  

그런데 위의 명령을 통해서 JDK를 설치 할 수 있으나 버젼이 java 6만이 가능하다.

따라서 java7, java8 등 상위버전을 설치하고 싶다면 다음 명령으로 설치 가능하다.

  $ sudo add-apt-repository ppa:webupd8team/java

  $ sudo apt-get update

 

그러면 Oracle Java Installer를 통해서 원하는 버전의 자바 JDK의 설치가 가능하다.

 

Java 6를 설치하려면,

  $ sudo apt-get install oracle-java6-installer

 

 

Java 7을 설치하려면,

  $ sudo apt-get install oracle-java7-installer

 

 

 

Java 8을 설치하려면,

  $ sudo apt-get install oracle-java8-installer

 

 

설치 후 이미 중복 설치되어 있는 여러버전의 JDK를 관리해 줄 필요가 있을 수 있다.

그럴 때는 다음 명령어를 통해서 원하는 JDK를 선택하여 주면 된다.

  $ sudo update-alternatives --config java 

 

 

   선택       경로                                    우선순  상태

-----------------------------------------------------------------------------------------------------

* 0            /usr/lib/jvm/java-8-oracle/jre/bin/java       1062      자동 모드

   1            /usr/lib/jvm/java-6-openjdk/jre/bin/java    1061      수동 모드

   2            /usr/lib/jvm/java-8-oracle/jre/bin/java       1062      수동 모드

 

기본 사항[*]을 사용하려면 엔터, 다른 것을 사용하려면 번호를 입력하십시오:

 

 

그럼 위와 같은 콘솔 화면이 나오는데 목록 중 원하는 JDK의 번호를 입력하여 선택해 주면 된다.

선택된 자바의 버전을 확인하기 위해서 다음 명령어를 통해 확인하여 본다.

  $ java -version 

 

 

③ GIT

  리눅스 커널은 git에 의해 버전이 관리되고 다운로드 할 수 있다.

따라서 git을 설치해주어야 한다. git 또한 apt-get을 이용하여 손쉽게 설치 가능하다.

 

  $ sudo apt-get install git

 

 

 

 

 2. 필요한 라이브러리 패키지들

 

우분투의 버전마다 필요한 라이브러리가 살짝 다르긴 하다. 구글에서는 우분트 10.04 64비트를 권장하고 있다. 

 

  안드로이드 사이트에서는 우분투 버전 10.04 ~ 11.10에 해당하는 시스템들은 다음 명령어를 통하여 필요한 라이브러리를 설치하라고 명시되어 있다.

 

 $ 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 lib32readline-gplv2-dev lib32z1-dev libgl1-mesa-dev g++-multilib mingw32 python-markdown libxml2-utils xsltproc

 

하지만, 이 또한 업데이트가 되지 않아 몇 가지 라이브러리가 오류가 발생한다.

오류가 발생하거나 대체된 것들을 수정한 다음 명령어를 실행하면 한번에 설치 가능하다.

 

 [ ubuntu 10.04에서 ] 

  $ sudo 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 lib32z1-dev libgl1-mesa-dev g++-multilib mingw32 python-markdown libxml2-utils xsltproc libpcsclite-dev

 

 

[ ubuntu 11.10에서 ] 

  $ 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 lib32readline-gplv2-dev lib32z1-dev libgl1-mesa-dev g++-multilib mingw32 python-markdown libxml2-utils xsltproc libpcsclite-dev

 

 

우분투 10.10 인 경우에는 다음 명령을 통하여 링크하나를 생성해 준다.

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

 

 

우분투 11.10은 추가적으로 패키지 하나를 추가로 설치하여 준다.

   $ sudo apt-get install libx11-dev:i386

 

 

우분투 12.04 버전인 경우 다음 명령을 통하여 설치해 준다.  

   $ sudo apt-get install git-core 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 openjdk-6-jdk tofrodos \

  python-markdown libxml2-utils xsltproc zlib1g-dev:i386


 

 하지만 libgl1-mesa-glx:i386 패키지가 libglapi-mesa:i386 의존성으로 인해 설치가 안 되므로
 libglapi-mesa:i386패키지를 추가하여  설치하여 준다. 또한 "make menuconfig"를 수행하기 위하여

필요한 lib32ncurses5-dev 도 미리 설치하여 준다.

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

 

 

혹시 다음과 같은 에러가 발생한다면,  

 다음 패키지의 의존성이 맞지 않습니다:
 lib32ncurses5-dev : 의존: libncurses5-dev (= 5.9-4) 하지만 %s 패키지를 설치하지 않을 것입니다
E: 문제를 바로잡을 수 없습니다. 망가진 고정 패키지가 있습니다. 

위의 패키지에서 libncurses5-dev만 빼고 설치 후

$ sudo apt-get install lib32ncurses5-dev 명령으로 libncurses5-dev만 따로 설치해 준다.

 

 

다음 명령을 통하여 링크 파일도 생성하여 준다.

  $ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so

 

 

 

 

 

3.  USB 접근(Access) 설정 --> 생략 가능할 것 같음

 

 안드로이드 사이트의 설명에 의하면 기본적으로 GNU/Linux 시스템은 일반 유저가 티폴트 설정에 의해 USB 장치에 직접적으로 접근할 수 없다고 명시되어 있다. 하지만 안드로이드 시스템은 이런 접근을 허용되는 설정이 필요하다고 한다.

 

이를 해결하기 위한 추천 방안은 /etc/udev/rules.d/51-android.rules 파일을 생성하는 것이다.

파일의 내용은 다음과 같이 적어주면 된다. 

여기서 주의할 것은 <username>이라 적힌것은 그대로 쓰는게 아니라

폰에서 USB로 접근 권한을 받을 유저의 이름(계정이름)으로 대체 해주어야 한다.

 

# 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/Linux에서는 다른 설정이 필요할지도 모른다.

 

 

 

 

4.  ccache의 설정

 

당신은 ccache 툴 모음을 사용할 것인지 빌드 시 마음대로 알릴 수 있다. ccache는 리빌드시 속력을 빠르게 하는데 사용할 수 있는 컴파일러 캐시로써 동작한다. 이 작업은 당신이 "make clean"을 자주 하거나 다른 빌드 결과물 사이에서 빈번하게 스위치 한다면 매우 좋다. 

 

이것을 사용하기 위해서는 다음 라인을 .bashrc 안에 넣어두면 된다.

 

 

 

export USE_CCACHE=1

디폴트 설정에 의하면 ccache는 ~/.ccache 폴더에 저장될 것이다. 만약 당신의 홈 디렉토리가 NFS(네트워크 파일 시스템)이거나 다른 논-로컬 시스템이라면, 당신은 디렉토리를 명시하길 원할 것인다. 그렇다면 다음 라인을 .bashrc 안에 추가한다. <path-to-your-cache-directory> 대신 당신이 원하는 디렉토리 경로를 넣으면 된다.
export CCACHE_DIR=<path-to-your-cache-directory>

제안된 캐시 사이즈는 50~100GB 정도이다. 
당신은 다운된 소스코드에 한번의 아래 커맨드를 따라 하는 것이 필요할 것이다.
prebuilts/misc/linux-x86/ccache/ccache -M 50G

아이스크림 샌드위치 (ICS, 4.0.x) 또는 상위 버전일 때, ccache는 다른 곳에 위치한다.
prebuilt/linux-x86/ccache/ccache -M 50G
이 세팅은 CCACHE_DIR에 저장되고 계속 지속될 것이다.



 
5. 별도의 아웃풋 디렉토리를 사용

디폴트 설정에 의하면 각 빌드의 아웃풋은 소스 트리에 일치하는 서브디렉토리 중
out/ 디렉토리에 저장된다.

다수의 스토리지 장치를 포함하는 일부 머신들에서, 빌드들은 소스파일과 아웃풋을 분리된 볼륨에 저장할 때 더 빠르다. 추가적인 성능을 위해, 아웃풋은 크래쉬의 견고성 대신 속도를 위해 최적화 된 파일 시스템에 저장 될 수 있다. 이후에 파일 시스템이 크래쉬 된 경우 모든 파일들은 다시 생성 될 수 있다.

이것을 설정하기 위해 당신이 아웃풋 디렉토리로 저장되 길 원하는 곳을 가리키는 OUT_DIR_COMMON_BASE 변수를 export 할 수 있다.

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

 

각 별도의 소스 트리의 아웃풋 디렉토리는 소스 트리를 가지고 있는 디렉토리의 이름을 따서 명명된다.

 

예를 들어, 당신은 /source/master1 and /source/master2 라는 소스 트리가 있고, OUT_DIR_COMMON_BASE는 /output 이라고 세팅되어 있을 때,

아웃풋 디렉토리는 /output/master1 and /output/master2 가 될 것이다.

 

이것은 오직 마스터 브랜치(master branch)가 포함된 젤리빈(4.1)과 더 최신 버전에서만 지원된다.

 출처 : http://blog.naver.com/mannunt?Redirect=Log&logNo=70158997181

728x90

+ Recent posts