정보공간_1

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

IT 놀이터/Elite Member Tech & Talk

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

알 수 없는 사용자 2014. 10. 20. 12:54
안녕하세요. 삼성소프트웨어 멤버십 엘리트멤버 6기 윤재석 입니다. 오늘은 안드로이드 프레임워크 소스를 다운로드 받고 넥서스S에 포팅하는 방법을 이야기하고자 합니다. 비록 이 포스팅은 넥서스 S로 진행하였으나 어느 레퍼런스 폰이나 동일한 과정을 통해 포팅이 가능합니다.

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

먼저 안드로이드 프레임워크를 포팅하기 위해서는 디바이스와 소스 컴파일 및 포팅을 위한 컴퓨터가 필요합니다. 디바이스는 크게 2가지 레퍼런스 폰(넥서스 시리즈)과 비레퍼런스 폰으로 나눌 수 있습니다. 이 포스트는 넥서스 S를 기준으로 작성하였으므로, 이 포스트를 적용해서 바로 바로 프레임워크를 포팅하고자 한다면, 중고나라 같은 사이트에서 3~5만원이면 넥서스 S를 구매할 수 있으므로 구매하도록 합니다.


  다소 길게 느껴질 수도 있는 포스트이지만 이대로 따라한다면 충분히 누구든 자신의 넥서스 S에 자신이 포팅한 프레임워크를 확인할 수 있을 것입니다.


  프레임워크 빌드를 위해서는 Ubuntu 환경의 컴퓨터가 필요합니다. 기존에 쓰던 컴퓨터가 Windows 컴퓨터라면 Wubi라는 편리한 프로그램을 통해서 Ubuntu를 설치할 수 있습니다. Wubi를 활용하면 멀티부팅을 쉽게 구현할 수 있는 장점이 있습니다. 하지만 Wubi를 사용할 경우 단점도 존재하는 데, Wubi는 최대 30Gb를 설치할 수 있도록 허용해주므로 Google에서 제공하는 문서에 나와있는 


  • 30GB of free disk space to complete a single build and up to 100GB or more for a full set of builds. The source download is approximately 8.5GB in size.

위 내용만큼의 disk space가 충족하지 못합니다. 따라서 ResizeandDuplicateWubiDisk 에 있는 내용을 참고하여 100GB 이상의 사이즈로 disk space를 확장하도록 합니다.


  다음으로 Ubuntu에 Java 6를 설치해야합니다. Ubuntu 12.04 버전에서는 apt-get install sun-java-jdk  로는 java 설치가 불가능합니다. (repository를 확장해서 하는 경우도 있으나) 따라서 직접 Oracle Java 사이트에서 다운을 받아서 설치하는 방법을 설명하겠습니다.


먼저 JDK 를 Download 합니다. 위의 Accept를 누르고 jdk-6u38-linux-x64.bin 를 다운로드 받습니다.

이어서 JDK 를 다운로드 받은 폴더로 이동하여 JDK에 실행 권한을 줍니다.

$ sudo chmod +x jdk-6u38-linux-x64.bin


JDK 파일을 실행하여 압축을 풉니다.

$ ./jdk-6u38-linux-x64.bin


생성된 폴더를 /usr/lib/jvm 폴더로 이동시킵니다.

$ sudo mv jdk1.6.0_38/ /usr/lib/jvm/


Ubuntu 12.04 LTS 버전에 기본으로 설치되어있는 OpenJDK 를 대신해서 설치한 Oracle JDK가 적용되도록 변경하는 작업을 합니다.

$ sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.6.0_38/bin/javac 1

$ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.6.0_38/bin/java 1

$ sudo update-alternatives --install /usr/bin/javaws javaws /usr/lib/jvm/jdk1.6.0_38/bin/javaws 1


$ sudo update-alternatives --config javac

$ sudo update-alternatives --config java

$ sudo update-alternatives --config javaws


설치된 자바의 버전을 확인합니다. 아래 그림과 같이 나오면 정상적으로 완료된 것입니다.

$ java -version


Java Path 를 설정하기 위해서 home 에 있는 .bashrc 파일을 수정합니다. vi 에디터로 .bashrc를 열고

$ vi ~/.bashrc


다음 구문을 추가합니다.

export JAVA_HOME=/usr/lib/jvm/jdk1.6.0_38

export PATH=$JAVA_HOME/bin:$PATH


그리고 추가한 .bashrc를 적용합니다.

$ source ~/.bashrc


다음으로 Ubuntu에 필요한 필수 패키지를 설치하겠습니다.

$ sudo apt-get update && upgrade


$ sudo apt-get install vim git 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-dri:i386 libgl1-mesa-glx:i386 libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc zlib 1g-dev:i386



이제 컴퓨터의 기본 환경 셋팅은 완료되었습니다. 이어서 안드로이드 프레임워크 소스를 다운로드 받는 것을 시작으로 본격적인 프레임워크 포팅을 해보겠습니다.


먼저 안드로이드 소스를 다운로드 받기 위해 repo라는 tool을 다운로드 받겠습니다. repo 란 git 최상위에 생성하는 tool로써, 많은 수의 git repository를 관리하는 것을 도와준다고 합니다. 안드로이드 소스는 프레임워크 버전별로 수 많은 소스가 존재하므로 repo라는 tool을 활용하는 것 같습니다.


먼저 repo를 다운로드 받기 위해 home 폴더 아래 bin 폴더를 생성합니다.

$ mkdir ~/bin


그리고 그 bin 폴더를 환경변수에 등록 시킵니다. vi 에디터로 .bashrc를 열고

$ vi ~/.bashrc


다음 구문을 추가합니다.

export PATH=~/bin:$JAVA_HOME/bin:$PATH


그리고 추가한 .bashrc를 적용합니다.

$ source ~/.bashrc


curl을 이용해서 repo tool을 다운로드 받습니다.

$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo


그리고 실행권한을 줍니다.

$ chmod a+x ~/bin/repo


프레임워크 소스를 다운받을 폴더를 생성하고 이동합니다.

$ mkdir ~/framework

$ cd ~/framework


repo로 다운받을 프레임워크 소스를 지정합니다. 넥서스 S에 포팅이 가능한 소스(Google에서 권장하는) 중 가장 높은 버전인 4.1.2 리비전 1을 지정합니다.

$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.1.2_r1


repo로 sync 명령어로 프레임워크 소스를 다운로드 시작합니다.

$ repo sync -j4


이어서 넥서스 S에 있는 하드웨어 콤포넌트 바이너리를 안드로이드 소스폴더로 다운을 받아야 합니다. 넥서스 S에 장착된 하드웨어 들을 위한 바이너리들을 프레임워크 소스에 붙이는 작업이라고 볼 수 있겠네요.

Nexus S binaries for Android 4.1.2 (JZO54K and JZO54L)

 Hardware Component

 Company

 Download

 Orientation Sensor

 AKM

 Link

 Wi-Fi, Bluetooth, GPS

 Broadcom

 Link

 Graphics

 Imagination Technologies

 Link

 NFC

 NXP

 Link

 GSM

 Samsung

 Link

 DRM

 Widevine/Google

 Link


각 소스를 다운로드 받고 tar xvzf 명령어로 압축을 푼다.

예) 파일명이 akm-crespo-imm76d-8314bd5a.tgz라면

$ tar xvzf akm-crespo-imm76d-8314bd6a.tgz


압축푼 결과로 생성된 sh 파일을 프레임워크 소스 폴더로 이동시킵니다. 

그리고 sh 명령어로 쉘스크립트를 실행해서 바이너리 압축을 해제시킵니다.

예) 파일명이 external-akm-crespo.sh 라면

$ mv external-akm-crespo.sh ~/framework

$ sh external-akm-crespo.sh


드디어!!  프레임워크 소스 다운로드를 완료하였습니다.



  이제부터는 프레임워크 소스를 빌드하는 작업을 시작하겠습니다. 먼저 빌드환경을 초기화하기 위해 envsetup.sh 쉘을 실행시켜야합니다.


프레임워크 소스 폴더로 이동합니다.

$ cd ~/framework


envsetup.sh 쉘을 실행시킵니다.

$ source build/envsetup.sh


이어서 빌드할 타겟을 선택해야합니다.

$ lunch 8 

혹은

$ lunch

후에 crespo에 해당하는 8을 누르고 엔터를 누릅니다.



이제 빌드하기 위한 설정을 마쳤고, 빌드를 시작하겠습니다.

$ make -j4


엄청난 양의 로그들이 찍히면서 컴파일이 되는 것을 확인할 수 있습니다.








여기까지 완료하셨다면, 프레임워크 소스를 빌드하는 작업은 끝난 겁니다. 

이제부터는 빌드한 안드로이드 프레임워크를 넥서스 S에 포팅하는 것을 소개하도록 하겠습니다. 


먼저 빌드 후 완료된 파일들의 목록을 확인해보겠습니다. (만약에 여기에 파일 또는 폴더가 없다면, 빌드 중에 에러가 났거나 lunch를 통해 타겟을 제대로 지정해주지 않은 상태로 컴파일을 했을 가능성이 큽니다.

$ ls ~/framework/out/target/product/crespo/


boot.img, recovery.img, system.img, userdata.img 파일들이 생성된 것을 확인할 수 있습니다.


각각의 이미지파일들을 핸드폰으로 전송하기 위해서는 fastboot라는 프로그램을 사용해야합니다.

안드로이드 프레임워크 소스를 빌드하게 되면, 단순히 프레임워크 빌드된 파일만 생성되는 것이 아니라 안드로이드 이미지 포팅을 위한 툴도 생성됩니다. 생성되는 경로는 아래와 같습니다.


안드로이드 툴들이 생성되는 경로 : ~/framework/out/host/linux-x86/bin


생성되는 프로그램들을 편리하게 사용하기위해 bashrc에 PATH로 등록을 하겠습니다. 


vi 에디터로 .bashrc를 열고

$ vi ~/.bashrc


다음 구문을 추가합니다.

export ANDROID_TOOLS=$HOME/framework/out/host/linux-x86

export PATH=$ANDROID_TOOLS/bin:~/bin:$JAVA_HOME/bin:$PATH


그리고 추가한 .bashrc를 적용합니다.

$ source ~/.bashrc


이제 root로 접속하여, fastboot 가 정상적으로 실행되는지 테스트해봅니다.

$ su root

$ 패스워드 입력 (만약에 root 계정 패스워드를 설정한 적이 없다면, sudo passwd root 를 입력하여 패스워드를 설정해줍니다.


# fastboot


(fastboot 명령어가 정상적으로 실행되지 않는다면, root에서 bashrc를 열어서 절대경로로 ANDROID_TOOLS를 PATH에 추가해줍니다.)


이제 넥서스 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를 연결합니다.


# fastboot devices

위의 명령어를 통해 현재 디바이스가 올바르게 fastboot 모드로 연결되어있는 지 확인할 수 있습니다. 연결되어 있다면, 연결되어있는 디바이스 ID가 출력됩니다.


다음으로 부트로더를 언락시키는 작업을 하겠습니다. 부트로더를 언락하게 되면, 부트로더를 임의의 것으로 사용할 수 있게 됩니다. 아래 명령어를 입력하면 간단하게 언락을 할 수 있습니다.

# fastboot oem unlock


그럼 핸드폰에 언락할 것인지 물어보는데 물론 YES를 누르고 언락을 시킵니다. 


드디어 모든 준비가 완료되었고, 넥서스 S에 이미지를 플래싱 시키는 작업을 시작하겠습니다. 플래싱이란 이미지를 포팅하는 것을 말하며, 사실 글을 쓰는 본인도 플래싱과 포팅의 차이를 잘 모르겠네요.ㅠㅠ (어느 땐 플래시라고하고 어느 땐 포팅이라고 함..ㅠㅠ)


플래싱을 하는 방법에는 2가지가 있는데, 1가지는 전체 이미지를 플래싱하는 것이고, 또 다른 한가지는 부분적으로(선택적으로) 플래싱하는 것이 있습니다.  전체 이미지를 플래싱하는 것은 부분적으로 하는 것보다 명령어가 간편하지만, 모든 이미지를 다 플래싱 하고자 하는 경우가 아니라면 자주 쓰이지 않습니다. (모든 이미지를 다 플래싱 할 경우 공장 초기화와 비슷한 상태가 됩니다.)


전체 이미지를 플래싱하는 방법

# cd ~/framework

# fastboot flashall


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

# cd ~/framework/out/target/product/crespo

# fastboot flash boot boot.img

# fastboot flash system system.img

# fastboot flash userdata userdata.img

# fastboot flash recovery recovery.img



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


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





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


다음 포스팅에서는 넥서스 S에 리눅스 커널을 빌드 & 포팅하는 방법에 대해서 이야기하도록 하겠습니다. 포팅 과정 중 문의사항이 있으시면 yjaeseok@gmail.com 로 문의주시면 친절하게 응답해드리겠습니다. 감사합니다.






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