Android Platform Architecture

개요

  • Open Source기반 Embedded System
  • 대표적인 Open Source기반 Emebedded System인 Embedded Linux와 Android 비교시 Kernel은 동일하고 응용프로그램 영역이 다름

    image
  • OpenSource 기반이기 때문에 Framework source가 공개되어 있어 수정/추가가 가능하나 제조사에서 제공되는 S/W(Binary/Library등)의 경우 대부분 Source가 공개되지 않음
    • Apache v2 License 사용으로 소스코드 수정시 공개의무가 없다(Kernel과는 License가 구분됨)

image

  • Application은 각자가 프로세스임. 서로 통신은 IPC(Binder)를 통함.
  • Application Framework는 전체가 단일 프로세스임. 각자는 쓰레드 개념으로 동작. Application과는 IPC를 통해 통신함.
  • Application과 Application Framework는 JAVA.
  • Application Framework와 Libraries는 JNI을 통해 연결.
  • Libraries와 HAL모듈은 표준화된 방법을 통해 연결됨.
  • HAL 모듈과 Kernel은 System Call을 통해서 통신.

Android에서 Service

  • Android의 Client(Application)의 요청을 처리하고 특정 기능을 제공하는 모듈을 의미. Binder을 통해 요청된다.
    • Android Framework에서 구현된 많은 기능들이 Service 형태로 존재한다.
  • Process위에 여러개의 Service가 동작 가능하다.
    image
  • Application Service
    • Service class를 확장하여 구현가능.
    • 라이프 사이클에 영향을 받는다. (Kill될 수도 있다.)
    • 추가하기가 상대적으로 쉽다.
  • System Service : 관리를 받지 않는다. 하지만 단
    • JAVA System Service : 관리를 받지 않는다. 하지만 단일 프로세스를 수정해야 한다.
    • Native System Service

Applications

image

  • 휴대 단말이 가져야 할 기본 기능을 수행하는 Application을 제공한다.

  • Android Framework와 연동하며 여러가지 기능을 제공한다.

  • SDK를 제공받아 Application을 개발하며 재사용, 확장, 교체등이 용이하다.

  • Android Components로는 다음과 같은 요소들을 제공한다.

    • Activity : forground(눈에 보이는 요소)
    • Service : background
    • Intent, Broadcast Receivers, Widget등
  • 프로세스 생성

    image

  • APP의 생성

    image

    • A App에서 Binder를 통해 Activity manager에게 요청(Binder)
    • Activity manager는 zygote(버추얼머신을 가지고 있는 모듈)에게 요청(socket)
    • zygote는 fork를 통해 복제해 B APP을 생성

Application Framework(System server)

image

  • Application을 보조 및 지원하는 구조로 하드웨어, 리소스 서비스등을 지원하며 매니저 및 시스템 서비스들로 구성
    • Activity Manager : Android Application 실행 요청 및 Life Cycle을 관리
    • Window Manager : 윈도우의 모양이나 크기 등을 관리
    • Content Manager : Application이 서로 정보나 메시지를 공유, 작업 등을 요청하는 기능을 담당
    • View System : 리스트, 텍스트 박스, 버튼 및 다이얼로그 등의 UI set 제공
    • Notification Manager : 콜 수신, 메시지수신, 배터리부족, 시스템 상태변화, 네트워크 시그널 등 이벤트 발생에 따라 상태 바 같은 알림을 디스플레이
    • Telephone Manager : 음성 및 영상통화, MMS/SMS, SIM/USIM 관리
    • Resource Manager : 애플리케이션에게 파일, 그래픽 등의 자원 할당/해제
    • Location Manager : 위치 정보 제공 기능

Libraries

image

  • Android Runtime 환경을 통해 Application이 사용할 기능 제공
    • JNI을 통해 연결된다.
  • HAL을 통해 Android Runtime환경에서 Device Driver와 연결 되기도 함.
  • Nativer System Service는 C/C++로 작성이 되어 있다.
    • 그래픽 지원(2D, 3D, SGL, OpenGL ES)
    • OMX등 지원
    • Data base(SQLite)
    • Web browser을 위한 WebKit지원
    • 보안 네트워킹을 위한 SSL지원
    • OpenCore 기반의 Media Framwork, 오디오 및 비디오와 이미지 코덱을 지원

      image
  • System.loadLibrary()가 실행되면 ART는 해당 이름의 공유 라이브러리를 로딩한 후 함수 심볼을 검색
  • 로딩한 라이브러리에서 심볼을 검색한 후 JNI_OnLoad()함수가 구현되어있는지 확인하고 해당 함수가 포함되어 있으면 자동으로 호출함
  • RegisterNative() 함수를 사용하면 ART에서 자동으로 라이브러리 내에 JNI Native 함수 심볼을 비교하여 연결해주는 작업 대신에 프로그래머가 직접 연결 작업을 처리하기 때문에 로딩속도를 향상시킬 수 있다.
  • JNI_OnLoad()함수가 구현시 연결 방법
    ① Application or Application Framwork
1
2
Syatme.loadLibrary("android_servers")
nativeInit();

② libandroid_servers.so → JNI_OnLoad() 실행 → RegisterNatives() 매핑 수행

1
2
3
4
static JNINativeMethod gMethods[] = {
/* name(자바함수), signature(리턴타입), funcPtr(c/c++함수) */
{ "nativeInit", "()V", (void*)android_server_SystemServer_nativeInit},
};
  • JNI_OnLoad()함수가 없다면 ART는 자동으로 라이브러리 내에 JNI Native 함수 심볼을 비교하여 매핑 작업을 수행한다.
    • 성능 저하의 원인이 될 수 있다.
  • JNI_OnLoad()함수가 없을때 연결 방법

JNIEXPORT <리턴타임> JNICALL java_<패키지명>_<클래스명>_<네이티브함수명>

HAL(Hardware Abstraction Layer)

image

  • Android가 Kernel에 접근하기 위한 인터페이스 제공
    • 커널 디바이스 드라이버와 시스템 콜을 통해 연결된다.
  • 커널 버전이나 CPU가 바뀌어도 이식성에 문제를 최소한으로 줄이기 위한 계층이다.
    • 대부분 Chip vendor에서 Library(HAL module)형태로 제공
  • Android HAL은 동적 라이브러리를 로딩하는 표준화된 방법을 제공한다.
    • hw_get_module(), hw_get_module_by_class를 통해 동적 라이브러리를 로딩하는 표준화된 방법을 제공
1
2
3
/* id : 동적 로딩이 필요한 모듈의 ID. ID값에 따라 로딩해야 할 동적 라이브러리를 결정
module : 동적 로딩된 라이브러리의 HMI(Hardware Module Information)심볼의 hw_module_t 포인터를 반환 */
int hw_get_module(const char *id, const struct hw_module_t **module)
  • 반환된 hw_module_t의 멤버 변수 중 methods를 이용하여 로딩된 HAL module을 사용 가능한 상태로 초기화 시킬 수 있다.
  • HAL module의 기본위치는 다음과 같음
1
2
3
4
/* 우선운위는 3→2→1 순 */
#define HAL_LIBRARY_PATH1 "/system/lib/hw"
#define HAL_LIBRARY_PATH2 "/vendor/lib/hw"
#define HAL_LIBRARY_PATH3 "/odm/lib/hw"

Android Kernel

image

  • Android에 맞게 추가, 수정된 리눅스 커널
    • 프로세스 관리(Binder, Low Memory Killer)
    • 메모리 관리(Ashmem)
    • 디바이스 드라이버 관리(Power Management)
    • 파일 시스템(FS)등
공유하기