티스토리 뷰



[DarkCloud #1] 안드로이드 프레임워크 포팅 for Nexus S


Jake Yoon

yjaeseok@gmail.com

https://plus.google.com/+JakeYoon




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


  먼저 안드로이드 프레임워크를 포팅하기 위해서는 디바이스와 소스 컴파일 및 포팅을 위한 컴퓨터가 필요합니다.

디바이스는 크게 2가지 레퍼런스 폰(넥서스 시리즈)과 비레퍼런스 폰(갤럭시 시리즈, 옵티머스 시리즈 등)으로 나눌 수 있습니다.


  이 포스트는 넥서스 S를 기준으로 작성하였으므로, 이 포스트를 적용해서 바로 바로 프레임워크를 포팅하고자 한다면,

중고나라 같은 사이트에서 3~5만원이면 넥서스 S를 구매할 수 있으므로 구매하도록 합니다.

(넥서스 S는 최고의 포팅용 폰으로 알려져 있음)


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


  먼저, 컴퓨터에는 Ubuntu 12.04 LTS 버전을 설치합니다

기존에 쓰던 컴퓨터가 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 12.04 LTS에 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 zlib1g-dev:i386


ia32-libs-multiarch:i386 error  에러 발생시

  1. Install updates and the package ia32-libs-multiarch:i386 for multiarch support
  2. Download http://media.steampowered.com/client/installer/steam.deb and install with the Software Center
  3. Start Steam


이제 컴퓨터의 기본 환경 셋팅은 완료되었습니다. 

이어서 안드로이드 프레임워크 소스를 다운로드 받는 것을 시작으로 본격적인 프레임워크 포팅을 해보겠습니다.


먼저 안드로이드 소스를 다운로드 받기 위해 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 ComponentCompanyDownloadMD5 ChecksumSHA-1 Checksum
Orientation SensorAKMLinkb6788005feb3bd72f3302572d56db5e7864d6b3c01f88ee6cb97778c085189c821e891d1
Wi-Fi, Bluetooth, GPSBroadcomLink23e29de9a10294452254bc96d5a2ee2d617538216fba577de45fa8503fee018da1da75a8
GraphicsImagination TechnologiesLink37408c3bf845812ea586800ae519fe221431256d4d37fd387b3ed5ec499654bf854f2b9e
NFCNXPLink921dd8c5983e40b3538cc6feff7c7aa5a6e722804979467e6a46cfb199e57dc1b4b57d1f
GSMSamsungLink02550eabbfd8da7f27053d2fde4ce61f57325fe8f7036f05a1afbbff5c8180bcbfbebf2c
DRMWidevine/GoogleLink9d49f85f50685fc0c2ef66eaf466aad2

f67277c3ca17c31ab26c429a172f13c0ede7883e

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

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

 $ tar xvzf akm-crespo-imm76d-8314bd5a.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:$JAVA_HOME/bin:$PATH


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

 $ source ~/.bashrc



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

 $ su 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로, 환경설정->휴대전화 정보에서 확인할 수 있는 화면입니다.





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






'Project > Android' 카테고리의 다른 글

BusyBox 설치  (0) 2013.12.10
안드로이드 커널 컴파일  (0) 2013.12.10
passU (Pass your USB via Network)  (0) 2013.09.07
Android Wrapper for Flash  (0) 2012.12.07
댓글