1. 안드로이드 컴파일
참고로 안드로이드 소스코드에는 pre-built된 커널 이미지가 들어있기 때문에 커널 컴파일을 별도로 하지 않고 안드로이드만 컴파일해서 설치해도 상관없다. 하지만 커널을 수정하거나 또는 기타 다른 이유로 커널 컴파일을 직접 하는 경우에는 먼저 안드로이드 소스코드를 다운로드 받은 상태에서 커널을 먼저 컴파일하고, 컴파일된 커널 파일을 안드로이드 소스트리로 복사한 후에 안드로이드를 컴파일하고 전화기에 설치해야 한다. (2. 안드로이드 커널 컴파일 부분 참조)
아래는 안드로이드 컴파일 중에 주의해야 할 내용들이다.
1) Device Specific Files
안드로이드를 특정 전화기 모델에 올리기 위해 컴파일 할 때에는 해당 전화기에서 사용하는 proprietary binaries를 전화기에서 추출해서 안드로이드 소스코드 트리에 저장하고 컴파일을 해야 한다.
이 예제에서는 갤럭시 넥서스(maguro)를 사용한다고 가정하고, 먼저 안드로이드 소스트리의 최상위 디렉토리에서 아래와 같이 빌드 환경을 구축한다.
$ . build/envsetup.sh
$ lunch full_maguro-userdebug
$ make fastboot adb
전화기를 호스트 PC에 USB 케이블로 연결하고, 아래와 같이 proprietary binaries를 전화기에서 추출한다.
$ cd device/samsung/maguro
$ ./extract-files.sh
$ cd ../../../
그럼 vendor라는 디렉토리가 소스코드 최상위 디렉토리에 생성되고, 추출된 파일들이 여기에 저장되어 있을것이다.
이제 안드로이드 소스코드를 컴파일하면 된다. 추출된 proprietary binaries 파일들은 system.img 파일에 포함되어서 전화기에 설치된다. 자세한 컴파일 및 설치 과정은 공식 사이트를 참조한다.
$ make -j8
2) Radio / Bootloader 설치
여기를 보면 안드로이드 버전별로 호환되는 Cell Radio / Bootloader 버전이 명시되어 있다. 만약 전화기에 설치된 Cell Radio / Bootloader 중 하나라도 현재 설치하려는 안드로이드 버전과 호환되지 않는다면 컴파일한 안드로이드를 전화기에 설치(flash) 할 수 없다.
새로운 Cell Radio / Bootloader를 구할 수 있는 공식적인 경로는 찾지 못했는데, 대신 구글에서 배포하는 전화기별 Pre-built Factory Image에서 필요한 파일들을 뽑아낼 수 있다. Factory Image는 여기에서 버전별로 다운로드 받을 수 있고, 갤럭시 넥서스용 안드로이드 4.0.2에는 radio-maguro-i9250xxkk6.img와 bootloader-maguro-primekk15.img라는 파일로 들어가 있다. 이 파일들을 전화기에 설치하는 방법은 Factory Image의 flash-all.sh 파일에서 하는대로 아래와 같이 하면 된다. 단, 아래 작업은 전화기가 fastboot mode로 들어간 상태에서 해야 한다.
$ fastboot flash bootloader bootloader-maguro-primekk15.img
$ fastboot reboot-bootloader
$ fastboot flash radio radio-maguro-i9250xxkk6.img
$ fastboot reboot-bootloader
3) Ubuntu 11.10에서 발생하는 컴파일 에러
Ubuntu 11.10(gcc-4.6)에서 Android 4.0.x를 컴파일 할 때 여러 에러가 발생한다. 임시방편으로 gcc-4.4와 g++4.4를 설치해서 대신 사용하면 문제 없이 컴파일 할 수 있다.
$ sudo apt-get install gcc-4.4 gcc-4.4-multilib g++-4.4 g++-4.4-multilib
$ make -j8 CC=gcc-4.4 CXX=g++-4.4
컴파일러 버전을 바꾸는 대신 아래 참고 사이트의 내용대로 직접 소스코드를 수정해서 해결할 수도 있다.
참고로 4.0.3 버전이 나온 현 시점에서 Android master 브랜치의 코드는 Ubuntu 11.10(gcc-4.6)에서 발생하던 에러가 모두 해결되어서 정상적으로 컴파일이 된다.
2. 안드로이드 커널 컴파일
안드로이드 커널은 별도로 분리되어서 관리된다. 안드로이드 소스코드에 pre-built된 커널 코드가 들어있어서 안드로이드만 컴파일해서 전화기에 설치해도 바로 사용이 가능하지만, 커널 레벨에서 뭔가 수정을 하려면 직접 안드로이드 커널 소스코드를 컴파일해야 한다.
커널은 디바이스별로 따로 구해야 하는데, 보통 전화기 제조사 사이트에서 구할 수 있다. 내가 사용하는 갤럭시 넥서스는 삼성에서 제조했지만 레퍼런스 폰이라서 관리는 구글이 직접한다. 따라서 커널 코드도 구글이 관리하기 때문에 구글 공식 사이트에서 커널을 다운로드 받을 수 있다. 갤럭시 넥서스는 OMAP 프로세서를 사용하기 때문에 커널 트리 중에서 omap.git를 clone 받으면 된다.
$ git clone https://android.googlesource.com/kernel/omap.git
그리고 clone 받은 omap 트리에서 한국에 판매된 GSM/HSDPA용 갤럭시 넥서스(코드네임: tuna)의 커널 코드를 체크아웃한다. 참고로 git branch -a를 사용하면 어떤 브랜치들이 있는지 볼 수 있다.
$ cd omap
$ git checkout remotes/origin/android-omap-tuna-3.0
$ git checkout -b remotes/origin/android-omap-tuna-3.0
이제 체크아웃 받은 커널 코드의 README 파일을 먼저 읽어보고, 아래 순서에 따라 커널을 컴파일한다.
참고로 OMAP 프로세서는 ARM 아키텍쳐에 ARM-EABI 인터페이스를 사용하기 때문에 적절한 tool-chain이 있어야만 크로스 컴파일을 할 수 있는데, 안드로이드 소스코드 트리의 prebuilt 디렉토리에 필요한 tool-chain이 들어있다.
이 예제에서는 호스트 머신으로 Ubuntu 11.04 x86 머신을 사용하고, 안드로이드 소스코드(커널 아님)는 /android-4.0.2_r1 디렉토리에 존재하고, 빌드된 커널 파일들은 /omap-build 디렉토리에 저장된다고 가정한다.
우선 갤럭시 넥서스용으로 만들어진 config 파일을 사용해서 커널 컴파일 옵션을 설정한다.
$ ARCH=arm make O=/omap-build tuna_defconfig
이제 본격적으로 커널 코드를 컴파일하는데, -j 옵션을 사용해서 컴파일 속도를 높여준다. -j 옵션 뒤의 숫자는 호스트 머신에 설치된 CPU 코어 수의 두배로 설정하면 된다.
$ ARCH=arm CROSS_COMPILE=/android-4.0.2_r1/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- make O=/omap-build -j8
위 과정이 정상적으로 끝나면 컴파일된 커널은 /omap-build/arch/arm/boot/zImage 파일로 저장된다. 이제 안드로이드 소스코드의 pre-built 커널 파일을 방금 새로 컴파일한 zImage 파일로 교체한다.
$ cp /omap-build/arch/arm/boot/zImage /android-4.0.2_r1/device/samsung/tuna/kernel
끝으로 /android-4.0.2_r1 디렉토리로 이동해서 안드로이드를 컴파일하면 새로운 커널을 포함한 안드로이드 이미지가 만들어진다. 참고로 kernel 파일은 안드로이드가 컴파일되고 난 후 boot.img 파일에 포함되어서 전화기에 설치된다. 자세한 컴파일 및 설치 과정은 공식 사이트를 참조한다.

comments
comments rss (+댓글 쓰러가기)