티스토리 뷰

Android

[Android] 안드로이드란?

도토리흑미 2020. 1. 2. 11:55

안녕하세요. 이번 시간에는 안드로이드 개발을 시작하기전에 안드로이드란 무엇인지 알아보는 시간을 갖겠습니다.

대부분 스마트폰을 사용하는 요즘 안드로이드가 뭔지 전혀 모른다거나 생소하다고 느끼는 분들이 거의 없겠지만 

안드로이드가 언제 시작되어서 지금까지 유지되어 오는지, 어떤 구성으로 동작하는지 간단히 알아보면서 

개발하기전에 흥미를 유발하고 전혀 모르는 상태에서 시작하는 것보다 조금이나마 도움이 될 수 있으면 좋겠습니다.

 

 

1. 안드로이드의 역사

안드로이드 주식회사는 캘리포니아에 있는 작은 벤처기업이었습니다. 2005년 7월 구글은 데스크탑에서 검색 엔진이라는 한계를 벗어나기 위해 모바일 시장으로의 진입을 위해 안드로이드 주식회사를 인수하게 됩니다. 안드로이드 주식회사의 설립자 중 한명인 앤디 루빈 등은 인수된 후에 구글에서 일하며 리눅스 커널에 기반을 둔 모바일 장치 플랫폼을 개발하게 됩니다. 

그 후 2007년 11월 구글은 삼성전자, 텍사스 인스트루먼트, 모토로라 등으로 구성된 오픈 핸드셋 얼라이언스(OHA) 컨소시엄을 구성하게 됩니다. 이미 윈도우 모바일이나 심비안 등 다른 휴대폰 운영체제가 있었던 상황에서 후발주자로 나섰던 구글은 다른 OS와 차별화를 하기 위해 개방형 플랫폼을 선택했습니다.

이렇게 구성된 OHA는 2008년 9월 리눅스 기반의 안드로이드 SDK 1.0 버전을 발표합니다. 이렇게 만들어진 안드로이드 플랫폼을 탑재한 최초의 스마트폰이 대만의 HTC가 만들어서 이동통신사 T-모바일에 납품한 G1입니다.

 

2. 안드로이드 버전

1.0 버전에서는 별다른 코드네임이 쓰이지 않았습니다. 1.0 버전에서 알파(alpha), 1.1버전에서 베타(beta)라 부르거나, A부터 알파벳 순으로 로봇의 이름을 붙이려 Astro Boy라는 이름을 내부에서 붙였고 1.1에서는 이 규칙을 위반한 채 디저트가 좋다는 PM의 취향으로 애플파이(Applepie) 또는 바나나브레드(Banana bread)라 표현하기도 했지만 공식적으로는 1.5버전부터 지금의 체제를 완성했습니다.

 

 

3. 안드로이드 구조

안드로이드 플랫폼의 주요 구성 요소에 대해 알아보겠습니다.

초심자에게 다소 어려울 수 있는 내용이지만 안드로이드가 어떤 구조이고 어떻게 어플리케이션이 구동되는지

대략적인 구조를 파악하면 개발하는데 도움이 될 것 같습니다.

 

3-1. 리눅스 커널

안드로이드 역사에서도 알 수 있듯이 안드로이드는 리눅스 커널에 기반을 둔 OS입니다. 

쉽게 말해서 커널이란? 스마트폰인 하드웨어와 안드로이드인 OS를 이어주는 다리라고 생각하시면 됩니다.

리눅스 커널에서 하는 역활은 스레딩 및 하위 수준의 메모리 관리하며 

안드로이드의 주요 보안 기능을 활용하고 하드웨어 드라이버(카메라, 블루투스 등)를 제어합니다.

 

3-2. 하드웨어 추상화 계층 (HAL : Hardware Abstraction Layer)

하드웨어 추상화는 부품은 같지만 그 부품으로 설계할 수 있는 하드웨어의 종류가 점차 늘어나면서 

커널이 새로운 장치 접근에 어려움이 있어 하드웨어의 차이에 상관없이 일관성있는 인터페이스를 제공하기 위해

개발되었습니다.

안드로이드에서의 HAL은 Java API 프레임워크에 대해 기기 하드웨어 기능을 사용할 수 있게 

표준 인터페이스를 제공합니다. 여러 라이브러리 모듈로 구성되어 있으며, 카메라 또는 블루투스 모듈과 같은

특정 유형의 하드웨어 구성 요소를 위한 인터페이스를 구현합니다. 프레임워크 API가 기기 하드웨어에 

액세스하기 위해 호출을 수행하면 Android 시스템이 해당 하드웨어 구성 요소에 대한 라이브러리 모듈을 

로드합니다.

 

3-3. 안드로이드 런타임

안드로이드 런타임은 줄여서 ART라고도 하며 주요 기능은 다음과 같습니다.

 

 - AOT(Ahead-Of-Time) 및 JIT(Just-In-Time) 컴파일

 - 최적화된 가비지 수집(GC)

 - 전용 샘플링 프로파일러, 상세 진단 예외 및 크래시 보고, watchpoint를 설정하여 특정 필드를 모니터링할 수 있는 기능을 비롯한 향상된 디버깅 지원 기능

 

처음 보시면 다소 어려운 내용이 많을거라 생각합니다.

우선 컴파일이란 사용자가 하고자하는 것을 하드웨어가 알아들을 수 있도록 번역하는 프로그램입니다.

 

안드로이드의 기본 언어인 Java 언어의 철학 중 하나는 한번 프로그래밍을 하면

플랫폼에 상관없이 실행 가능하게 하는것인데 이것을 위하여 JVM (Java Virtual Machine) 이란 

장치를 만들어 놓습니다. Java로 작성된 프로그램을 컴파일하면 JVM이 읽을 수 있는 중간언어로 번역되고 

JVM은 각 플랫폼이 알아들을 수 있는 언어로 번역하여 프로그램을 실행시킵니다.

이런 번역과정 때문에 태생적으로 Native 언어들에 비해 속도가 느리다는 단점이 있습니다.

이런 단점을 개선하기 위해 JIT (Just-In-Time) 컴파일러가 추가됩니다.

 

안드로이드에서 JVM의 안드로이드 구조에 맞추어서 구동할 수 있도록 만들어진 것이 

JIT 컴파일러를 사용하는 달빅VM (Dalvik VM)과 AOT 컴파일러를 사용하는 ART 입니다.

 

달빅 VM은 사용자가 앱을 실행할 때마다 성능 개선이 있을 수 있는 부분에 대해 네이티브 코드로 변환합니다.

이를 JIT 컴파일이라고 하며, 이 방식은 다양한 하드웨어나 아키텍쳐에서 실행할 수 있는 장점이 있지만

성능과 배터리에 영향을 주며 컴파일된 코드가 메모리에 올라가 메모리도 늘어난다는 단점이 있었습니다.

 

이런 부분을 해결하기 위해 AOT 컴파일러 기반인 ART입니다.

ART는 Android RunTime의 약자이며, 앱을 설치할 때 완전히 네이티브 코드로 변환하여 설치합니다.

달빅에 비해 코드 인터럽트 및 JIT 컴파일 하는 시간을 제거하여 압도적으로 성능이 개선되었습니다.

하지만 설치 시간이 오래걸리고, 컴파일 코드를 미리 생성하기 때문에 파일 용량이 커진다는 단점이 있습니다.

 

안드로이드 7.0 부터는 앱 설치시간을 단축하기 위해 최초 설치시에는 JIT을 사용하고

대기모드 상태일 때 일부분 컴파일 작업을 실시하여 점진적으로 AOT 방식을 사용하므로써

달빅과 ART의 장점들을 살려 더 빠른 성능을 내도록 하였습니다.

 

3-4. 네이티브 C/C++ 라이브러리

ART 및 HAL 등의 많은 핵심 Android 시스템 구성 요소와 서비스가 C/C++로 작성된 네이티브 라이브러리를

필요로 하는 네이티브 코드를 기반으로 빌드되었습니다. 따라서 C 또는 C++ 코드가 필요한 앱을 개발하는 경우

Android NDK를 사용하여 네이티브 코드에서 직접 네이티브 플랫폼 라이브러리에 접근할 수 있습니다.

 

3-5. Java API 프레임워크

Android OS의 전체 기능은 Java API를 통해 접근할 수 있습니다. 

이러한 API는 핵심 모듈식 시스템 구성 요소 및 서비스 재활용을 단순화하여 

Android 앱을 제작하는데 필요한 빌딩 블록을 구성하며, 이 빌딩 블록에는 다음 항목들이 포함됩니다.

 

 - View System - 목록, 그리드, 텍스트 상자, 버튼 및 삽입 가능한 웹 브라우저를 포함하여 앱의 UI를 빌드하는데 사용 가능

 - Rosource Manager - 현지화된 문자열, 그래픽 및 레이아웃 파일과 같은 코드가 아닌 리소스에 대한 접근 제공

 - Notification Manager - 모든 앱이 상태 표시줄에 사용자 지정 알림을 표시할 수 있도록 지원

 - Activity Manager - 앱의 수명 주기를 관리하고 공통 탐색 백 스택 제공

 - Contents Providers - 앱이 주소록 앱과 같은 다른 앱의 데이터에 액세스하거나 자신의 데이터를 공유할 수 있도록 지원

 

개발자는 Android 시스템 앱이 사용하는 것과 동일한 프레임워크 API에 대한 전체 접근 권한을 가집니다.

 

3-6. 시스템 앱

Android는 이메일, SMS 메시징, 캘린더, 인터넷 검색, 주소록 등의 주요 앱 세트와 함께 제공됩니다.

플랫폼에 기본적으로 포함된 앱에는 사용자가 설치하도록 선택하는 앱과 구별되는 특별한 상태가 없습니다.

따라서 타사 앱이 사용자의 기본 웹 브라우저, SMS 메시징 또는 기본 키보드가 될 수 있습니다.

(단, 시스템의 설정 앱 등 예외가 적용될 수 있습니다.)

 

시스템 앱은 사용자를 위한 앱으로도 작동하고 개발자가 자신의 앱에서 액세스 할 수 있는 주요 기능을 제공하기 

위한 용도로 작동합니다. 예를 들어, 앱이 SMS 메시지를 제공하고자 할 경우 해당 기능을 직접 빌드할 필요가 

없습니다. 그대신 이미 설치된 SMS 앱을 호출하여 지정한 받는 사람에게 메시지를 제공할 수 있습니다.

 

이렇게 두 번의 강좌를 통해 스마트폰과 모바일 운영체제, 모바일 운영체제 중에서도 

안드로이드의 역사와 버전, 구조에 대해서 알아봤는데, 숙지하실 것 까진 아니고 그냥 이런게 있다

정도로 알아두고 가시면 나중에 개발하는 데 있어 도움이 될 것 같습니다.