티스토리 뷰

/* 본 게시물은 '핵심만 골라 배우는 안드로이드 스튜디오 & 프로그래밍(Android Studio 2 Development Essentials) | 닐 스미스 지음' 의 내용을 토대로 작성되었습니다. */


# 안드로이드 소프트웨어 스택


 안드로이드 시스템은 소프트웨어 스택(stack)의 형태로 구성된다. 마치 레고(Lego) 블록을 조립해 층층히 쌓아놓듯이 애플리케이션, 운영체제, 런타임 환경, 미들웨어, 각종 서비스와 라이브러리 등이 겹겹이 모여 구성된 것이라고 볼 수 있다. 이 아키텍처는 아래의 그림과 같이 시각적으로 표현할 수 있다.


 스택의 각 계층과 요소는 긴밀하게 통합되어 있다. 그리고 모바일 장치를 위한 최적의 애플리케이션 개발과 실행 환경을 제공하기 위해 신중하게 조율되어 있다.



# 리눅스 커널


 안드로이드 소프트웨어 스택의 최하단에 위치한다. 리눅스 커널장치 하드웨어의 기반 운영체제 역할을 담당한다. 즉, 멀티태스킹을 지원하고 메모리 관리와 프로세스 실행 및 관리 등을 처리하는 핵심 시스템 서비스를 비롯해서 네트워크 인터페이스와 각종 하드웨어 인터페이스를 위한 장치 드라이버(디스플레이, 와이파이, 오디오 등)를 제공한다.


 원조 리눅스 커널은 1991년 리누스 토발즈(Linus Torvalds)가 개발하였으며, 자유 소프트웨어재단(FSF, Free Software Foundation)의 리처드 스톨만(Richard Stallman)이 개발한 각종 도구와 유틸리티 및 컴파일러 등과 결합되어 GNU/Linux라는 완전한 운영체제가 되었다. 그리고 그 이후에 우분투나 레드햇과 같은 다양한 리눅스 배포판들이 그것을 기반으로 나오게 되었다. 단, 리눅스 커널은 동일한 것을 사용한다.


 안드로이드는 리눅스의 커널만을 사용한다. 원래 리눅스는 데스크톱이나 서버의 컴퓨터에서 사용하기 위해 개발되었다. 실제로 지금은 리눅스가 엔터프라이즈 서버 환경에서 널리 사용된다. 그리고 리눅스 커널의 효율성과 성능이 좋으므로 안드로이드 소프트웨어 스택의 핵심으로 모바일 장치에서도 사용된다.



# 안드로이드 런타임 - ART (Android RunTime)


 안드로이드 스튜디오에서 안드로이드 애플리케이션이 빌드될 때는 바이트 코드 형태(DEX, Dalvik Executable)로 컴파일된다. 그리고 장치에 애플리케이션이 설치될 때 안드로이드 런타임(ART, Android RunTime)이 AOT(Ahead-Of-Time) 컴파일을 수행하여 바이트 코드를 장치의 프로세서(CPU)가 필요로 하는 네이티브 명령어(기계어)로 일괄 변환한다.


 이렇게 변환된 형태를 ELF(Executable and Linkable Format)라고 한다. 따라서 애플리케이션이 론칭될 때마다 ELF 버전으로 실행되므로 애플리케이션의 실행 속도가 더 빠르고 배터리 수명도 향상된다.


 참고로 5.x(롤리팝) 이전의 안드로이드 버전에서는 애플리케이션이 론칭될 때마다 JIT(Just-in-Time) 컴파일 방법을 사용하여 달빅 가상 머신(VM, Virtual Machine)에서 바이트 코드를 하나씩 기계어로 변환하면서 실행하였다.


/* 밑에는 JIT 와 달빅 가상머신에 대한 부연 설명 */


/* JIT 컴파일(just-in-time-compilation) 또는 동적 번역(dynamic translation)은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다. 이 기법은 프로그램의 실행 속도를 빠르게 하기 위해 사용된다.


 전통적인 입장에서 컴퓨터 프로그램을 만드는 방법은 두 가지가 있는데, 인터프리트 방식정적 컴파일 방식으로 나눌 수 있다. 이 중 인터프리트 방식은 실행 중 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행하는 반면 컴파일은 실행하기 전에 프로그램 코드를 기계어로 번역한다.


 JIT 컴파일러두 가지의 방식을 혼합한 방식으로 생각할 수 있는데, 실행 시점에서 기계어 코드를 생성하면서 그 코드를 캐싱하여, 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다. 최근 자바 가상 머신과 .NET, V8(node.js)에서는 JIT 컴파일을 지원한다.


 즉, 자바 컴파일러가 자바 프로그램 코드를 바이트 코드로 변환한 다음, 실제 바이트코드를 실행하는 시점에서 가상 머신이 바이트 코드를 기계어로 변환한다. */


/* 달빅 가상 머신(Dalvik virtual machine)레지스터 머신 형태의(register-based) 가상 머신이다. 댄 본스타인이 다른 구글 엔지니어들의 도움 하에 설계/구현하였다. 현재 안드로이드 (4.4.4이전)휴대 전화 플랫폼에 들어간다. 달빅 가상 머신은 적은 메모리 요구 사양에 최적화되어 있다. 밑에 깔린 프로세스 아이솔레이션(process isolation), 메모리 관리, 스레딩 지원 등 운영 체제의 지원에 의존하나, 여러 개의 달빅 VM 인스턴스가 동시에 돌 수 있다.


 달빅 가상 머신은 종종 자바 가상 머신으로 혼동하는 경우가 있으나, 달빅 가상 머신은 자바 바이트 코드를 사용하지 않기 때문에 자바 가상 머신과는 다르다. 대신, 안드로이드 SDK에 함께 들어 있는 dx라고 이름 붙은 도구를 이용하면 자바 클래스 파일들을 .dex포맷으로 바꿀 수 있다.


 달빅 가상 머신은 본스타인이 명명하였다. 아이슬란드 에이야표르수르에 있는 달비크라는 이름의 어촌 마을의 이름을 따왔다. 댄 본스타인의 조상이 살았던 곳이라고 한다. */ 출처: 위키백과



# 안드로이드 라이브러리


 문자열 처리, 네트워킹, 파일 처리와 같은 일반적인 작업을 지원하기 위해 제공되는 표준 자바 라이브러리에 추가하여 안드로이드 개발 환경에는 안드로이드 라이브러리도 포함된다. 이것은 안드로이드 애플리케이션 개발에 특화된 다양한 자바 기반 라이브러리다. 이 부류의 라이브러리 예로는 애플리케이션 프레임워크 라이브러리를 포함하여 사용자 인터페이스 생성, 그래픽 드로잉, 데이터베이스 액세스 등을 가능하게 해주는 라이브러리가 있다.


 안드로이드 개발자들이 사용 가능한 핵심 안드로이드 라이브러리를 요약하면 아래와 같다.


  • android.app - 애플리케이션 모델의 액세스를 제공하며, 모든 안드로이드 애플리케이션의 초석이 되는 라이브러리다.

  • android.content - 애플리케이션과 애플리케이션 컴포넌트 간의 콘텐트 액세스와 메시징을 가능하게 한다.

  • android.database - 콘텐트 제공자가 게시한 데이터를 액세스하는 데 사용되고, SQLite 데이터벵이스 관리 클래스를 포함한다.

  • android.graphics - 색상, 포인트, 컬러, 사각형, 캔버스를 포함하는 낮은 수준의 2D 그래픽 드로잉 API다.

  • android.hardware - 가속도 센서와 광 센서 같은 하드웨어의 액세스를 제공하는 API를 나타낸다.

  • android.opengl - OpenGL ES 3D 그래픽 렌더링 API의 자바 인터페이스다.

  • android.os - 메시지, 시스템 서비스, 프로세스 간 통신을 포함하는 운영 체제 서비스의 액세스를 애플리케이션에 제공한다.

  • android.media - 오디오와 비디오의 재생을 할 수 있는 클래스를 제공한다.

  • android.net - 네트워크 액세스를 제공하는 API, 장치의 무선 네트워크 액세스를 제공하는 android.net.wifi를 포함한다.

  • android.print - 안드로이드 애플리케이션에서 프린터로 콘텐트를 전송할 수 있는 클래스들을 포함한다.

  • android.provider - 캘린더나 연락처 애플리케이션에서 유지하는 것과 같은 표준 안드로이드 콘텐트 제공자 데이터베이스의 액세스를 제공하는 클래스들이 있다.

  • android.text - 장치 화면에 텍스트를 나타내고 처리하는 데 사용된다.

  • android.util - 문자열과 숫자 변환, XML 처리, 날짜와 시간 처리 등의 일을 수행하는 유틸리티 클래스들이 있다.

  • android.view - 애플리케이션의 사용자 인터페이스를 구성하는 뷰 클래스들이 있다.

  • android.widget - 버튼, 라벨, 리스트 뷰, 레이아웃 매니저, 라디오 버튼과 같은 사전 제작된 사용자 인터페이스 컴포넌트들이 있다.

  • android.webkit - 웹 브라우징 능력을 애플리케이션에 구성할 수 있게 해주는 클래스들이 있다.



# C / C++ 라이브러리


 위에서 다룬 안드로이드 런타임 코어 라이브러리는 자바 기반이며, 개발자가 안드로이드 애플리케이션을 작성하는 데 필요한 주요 API를 제공한다. 그러나 코어 라이브러리는 대부분의 실제 작업을 직접 수행하지 않는다. 코어 라이브러리는 C / C++ 기반 라이브러리의 코드를 감싸고 있는 자바 래퍼(wrapper)다.


 예를 들어, 장치 화면에 3D 그래픽을 그리기 위해 android.opengl 라이브러리의 코드를 호출하면 그 코드에서는 OpenGL ES C++ 라이브러리의 코드를 호출한다. 결국 이 코드는 내부의 리눅스 커널과 함께 동작하게 된다.


 C / C++ 라이브러리에는 폭넓고 다양한 함수들이 포함되어 있다. 예를 들어, 2D와 3D 그래픽, SSL(Secure Sockets Layer) 통신, SQLite 데이터베이스 관리 시스템, 오디오와 비디오 재생, 비트맵과 벡터 폰트 렌더링, 표준 C 시스템 라이브러리(libc) 등이다.


 보통의 안드로이드 애플리케이션 개발자는 자바 기반 안드로이드 코어 라이브러리 API를 통해서만 C / C++ 라이브러리를 액세스할 것이다. 그러나 이 라이브러리를 직접 액세스할 필요가 있을 경우에는 안드로이드 NDK(Native Development Kit)를 사용하면 된다. 자바 코드에서 JNI(Java Native Interface)를 사용해서 자바 외의 다른 프로그래밍 언어(C나 C++ 등)의 네이티브 메서드를 호출하기 위한 것이 NDK의 목적이다.



# 애플리케이션 프레임 워크


안드로이드 애플리케이션이 실행되고 관리되는 환경을 형성하는 서비스의 집합체가 애플리케이션 프레임워크다. 안드로이드 애플리케이션들이 재사용과 상호 운용 및 교체 가능한 컴포넌트로 구성된다는 개념을 이 프레임워크가 구현한다.


 안드로이드 프레임워크는 아래와 같은 핵심 서비스를 포함한다.


  • 액티비티 매니저(Activity Manager) - 애플리케이션의 생명주기(lifecycle)와 액티비티 스택을 제어한다.

  • 콘텐트 제공자(Content Provider) - 애플리케이션이 다른 애플리케이션과 데이터를 게시 및 공유할 수 있게 해준다.

  • 리소스 매니저(Resource Manager) - 코드에 포함되지 않는 리소스(문자열, 색상 설정, 사용자 인터페이스 레이아웃 등)의 액세스를 제공한다.

  • 통지 매니저(Notifications Manager) - 애플리케이션이 사용자에게 경고나 통지를 보여줄 수 있게 해준다.

  • 뷰 시스템(View System) - 애플리케이션 사용자 인터페이스 생성에 사용되는 확장 가능한 뷰들의 집합이다.

  • 패키지 매니저(Package Manager) - 애플리케이션에서 장치에 설정된 다른 애플리케이션에 관한 정보를 알 수 있는 시스템이다.

  • 텔레포니 매니저(Telephony Manager) - 장치에서 사용 가능한 전화 서비스에 관한 정보(상태나 가입자 등)를 애플리케이션에 제공한다.

  • 위치 매니저(Location Manager) - 앱이 위치 변경 정보를 수신할 수 있게 해주는 위치 서비스의 액세스를 제공한다.



# 애플리케이션


 안드로이드 소프트웨어 스택의 맨 위에 있는 것이 애플리케이션이다. 특별한 안드로이드 애플리케이션으로 제공되는 기본 애플리케이션(웹 브라우저와 이메일 애플리케이션 등)과 장치 구입 후 사용자가 설치한 애플리케이션으로 구성되는 것이 애플리케이션 계층이다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday