MOBILE PROGRAMING

[모바일 프로그래밍] 안드로이드(Android) 소프트웨어 Stack

ch010104 2025. 9. 4. 14:48

🏗️ 안드로이드 소프트웨어 스택 (구조)

  • 안드로이드 OS는 여러 계층으로 구성된 소프트웨어 스택 구조를 가짐

1. 리눅스 커널 (Linux Kernel)

  • 안드로이드 플랫폼의 가장 기반이 되는 계층
  • 하드웨어 자원 관리: 메모리, 전원, 프로세스 통신 등을 관리
  • 모바일 환경 최적화: 모바일 기기에 적합하도록 기존 리눅스 커널을 확장하고 최적화

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

  • 리눅스 커널과 상위 라이브러리 사이의 '번역기' 역할
  • 하드웨어 제조사가 각자의 드라이버를 구현할 수 있도록 표준 인터페이스를 제공
  • 안드로이드가 다양한 하드웨어에서 동작할 수 있게 만듬
  • 사용자 application 개발자의 입장에서는 하드웨어의 다양성을 고려하지 않아도 되게 해줌
    -> 각 컴포넌트(오디오, 카메라, 센서, 블루투스) 단위로 묶어서 사용
  • 상위 계층의 자바 api FrameWork에서 표준의 인터페이스를 제공하기 위함

3. 안드로이드 런타임 (ART, Android Runtime)

  • 안드로이드 5.0 (롤리팝)부터 도입된 앱 실행 환경
  • 각 앱은 자신만의 프로세스와 ART 인스턴스 위에서 실행(각 application 별로 별도의 머신이 생성되어야함)
  • 주요 특징:
    • AOT/JIT 컴파일: 앱 설치 시 또는 실행 중에 코드를 기계어로 변환하여 실행 속도를 향상시킴
      - 바이트 코드에서 머신 코드로의 변환을 어느 시점에서 수행하느냐에 따라 AOT/JIT로 나뉨
    • AOT: 바이트 코드를 머신 코드로 변환을 하여 설치를 함(CPU 사용량이 상대적으로 낮음)
      - 장점: 실행 후의 변환 작업이 없기 때문에 시간 절약
      - 단점: 메모리 측면에서 JIT보다 많이 사용
    • JIT: 바이트 코드 상태로 설치하고, 사용자가 실행하는 순간에 바이트 코드로부터 머신 코드로의 변환을 수행함. (CPU 사용량이 상대적으로 높음)
      - 장점: 바이트 코드가 머신 코드보다 메모리 측면에서 이점이 있기 때문에, 용량 절약
      - 단점: 실행 후에 변환 작업을 하기 때문에 시간 측면에서 더 걸림

    • 최적화된 가비지 컬렉션 (GC): 메모리 관리를 효율적으로 수행
    • DEX 파일을 더 작은 기계어 코드로 변환하여 앱 용량을 줄임
  • Core Libraries: 자바(Java) API 프레임워크가 사용하는 자바 프로그래밍 언어의 핵심 기능을 제공

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

  • ART, HAL 등 안드로이드의 핵심 시스템 구성 요소들은 C/C++로 작성된 네이티브 라이브러리를 기반으로 동작
  • 개발자는 자바 API 프레임워크를 통해 이 라이브러리들의 기능에 접근하거나, **NDK(Native Development Kit)**를 사용하여 직접 네이티브 코드를 활용할 수 있음

5. 자바 API 프레임워크 (Java API Framework)

  • 개발자가 안드로이드 앱을 만들 때 사용하는 **'도구 상자(Building Blocks)'**
  • 안드로이드 OS의 모든 기능을 활용할 수 있는 API를 제공
  • 주요 구성 요소:
    • Activity manager: 앱의 생명주기를 관리
    • View system: 앱의 UI를 구성
    • Resource manager: 문자열, 그래픽, 레이아웃 파일 등 코드 외의 리소스에 접근
    • Notification manager: 상태 표시줄에 알림을 표시
    • Content providers: 앱 간에 데이터를 공유하고 접근

6. 시스템 앱 (System Apps)

  • 안드로이드에 기본적으로 설치된 이메일, SMS, 캘린더, 인터넷 브라우저, 주소록 등의 핵심 애플리케이션
  • 사용자를 위한 앱으로서 기능할 뿐만 아니라, 다른 앱 개발자들이 활용할 수 있는 핵심 기능을 제공하는 역할