ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Android Architecture(안드로이드 구조)
    Android/Concept 2019. 7. 26. 19:51

    공부 할 겸 안드로이드 구조에 대해 써봅니다!

     

    안드로이드 구조

     안드로이드 구조는 왼쪽의 사진과 같이 대표적으로 5계층으로 나뉘어져 있습니다.


    • 리눅스 커널 계층

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

    • Native 라이브러리/안드로이드 런타임 계층

    • 프레임워크 계층

    • 어플리케이션 계층


     먼저 아셔야 할 것은 안드로이드의 운영체제(OS)는 Linux 기반이며, 사용되는 언어는 Java입니다.

     

     

     

     

     

     

     

     

     

     

     

    리눅스 커널 계층

     네. 운영체제가 리눅스 기반으로 만들어져 있어서 커널 또한 리눅스로 이루어져 있습니다.


     커널(Kernel)이란 영어 단어 뜻은 '알맹이' 라는 뜻인데 컴퓨터 쪽에선 '핵심'이라는 뜻이라고 합니다. 얘가 하는 짓은 운영체제의 관리자? 느낌입니다. 운영체제의 일들을 일반 사용자들이 건드리질 못하니까 그 사이 다리 역할을 해 준다고 보면 됩니다!

     예를 들자면 운영체제와 관련된 것들의 보안을 관리한다거나, 프로세스들 끼리의 실행 우선순위 같은 스케쥴링, 하드웨어랑 서로 연락 주고 받게 해주는 등(I/O) 운영체제 비서라고 보시면 됩니다.


     아무튼 OS가 우분투, CentOS 같이 리눅스니까 커널 또한 리눅스여야 겠죠?

     

     

     

    하드웨어 추상화(Hardware Abstraction Layer) 계층

     하드웨어들은 굉장히 Low한 언어들을 사용하여 만들어집니다. 그러한 하드웨어를 쓰기 위해서는 기계어(Byte들로 이루어진 숫자들)를 써야하며 이를 위해 MIPS같은 어셈블리 언어를 쓰고 등등... 여튼 하드웨어 명령어들이 굉장히 복잡하니까 그걸 추상화 시켜 놓았습니다. 추상화(Abstraction)란 피카소의 추상적인 그림들 처럼, 뭔가 원본과는 다르게 뭉뚱그려놓은?? 느낌이라고 보시면 됩니다. 즉, 어려운걸 쉽게 포장해서 보여주는 걸 추상화 했다고 보시면 됩니다!

     아무튼 하드웨어 명령어들을 이 계층이 추상화 시켜놔서 커널에서도 갖다 쓰고, 뒤에 설명드릴 프레임워크 계층에서도 갖다 쓰고 합니다.

     

     

     

    Native 라이브러리/안드로이드 런타임 계층

    Native 라이브러리

     라이브러리는 많이들 들어보셨을 겁니다. 단어 뜻인 도서관과 같이 어떤 것들을 갖다가 그대로 쓸 수 있도록 해주는 거죠. 여튼 여기에 Native라는 것이 붙었습니다. 즉, 우리가 쓰던 라이브러리 기능이긴 한데 좀 더 Low한 레벨에서 동작하는 라이브러리라고 볼 수 있죠. 여기에는 HAL 계층에서 쓰는 하드웨어들의 라이브러리나 OpenGL 같은 그래픽, SQLite 같은 로컬 DB 등이 들어 있습니다. 즉, 안드로이드에 필수적인 라이브러리들(주로 낮은 계층 얘들이 쓰는거)이 들어간 계층이라 보시면 됩니다. 그래서 C/C++ 같이 Low한 언어들로 만들어져 있습니다. 그리고 우리가 이 Native 라이브러리들 쓰려면 Android NDK(Native Development Kit) 같은걸 쓰기도 하죠!

     

    런타임 계층

     Run-Time 뜻 그대로 실행 중에~ 계층입니다. 실행 중에 어플리케이션 코드들을 운영체제가 알아먹도록 해석(컴파일)하는 계층입니다.


     잠깐 다른 소리를 하자면, 위에서 운영체제들은(Windows, MacOS 등) 어셈블러를 통해 코드들을 기계어로 변환한다고 했죠? 그래서 저희가 C언어나 파이썬 등으로 코드를 작성하면 컴파일러가 코드를 해석해서 결국 기계어를 만들고, 컴퓨터가 프로그램을 실행하는 겁니다!

     

    하지만 CPU, 운영체제들 끼리 그 언어가 다릅니다...

    기계어로 1010이라는 실행 명령어가 CPU에 따라 더하기가 될 수도, 빼기가 될 수도 있습니다. 또한 기계어가 다르기 때문에 운영체제마다 어떤 어셈블리어가 해당 기계어인지도 다릅니다!

     

    그래서 자바의 JVM(Java Virtual Machine)이 등장합니다! 먼저 java의 컴파일러는 자바 언어(.java파일)Java Byte코드(.class)로 다 컴파일 해버립니다. 물론 Byte코드도 기계어가 아니기 때문에 결국 기계어로 바꾸어 주어야 하는데, 이를 JVM이 합니다! (물논 기계어로 바꿔주는 것이기 때문에, JVM도 운영체제에 따라 종류가 다르겠죠?)

    즉, 어떤 운영체제에서도 java를 쓸 수 있도록 해줍니다.


     하지만 안드로이드는 JVM을 사용하지 않습니다. 저작권 문제도 있다지만.. 성능 문제가 가장 큰 요인이었습니다. 해서 DVM(Dalvik VM)을 사용해 오다가, 최근엔 ART(Android RunTime)을 사용합니다.

     

    ※ 안드로이드는 컴파일을 (실행 중에 하느냐/앱을 까는 순간 미리 해놓느냐) 등으로 방식이 여러개 있었답니다.

    실행 중에 컴파일 하는 방식을 JIT(Just In Time)이라 합니다(Dalvik에서 썼습니다. 메모리를 많이 차지하겠죠?).

    물론 현재는 앱을 설치할 때 미리 기계어로 다 해석 해 놓고(Ahead-Of-Time), 앱 실행 할 때는 그냥 바로 실행한답니다! 그게바로 ART(Android RunTime)입니다. (그래서 앱 용량이 늘었지만, 성능은 좋아졌답니다!)

     

    ◆ 하지만 2016년 이후 ART에 JIT를 섞어서 사용한답니다! 즉, (AOT + JIT)방식입니다.

     

     정리하자면 저희가 작성한 Java나 Kotlin 코드를 앱 실행 중에 이 런타임 계층에서 운영체제가 알아먹도록 컴파일 한다는 겁니다.

     

     

     

     

     

     

    프레임워크 계층

      자바 프레임워크 API 계층이라고 합니다. 쉽게 말하면 미들웨어(Middle-Ware)로 보시면 되는데, 저희가 코드 작성하고 지지고 볶는 어플리케이션 계층프레임워크 밑 계층 놈들소통 할 수 있도록 해주는, 중간 다리 역할을 한다고 보시면 됩니다. API인 이유가 여기 있죠. 밑에 계층 들이랑 소통 할 수 있도록 하는 API라고 보시면 됩니다!

     근데 위에는 API적인 특성을 설명 한 것이고, 프레임워크적인 특성도 설명해야 합니다. 일단 용어들을 보자면


     API(Application Programming Interface)란 응용프로그램(어플리케이션)이 운영체제나 하드웨어 등 어려운 놈들을 쉽게 쓸 수 있도록 하는 인터페이스입니다. 뭐 꼭 운영체제/하드웨어 같은 게 아니더라도, A 어플리케이션이 B 어플리케이션의 기능을 쉽게 쓸 수 있도록 하듯이 앱 간에도 도움을 주는 인터페이스라고 합니다. 막 코딩 할 때 카메라 같은거 저희가 어떻게 불러옵니까... Camera2() 이런걸로 불러오죠? 이런게 API입니다.


     프레임워크(Framework)란 말 그대로 '틀'입니다. 저희가 공사판의 뼈대? 틀 등을 Frame(프레임)이라고 하죠? 그 느낌 그대로입니다! 어떤 소프트웨어를 만들 때, "이러이러한 부분은 이런 식으로 써!!" 라고 틀을 잡아주는 놈들을 프레임워크라고 합니다. 정리하자면 설계에 있어서 틀을 잡아주는 놈입니다.


     이제 프레임워크가 살짝 감이 오셨을텐데 결국 뭔 소린지 모르실 겁니다... 예를 들어야 이해가 잘 되죠! 일단 백엔드(서버) 개발하는 사람들은 프레임워크 Spring, DJango 같은 걸 생각하시면 됩니다! 서버 만드는 건 똑같은데 뭔가 설정 해 주어야 하는 건 두 프레임워크가 다르죠.

     아무튼 그럼 "안드로이드에서 프레임워크는 뭐냐!?" 하실 텐데 설계 틀이 있습니다.

     

     

    • Activity Manager : 애플리케이션내의 액티비티들을 관리 합니다.
    • Content Providers : 애플리케이션간의 데이터 공유를 담당합니다.
    • Telephony Manager : 음성통화를 관리합니다.
    • Location Manager : GPS 또는 기지국신호를 통해 위치정보를 관리합니다.
    • Resource Manager : 애플리케이션에서 우리가 사용하는 많은 종류의 리소스들을 관리합니다.
    • View System: UI에 쓰이는 안드로이드 View들을 관리합니다.
    • Notification Manager: 알림 같은걸 관리합니다.
    • .....

     등등 좀 많은데 여튼 저런 안드로이드 모바일에 대한 기본적인 틀? 들을 미리 지정 해 놓았습니다. 그게 바로 프레임워크 계층입니다!

     

     

     

     

    어플리케이션 계층

     설명 할 필요도 없겠죠? 우리가 코딩 하고 앱 실행해서 게임하고 등의 계층입니다. 즉, 사용자들에게 보여지는 부분이죠. 여긴 별로 설명할 게 없군요! 이미 몸이 알겁니다!

     

     

     

     

     

     

     

     

     

     이상으로 끝입니다. 안드로이드가 재밌어서 기초부터 다시 개념을 다잡자! 라는 마음으로 써봤는데, 확실히 누군가에게 알려준다고 생각하니 머리속에 더 잘 남고, 더 자세히 찾아보게 되네요.

     

     

    댓글

Designed by Tistory.