[Andorid]안드로이드에 대해서

rxjw95·2020년 5월 13일
0

안드로이드는 무엇인가

안드로이드는 구글에서 만든 스마트폰용 운영체제입니다.

그렇다면 운영체제는 무엇일까?

시스템의 자원들을 효율적으로 관리하며, 사용자가 컴퓨터를 편리하고, 효과적으로 사용할 수 있도록 환경을 제공하는 여러 프로그램의 모임입니다.

즉 운영체제는 컴퓨터 사용자와 컴퓨터 하드웨어 간의 인터페이스로서 동작하는 시스템 소프트웨어

즉, 안드로이드는 미들웨어, 사용자 인터페이스, 어플리케이션, MMS 서비스 등을 하나로 묶어 서비스를 제공하며 다양한 어플리케이션을 만들어 설치하면 실행될 수 있도록 구성된 어플리케이션 플랫폼이다.

갤럭시 기종의 스마트폰을 사용하는 사람들. 당신이 쓰고 있는 모든 기능이 바로 android라는 운영체제가 그 기능이 동작할 수 있도록 해주는 것이다.


안드로이드는 어떻게 구성되었나

안드로이드는 리눅스(Linux)를 기반으로 제작되었고 언어는 자바를 사용합니다.

리눅스 커널

커널은 하드웨어와 소프트웨어를 연결해주는 다리와 같은 중추적인 역할을 한다.

리눅스 운영체제가 가지고 있는 기본적인 기능들을 가지고 있으며 여기에 전세계에 공개된 오픈소스이기 때문에 안드로이드 시스템이 동작을 하기 필요한 기능들이 추가된 형태로 구성되어 있다.

하드웨어를 구동하기 위한 디바이스 드라이버, 메모리 관리, 프로세스 관리, 네트워크 관리등과 같은 운영체제의 기본 역할을 담당한다.


하드웨어 추상화 계층(HAL)

복잡한 내부를 감추고 일관성 있는 인터페이스를 제공하기 위해 같은 종류의 하드웨어에 대한 공통 명령어 집합 들로 이루어져 있는것을 의미한다.

C와C++로 짜여져있다고 한다.

상위 수준의 Java API 프레임워크에 기기 하드웨어 기능을 사용할 수 있도록 표준 인터페이스를 제공

즉 프레임워크 API가 기기 하드웨어에 액세스하기 위해 호출을 수행하면 Android 시스템이 해당 하드웨어 구성 요소에 대한 라이브러리 모듈을 로드한다.

하드웨어 추상화 계층이 필요한 이유

모바일 장치의 하드웨어가 다르더라도 상위 계층에 균일한 환경을 제공해준다.
상위 시스템에 영향을 주지 않고 수정하거나 기능을 구현할 수 있다.


안드로이드 런타임(ART)

Android 버전 5.0(API 레벨 21) 이전 버전에서는 Dalvik이 Android 런타임었다.

Dalvic Virtual Machine은 JIT(Just In time)컴파일러를 기반하고 있다.

Android 버전 5.0(API 레벨 21 Lollipop) 이상을 실행하는 기기의 경우, 각 앱이 자체 프로세스 내에서 자체 ART 인스턴스로 실행됩니다.

... 말잇못, 점점 어려워지는구만..? 시스템 엔지니어가 되는 느낌..ㅎ

너무 딥하게 들어가진 않겠다.(사실 컴파일러의 구조까지 면밀히 파헤치면 뇌가 타오를지도 모른다.)

DVM(Dalvik Virtual Machine)의 JIT(Just-In-Time) 컴파일러

우선, C/C++는 전체 코드에 대해 컴파일 후에 프로그램이 실행이 된다.
visual studio 에서 ctrl + f5 를 맨 처음 누를 때와 그 다음 누를 때 실행 속도를 보면 이해가 될 것이다.

반면에 JIT는 프로그램을 실행하는 시점(런타임)에서 필요한 부분을 즉석으로 컴파일하는 방식을 말한다.

JIT 컴파일러는 같은 코드를 매번 해석하는 대신 처음 실행될 때 인터프리트를 하면서 자주 쓰이는 코드를 캐싱한 뒤, 이후에는 캐싱된 코드를 가져다 쓰기 때문에 인터프리터의 느린 실행 속도를 개선할 수 있다.

Java도 bytecode를 기계어로 번역할 때 JIT 컴파일러를 사용한다.

안드로이드의 기존 DVM에서 애플리케이션 실행 시 위와 같은 동작을 한다.

아래의 그림들을 보며 흐름을 파악해보자.

그리고 아래 그림은 캐싱 처리 흐름도이다.

이까지!


ART(Android RunTime)의 AOT(Ahead-Of-Time) 컴파일러

우선, 시작하자면 ART는 VM이 아니다. 기계어로 해석된 앱을 실행시키기 위한 런타임 라이브러리이다.

기존의 DVM은 앱 실행 시 인터프리터 또는 JIT 컴파일러를 통해 해석한 기계어를 저장하고 실행한다. 하지만 ART는 AOT 컴파일러를 사용하여 앱을 설치할 때 기계어로 해석을 완료해놓는다.

따라서, 여기서 발생하는 앱설 치 시 기계어로 해석하는 비용에 의한 설치 속도가 비교적 느려지지만 실행에서는 비교적 더 빠르다. (어차피, 플레이스토어에서 설치 눌러놓고 백그라운드 돌리면 되니 장점이 더 부각된다고 생각한다.)

그림을 보며 이해해보자.

dex : Android용으로 특별히 설계된 바이트코드 형식으로, 최소 메모리 공간에 맞게 최적화되어 있다.
odex : optimized dex

그리고 단점은 변환 과정을 살펴보면 OAT 파일은 dex/odex 파일을 포함하고 있어서 용량이 커진다.

이까지!


두 컴파일러 정리

JIT의 주요 특징

  • 앱이 실행되는 순간 자주 사용되는 바이트 코드를 컴파일하여 Machine Code로 변환 후 캐싱하여 RAM에 올립니다.

  • 화면 전환 또는 앱이 실행 될 때마다 필요한 코드를 실시간 컴파일 하기 때문에 그 시간만큼 사용성에 있어서 latency가 발생할 수 밖에 없습니다.

  • 컴파일이 빈번하게 발생되기 때문에 RAM 점유율, 배터리 소모량 증가 등의 이슈도 있습니다.

  • 장점으로는, AOT 대비 APP 설치 시간이 매우 빠릅니다. 설치 할때 컴파일을 하지 않기 때문입니다.

  • AOT 대비 앱 용량이 작습니다.

AOT의 주요 특징

  • Android Kitkat 버전에 도입된 ART (Android Runtime) 에서 사용되는 컴파일 방식입니다.

  • 앱 설치 할때 모든 코드를 Machine Code로 변환 후 ROM에 저장합니다.

  • 앱 설치 속도가 JIT에 비하여 매우 느립니다.

  • 앱 실행시 컴파일을 하지 않아도 되기 때문에 컴파일로 인해 발생될수 있는 latency가 없어서 매우 빠릅니다.

  • 미리 컴파일 후에 ROM에 저장하기 때문에 용량이 큽니다. (JIT 대비 보통 1.5배 ~ 최대 2배)

그리고 안드로이드 N 버전부터는 둘다 사용되는 하이브리드 형태로 사용되고 있다.


JNI(Java Native Interface)

JNI는 자바코드에서 C나 C++ 라이브러리를 호출할 수 있도록 만들어진 규약이다.

안드로이드는 가상머신 위에서 돌아가고 그 내부는 리눅스 기반 OS이므로 C로 작성되어있다. 자바로 짜는 프로그램이 있을 때 직접적으로 C로 개발된 것을 사용하고 싶을 때 나온 것이다.


네이티브 라이브러리

ART 및 HAL 등의 많은 핵심 Android 시스템 구성 요소와 서비스가 C 및 C++로 작성된 네이티브 라이브러리를 필요로 하는 네이티브 코드를 기반으로 빌드되어있다.

Android 플랫폼은 Java 프레임워크 API를 제공하여 이러한 일부 네이티브 라이브러리의 기능을 앱에 노출한다. 예를 들어, Android 프레임워크의 JAVA OpenGL를 통해 OpenGL ES에 액세스하여 앱에서 2D 및 3D 그래픽을 그리고 조작할 수 있는 지원 기능을 추가할 수 있다.

C 또는 C++ 코드가 필요한 앱을 개발하는 경우에는 Android NDK를 사용하여 네이티브 코드에서 직접 몇몇 네이티브 플랫폼 라이브러리에 액세스할 수 있다.


JAVA API 프레임워크

안드로이드 OS의 전체 기능은 JAVA로 작성된 API를 통해서 접근이 가능하다

이 API는 핵심 시스템 구성요소 모듈과 서비스 재사용을 단순화하여준다.

다음과 같은 항목을 가지고 있다

  • 뷰 시스템

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

  • Resource Manager

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

  • Notification Manager

    모든 앱이 상태 표시줄(상단바,상태바)에 사용자 지정 알림을 표시할 수 있도록 지원

  • Activity Manager

    앱의 수명 주기를 관리하고 공통 탐색 백 스택(일종의 후입선출) 제공

  • Content Providers

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

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


시스템 앱

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

플랫폼에 기본적으로 포함된 앱에는 사용자가 설치하도록 선택하는 앱과 구별되는 특별한 상태가 없습니다. 따라서 타사 앱이 사용자의 기본 웹 브라우저, SMS 메시징 또는 기본 키보드가 될 수 있습니다(단, 시스템의 설정 앱 등 가지 예외가 적용될 수 있음).

시스템 앱은 사용자를 위한 앱으로도 작동하고 개발자가 자신의 앱에서 액세스할 수 있는 주요 기능을 제공하기 위한 용도로도 작동한다. 예를 들어, 앱이 SMS 메시지를 제공하고자 할 경우 해당 기능을 직접 빌드할 필요가 없다. 그 대신, 이미 설치된 SMS 앱을 호출하여 지정한 받는 사람에게 메시지를 제공할 수 있다.


안드로이드 버전

안드로이드 버전은 기존 알파벳 순서의 앞글자를 따서 디저트 이름으로 배포를 했었는데(version 1, 2는 제외)

  1. Cubcake
  2. Donut
  3. Eclair
  4. Proyo
    여기까지 version 0.5~ version 2.2
  5. GingerBread (version 2.3)
  6. HoneyComb (version 3)
  7. IceCreamSandwic (version 4.0)
  8. JellyBean (version 4.1~4.3)
  9. KitKat (version 4.4)
  10. LolliPop (version 5)
  11. MarshMallow (version 6)
  12. Nougat (version 7)
  13. Oreo (version 8)
  14. Pie (version 9)

Pie 이후, 안드로이드 + 숫자를 사용하고 있다. 그 이유는 발음 문제, 국가 이해관계에 따라 폐지하게 되었다.
나름 귀여웠는데, 아쉽다...


안드로이드 생긴건 귀여운데, 속은 아니구나


refs.
서준수님의 brunch
서준수님의 brunch
google developer

profile
32bit 뇌에서 64bit 뇌가 될 때까지

0개의 댓글