안드로이드 프레임워크 프로그래밍(2) [안드로이드 커널 다운로드 및 컴파일]

 지난 포스팅에서는 안드로이드 프레임워크 환경 구축에 대해 알아보았습니다. 이번에는 안드로이드 커널을 다운로드한 후 이를 컴파일하는 과정을 진행해 보도록 합니다.


 Ubuntu 12.04 환경에서 Terminal을 통해 안드로이드 커널을 구축해 보도록 하겠습니다. Terminal은 Ctrl+Alt+T 버튼의 조합으로 실행하실 수 있습니다.


 커널을 다운받기에 앞서 아래의 프로그램을 설치합니다. apt-get 명령어를 통해 설치하며 아래의 내용을 그대로 터미널에 적은 후 엔터를 입력하면 되겠습니다.


$ sudo apt-get install git 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 tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386


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


위 패키지를 설치하던 도중 libgl1-mesa-glx:i386을 설치하려 할 때 의존성에 의한 오류가 발생하는 경우가 있습니다. 이 경우 다음과 같은 순서대로 실행을 해 주시면 되겠습니다.


$ sudo apt-get install 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-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386

(libgl1-mesa-glx:i386 의존성을 해결하기 위해 먼저 설치)


$ sudo apt-get install libgl1-mesa-glx:i386


 이제부터 본격적으로 안드로이드 커널을 설치하는 단계에 들어가도록 하겠습니다. 우선 사용자 폴더에 bin이라는 이름의 폴더를 생성합니다.

$ mkdir ~/bin


다음으로 해당 폴더에 설치될 repo를 다른 폴더에서 쉽게 사용할 수 있도록 PATH를 추가합니다.

$ export PATH=$PATH:~/bin


이제 repo를 설치해 보도록 하겠습니다.

$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo


다운로드한 repo에 실행권한을 추가합니다.

$ chmod a+x ~/bin/repo


이로서 repo를 설치하였습니다. 안드로이드 커널을 설치할 폴더를 만드신 후 해당 폴더로 이동합니다.

$ mkdir ~/lollipop

$ cd ~/lollipop


커널을 다운받을 폴더로 이동하신 후 repo를 초기화 합니다. 해당 초기화 내용은 폴더 내에 저장됩니다.

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


맨 뒤에 굵은 글씨가 자신이 설치하고자 하는 안드로이드의 버전입니다. 자신이 설치하고자 하는 버전을 확인하기 위해서는 다음 사이트를 참조하시면 되겠습니다.

https://android.googlesource.com/platform/manifest



위 목록에서 자신이 설치하고자 하는 버전을 선택하신 후 실행하면 repo가 알아서 해당 버전만 설치해줍니다.


$ repo sync

 해당 명령어를 실행하자마자 바로 안드로이드 커널을 다운로드 하는 과정이 시작됩니다. 컴퓨터의 성능 및 인터넷 환경에 따라 빠르면 1시간내에 다운로드가 완료됩니다. 필자의 경우 약 3시간 30분 정도 소요되었습니다.



 다운로드가 완료된 안드로이드 커널(Lollipop)의 용량은 약 13.7GB를 차지하고 있습니다. 마지막으로 안드로이드 커널을 컴파일해 보도록 하겠습니다.


$ make -j4


 뒷부분의 -j4는 4개의 쓰레드를 수행하여 컴파일을 하겠다는 의미입니다. 쓰레드의 갯수는 자신의 컴퓨터의 코어 갯수로 설정하면 최적하게 컴파일이 수행될 수 있습니다. 


※가상머신 등 메모리의 크기나 Ubuntu 설치시 linux_swap 영역의 크기가 부족할 시 make 컴파일을 진행하는 도중에 실패로 종료되는 경우가 있습니다. 이를 해결하기 위해서는 두 가지의 용량을 더 크게 하거나 make 컴파일시 -j 옵션을 쓰지 않은 단일 thread로 컴파일을 하면 이를 해결할 수 있습니다. 단, 단인 thread로 컴파일 시 컴파일 속도가 현저하게 느려질 수 있습니다.(필자의 경우 약 2일 정도 소요된 것으로 확인되었습니다.)



참고문헌 : 인사이드안드로이드, 송형주 외 3인 저, 위키북스, 2010


안드로이드 프레임워크 프로그래밍(1) [입문 및 동작환경 구축]

 안드로이드 프로그래밍에 처음 입문하는 경우 거의 대부분의 분들이라면 안드로이드 SDK를 활용하여 애플리케이션을 제작하는 분들이 많으실 것이라 생각합니다. 물론 애플리케이션을 제작하는 것 만으로도 상당히 흥미있는 작업이라고 생각합니다. 물론 임베디드 시스템에 관심있으신 분들이라면 이보다 더 깊이 공부하고 싶어 하시는 분들도 계시리라 생각합니다.

 이번 포스팅은 안드로이드의 애플리케이션 제작에서 만족하지 않고 한 걸음 더 들어가 프레임워크를 다루는 것에 대해 이야기해 볼까 합니다.




 위 그림은 안드로이드 운영체제의 내부 구조입니다. 가장 아래 부분에는 잘 알려져 있는 대로 리눅스 커널로 구성되어 있으며 상단쪽이 바로 흔히 SDK와 Java를 활용한 애플리케이션이 동작하는 부분입니다. 안드로이드의 프레임워크는 애플리케이션 바로 아래쪽에 위치하여 애플리케이션이 요구하는 기능들을 제공해 주는 역할을 한다고 보실 수 있습니다. 이번에 우리들이 다루고자 하는 목표가 바로 위의 붉은 네모로 표시한 프레임워크를 다루는 데에 초점을 맟출 것입니다.


※준비 사항

- 리눅스가 설치된 컴퓨터(Ubuntu 12.04 버전 추천)

→ Gingerbread 이후 버전부터 64bit 환경의 리눅스를 사용해야 합니다. Froyo 이전의 버전은 32bit 사용이 가능합니다.

- Java Developer Kit

→ 안드로이드 애플리케이션을 제작할 때 쓰는 그 JDK입니다. Froyo 이전의 버전은 JDK 6, Gingerbread 이후 버전은 JDK 7 버전을 사용해야 합니다.

- 안드로이드 어플리케이션 개발 IDE(Eclipse)


※시작하기에 앞서

-본 포스팅은 작성 당시 안드로이드 최신 버전인 Lollipop(5.02)를 기준으로 설명합니다. Lollipop의 경우 64bit의 환경에서 진행해야 수월하게 진행하실 수 있습니다.


-자신의 컴퓨터가 Windows 환경이신 분의 경우 리눅스 운영체제를 동작시킬 수 있는 가상머신을 사용해야 합니다. 흔히 사용되는 가상머신으로 VirtualBox와 VMware가 있습니다. 가상머신을 사용하는 방법에 대해서는 아래의 포스팅을 참고해 주시기 바랍니다.


 가상머신으로 프레임워크를 구축하기 위해서는 하드웨어의 여유 공간이 최소 50GB(우분투 설치 공간 포함 약 60GB)정도는 확보하셔야 합니다. 최초 설치시 용량을 확보해 두지 못하면 나중에 다시 용량을 날려야 할 때 굉장히 고생하게 됩니다. 만일을 대비해서 최대 100GB정도 확보하시면 문제 없이 사용하실 수 있습니다.


Ubuntu 12.04(32bit)

http://ftp.daum.net/ubuntu-releases/precise/ubuntu-12.04.5-desktop-i386.iso


Ubuntu 12.04(64bit)

http://ftp.daum.net/ubuntu-releases/precise/ubuntu-12.04.5-desktop-amd64.iso


Virtualbox

https://www.virtualbox.org/wiki/Downloads


VMware

https://my.vmware.com/web/vmware/free#desktop_end_user_computing/vmware_player/6_0|PLAYER-604|product_downloads


VirtualBox에 Ubuntu 설치하기

VMware에 Ubuntu 설치하기



다음으로 JDK를 설치하는 과정이 필요합니다. Lollipop의 경우 JDK 1.7 버전을 설치하셔야 합니다.

Ubuntu에 JDK 설치하기


끝으로 이클립스를 설치합니다.


http://www.eclipse.org/downloads/?


자신의 Ubuntu의 버전에 맞는 프로그램을 다운로드 받습니다.




다운로드 받은 파일 내에는 이클립스 폴더가 있습니다. 입축을 해제하시면 바로 사용하실 수 있습니다.

다음으로 우분투에 리눅스용 SDK 패키지를 설치한다.


http://developer.android.com/sdk/index.html


 다운로드 사이트에 접속하신 후 계속 아래로 스크롤 하시면 SDK Tools Only 메뉴를 보실 수 있습니다. 이 곳에서 Linux 전용을 클릭하도록 합니다.



 압축파일을 확인하시면 다음과 같은 내용을 보실 수 있습니다. 해당 폴더를 적절한 곳에 압축을 해제하시면 되겠습니다.


 다음으로 설치한 Eclipse에 안드로이드 플러그인을 설치하도록 하겠습니다.



메뉴에서 Help ->Eclipse Marketplace...를 선택합니다.




 검색창에 'android development tools'를 검색하면 Google에서 제공하는 ADT for Eclipse 메뉴를 보실 수 있습니다. 오른쪽의 Install을 클릭하여 설치합니다.




위와 같이 나왔을 때 라이센스에 동의한다고 한 후 Finish 버튼을 눌러줍니다.



 다음과 같은 창이 나타나면 설치가 정상적으로 완료된 것입니다. Yes 버튼을 누르면 Eclipse가 다시 시작됩니다.



 이클립스를 다시 실행하면 위에서 보는 바와 같은 경고문이 등장합니다. 앞에서 설치하였던 SDK가 아직 이클립스와 연동이 되지 않은 상황에서 다음과 같이 발생합니다. Open Preferences를 클릭하여 SDK 폴더의 위치를 설정합니다.



 Browse...에서 위에서 압축을 풀었던 SDK 도구의 폴더를 선택하신 후 OK를 눌러주세요. 만약 경고문이 뜰 경우 아래쪽 이미 존재하는 SDK 사용 메뉴를 선택하시면 되겠습니다.




 이클립스 메뉴에서 Window -> Android SDK Manager 를 클릭하면



 우리들이 Windows에서 흔히 사용했던 Android SDK Manager를 보실 수 있습니다. 여기서 자신이 사용하고자 하는 안드로이드의 버전을 설치하면 이로서 프레임워크 구축 환경을 다루기 위한 구성요소의 준비가 끝납니다.


다음 포스팅에서는 안드로이드 커널을 다운로드 하는 방법과 이를 컴파일 하는 방법에 대해 다루어 보도록 하겠습니다.




참고문헌 : 인사이드안드로이드, 송형주 외 3인 저, 위키북스, 2010

안드로이드 Native(NDK) 소스를 간단하게 보는 방법

 안드로이드의 카메라 기능에 대해 알아보고 싶어서 직접 안드로이드 라이브러리 내부에 있는 클래스를 열어 이리저리 해집고 다니다가 다음과 같은 코드를 목격하게 되었습니다.




 JNI를 접해본 경험이 없으신 분들께서는 아마 난생 처음 보는 녀석인 native를 보고 당황하실 분들이 있으시리라 생각합니다.

 JNI란 Java Native Interface의 약자로, 아주 간단하게 설명드리자면 안드로이드를 C/C++로 구현할 수 있는 기능입니다! Java 소스코드는 안드로이드 내에 있는 Dalvic머신(Lolipop 이후부터는 ART)에서 구동됩니다만 안드로이드 폰 내의 센서나 커널 등을 다루게 될 때는 JNI를 통해 C/C++로 접근하여야 합니다.

 위의 경우도 Camera 센서를 구동하기 위해 NDK를 통해 해당 함수가 구현된 것을 native로 나타내고 있다고 볼 수 있습니다. 그렇다면 이 Native 코드는 직접 볼 수 있는걸까요?



 가장 확실한 방법은 안드로이드의 OS 커널을 직접 다운받아 해당 소스코드를 직접 찾아보는 방법입니다. 커널은 위 사이트에서 다운로드 하실 수 있습니다.


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


 하지만 커널을 직접 구경할 일이 없는 분들께 이 방법은 번거롭기만 합니다. 게다가 자신이 원하는 소스코드를 바로 찾는 것도 상당히 불편합니다. 그렇다면 좀 더 편하게 안드로이드 native 소스코드를 볼 수 잇는 방법은 없는걸까요?


 

 위 사이트는 안드로이드 OS에 있는 Android와 Kernel의 소스코드를 인터넷으로 볼 수 있도록 되어 있습니다. 검색 기능을 제공하고 있어 자신이 찾고자 하는 소스코드를 더 쉽게 찾을 수 있습니다.


http://androidxref.com/


 위 사이트에 접속하신 후 자신이 보고자 하는 안드로이드 버전을 클릭합니다. 여기서는 현 시점에서 최신버전인 Lolipop을 선택하였습니다.




 검색하기 원하는 버전을 선택하신 후 위 사진에서 붉은 네모칸으로 표시한 'select all'을 선택하신 후 왼쪽 'Full Search' 부분에 자신이 찾고자 하는 native 함수명을 입력합니다.



 다음과 같이 해당 함수명을 가지고 있는 소스코드들이 검색에 잡히는 것을 확인하실 수 있습니다. 해당 함수가 존재하는 소스코드는 다음과 같이 찾으실 수 있습니다.


 Java 소스코드에 있는 native 함수가 있는 클래스의 패지명이 소스코드의 명칭이 될 경우가 대부분입니다. 예를들어 Camera.java가 위치한 패키지는 android.hardware.Camera입니다. 즉, jni 내부의 소스코드의 명칭은 android_hardware_camera.cpp가 해당 코드라고 할 수 있습니다.



 Native 소스코드 내의 함수명은 '클래스의 패키지경로_함수명()'으로 구성되어 있습니다. 즉 android.hardware.Camera 클래스 내에 있는 native 함수인 native_setup 함수는 해당 소스코드 내에서는 

'android_hardware_Camera_native_setup(JNIEnv *env, jobject thiz, ...)'

와 같은 형식으로 구성되어 있음을 확인하실 수 있습니다.

  • 2016.12.14 11:25 ADDR 수정/삭제 답글

    비밀댓글입니다

    • Justin T. 2016.12.14 11:30 신고 수정/삭제

      죄송합니다. 비밀댓글에는 답변을 드리지 않습니다.
      그리고 해당 포스트와 관련없는 이야기의 경우 방명록을 이용해주시기 바랍니다.