정보공간_1

[6기 강남 윤재석] 안드로이드 리눅스 커널 빌드 & 포팅 (Nexus S) 본문

IT 놀이터/Elite Member Tech & Talk

[6기 강남 윤재석] 안드로이드 리눅스 커널 빌드 & 포팅 (Nexus S)

알 수 없는 사용자 2014. 10. 27. 15:02

안녕하세요. 삼성소프트웨어 멤버십 엘리트멤버 6기 윤재석 입니다. 저번 포스팅에서 안드로이드 프레임워크 빌드 & 포팅을 진행해보았다면 이번에는 좀 더 깊숙히 안드로이드 리눅스 커널 소스를 빌드 후 넥서스S 에 포팅하는 방법에 대해 이야기하고자 합니다. 비록 이 포스팅은 넥서스 S로 진행하였으나 어느 레퍼런스 폰이나 동일한 과정을 통해 포팅이 가능합니다.


이 포스팅은 안드로이드 리눅스 커널 포팅을 위해 격었던 제 개인적인 경험 과 구글링을 통한 수많은 자료들을 통해 얻은 솔직한 경험들을 다룬 것이므로, 글을 읽는 분들에게는 적용되지 않는 경험이 있을 수도 있음을 알립니다.


안드로이드용 리눅스 커널 빌드는 우분투에서 진행하도록 하겠습니다. 만약 우분투가 설치되어있지 않다면 아래 포스팅의의 전반부를 읽고 우분투를 설치합니다.

http://blog.secmem.org/546


첫번째 단계로 먼저 리눅스 커널 빌드를 위해 사용되는 툴체인을 설치해야합니다. 툴체인은 빌드를 위해 사용되는 컴퓨터 (Host라고 함)와 빌드된 결과물을 사용할 컴퓨터 (Target이라고 함)인 넥서스 S 스마트폰이 사용하는 환경이 다르지만 사용할 수 있도록 해주는 것을 말합니다. 툴체인이라는 말에는 빌드를 위한 컴파일러 뿐만아니라 빌드를 위한 각종 유틸리티와 라이브러리를 모두 포함하여 말하는 것으로 일반적으로 Assembler, Linker, C Compiler, C Library, Utility 로 구성되어 있습니다.


안드로이드 스마트폰에 적재되는 리눅스 커널을 빌드하기 위한 툴체인으로는 크게 2가지 종류가 있습니다.

1) 구글이 제공하는 arm-eabi-4.4.3

2) ARM 계열에 최적화된 linaro-4.7.3

이 중에서 저희는 구글이 제공하는 arm-eabi-4.4.3 를 사용하여 빌드하도록 하겠습니다.


toolchain 폴더를 생성하고 다운로드 받습니다. 

$ mkdir ~/toolchain

$ cd ~/toolchain

$ wget https://www.dropbox.com/s/6s3f57wd4zie8ah/arm-eabi-4.4.3.zip


만약에 wget이 없을 경우 아래의 명령어를 입력해서 wget을 설치해줍니다.


$ sudo apt-get install wget


이어서 다운로드 받은 압축파일을 풀고 권한을 줍니다.

$ unzip arm-eabi-4.4.3.zip

$ chmod 777 -R arm-eabi-4.4.3


툴체인에 접근이 용이하도록 bashrc에 환경변수를 등록해줍니다. 먼저 bashrc를 열고

$ vi ~/.bashrc


아래와 같은 내용을 추가한 뒤

export ARCH=arm

export SUBARCH=arm

export CROSS_COMPILE=$HOME/toolchain/arm-eabi-4.4.3/bin/arm-eabi-

export PATH=$HOME/toolchain/arm-eabi-4.4.3/bin:$PATH


저장 후 적용해줍니다.
$ source ~/.bashrc

이제 툴체인의 설치가 완료되었습니다. 이어서 안드로이드 리눅스 커널을 다운로드 받도록 하겠습니다. 넥서스 S용 리눅스 커널은 https://android.googlesource.com/kernel/samsung.git 에 관리되고 있으며, 만약 다른 기기에 포팅할 경우 해당 디바이스에 맞는 리눅스 커널을 다운로드 받아야합니다. 대부분의 리눅스 커널 소스는 https://android.googlesource.com 에서 구할 수 있습니다.


git을 통해 안드로이드용 리눅스 커널을 다운로드 받을 수 있으므로 git을 설치해줍니다.

$ sudo apt-get install git


git을 이용해 안드로이드용 리눅스 커널 소스를 다운로드 받습니다.

$ mkdir ~/kernel

$ cd ~/

kernel

$ git clone https://android.googlesource.com/kernel/samsung.git

$ git checkout remotes/origin/android-samsung-3.0-jb-mr0

$ cd samsung


make를 이용해 안드로이드용 리눅스 커널을 컴파일 합니다. 컴파일에 앞서 configuration을 위한 모델명을 넣는데 넥서스 S는 herring_defconfig로 입력합니다. 수많은 로그와 함께 컴파일 되는 것을 확인할 수 있습니다.


$ make herring_defconfig

$ make -j4


컴파일의 결과 파일은 arch/arm/boot/zImage에 생성됩니다.





이제부터는 빌드한 안드로이드용 리눅스 커널을 넥서스 S에 포팅하는 것을 소개하도록 하겠습니다. 

빌드한 안드로이드용 리눅스 커널을 핸드폰으로 전송하기 위해서는 fastboot라는 프로그램을 사용해야합니다. fastboot는 안드로이드 프레임워크 빌드시 얻을 수 있으며, http://d.android.com/sdk 에서 android sdk를 통해 fastboot 를 다운로드 받을 수도 있습니다. fastboot는 tools 폴더에 들어있습니다.



이제 넥서스 S를 fastboot 모드로 부팅시켜야합니다. fastboot 모드란 fastboot 명령어를 통해 안드로이드 이미지를 플래싱 받을 수 있는 모드를 말하며, 전원을 끈 상태에서 각 핸드폰마다 아래와 같은 방법으로 fastboot 모드에 진입할 수 있습니다.

Booting into fastboot mode

DeviceKeys
hammerheadPress and hold both Volume Up and Volume Down, then press and hold Power
floPress and hold Volume Down, then press and hold Power
debPress and hold Volume Down, then press and hold Power
mantaPress and hold both Volume Up and Volume Down, then press and hold Power
makoPress and hold Volume Down, then press and hold Power
grouperPress and hold Volume Down, then press and hold Power
tilapiaPress and hold Volume Down, then press and hold Power
phantasmPower the device, cover it with one hand after the LEDs light up and until they turn red
maguroPress and hold both Volume Up and Volume Down, then press and hold Power
toroPress and hold both Volume Up and Volume Down, then press and hold Power
toroplusPress and hold both Volume Up and Volume Down, then press and hold Power
pandaPress and hold Input, then press Power
wingrayPress and hold Volume Down, then press and hold Power
crespoPress and hold Volume Up, then press and hold Power
crespo4gPress and hold Volume Up, then press and hold Power

 

fastboot 모드로 진입하면 아래와 같은 화면을 볼 수 있습니다.




이 상태에서 USB를 통해 PC와 넥서스 S를 연결합니다.


부분적으로(선택적으로) 이미지를 플래싱하는 방법

$ su root

# cd ~/kernel/samsung/arch/arm/boot

# fastboot flash zimage zImage



이렇게 플래싱을 할 수 있으며, 플래싱 완료 후 REBOOT 메뉴를 선택하면, 포팅 성공한 안드로이드를 확인할 수 있습니다.


아래의 스크린 샷은 본인의 넥서스 S로, 환경설정->휴대전화 정보에서 확인할 수 있는 화면입니다.







수고하셨습니다. 짝짝짝!!




관련글 : [6기 강남 윤재석] 안드로이드 프레임워크 빌드 & 포팅 (Nexus S)


Written By Jaeseok Yoon, email : yjaeseok@gmail.com