• 안드로이드 커널(참고 http://elinux.org/Android_Kernel_Features#Resources,수원 멤버십 자료)
    - Linux kernel 2.6 기반, but not Linux
       : 표준 리눅스 유틸리티를 전부 포함(x) -> busybox
       : glibc 지원 (x) -> bionic lib
       : Native Windowing System (X-Window) (x)
       : EABI 사용 -> 컴파일 시 EABI를 지원하는 컴파일러 사용
       : OpenBinder -> No SysV IPC

    - ashmem(Android(Anonymous) shared memory)/pmem(Process memory allocator) - 프로세스간 메모리 공유
     : ashmem은 가상 메모리 사용, pmem은 인접한 물리 메모리 사용
     : ashmem은 두 개의 프로세스가 메모리를 참조하다가 사용이 끝나면 그 메모리를 참조하던 모든 fd들은 close하게 됨, pmem은 직접 메모리를 해제해 주어야 함
     : 에뮬레이터에서는 ashmem을 사용해야 함, pmem은 드라이버 지원 x

    - Binder - RPC(an Android-specific interprocess communication mechanism, and remote procedure call system similar to DBus)
    - Power Managerment
    - Low Memory Killer
    - Logger(system logging facility)

     

  • 안드로이드 플랫폼 소스 구조

    Figure 1. Android stack


    bionic: 안드로이드 표준 라이브러리

    bootloader: 참고용 안드로이드 부트 로더
    build: 안드로이드 빌드 시스템
    cts: 안드로이드 호환성 테스트 프로그램
    dalvik: 달빅 가상 머신
    development: 개발 관련 지원 소스
    external: 공개용 라이브러리
    frameworks: 안드로이드 프레임워크
    hardware: 안드로이드 HAL(Hardware Abstraction Layer) 소스
    out: 빌드 후 모음
    packages: 안드로이드 기본 애플리케이션
    prebuilt: 컴파일러
    system: 안드로이드 코어 프로그램, init 프로세스


  • 안드로이드 부팅 과정 (출처 - 인사이드 안드로이드)


    - 부팅 순서 참고: http://blog.secmem.org/88

    (1) 리눅스 커널
    안드로이드는 리눅스 기반의 플랫폼. 부팅 시 부트로더를 통해 리눅스 커널이 먼저 시작, 리눅스가 부팅되면 일반적인 리눅스 부팅과정 처럼 커널 초기화를 수행한 후 마지막 과정에서 init 프로세스를 호출한다.

    (2) init
    안드로이드 init 프로세스는 각종 디바이스를 초기화하는 작업을 비롯해서 안드로이드 프레임워크 동작에 필요한 각종 데몬, 컨텍스트 매니저 (Context Manager), 미디어 서버(Meia Server), Zygote등을 실행하는 역할을 한다.
     다음은 init 프로세스가 실행하는 데몬 프로세스다.
     - USB 데몬(usbd): USB 연결 관리
     - 안드로이드 디버그 브리지 데몬(adbd): 안드로이드 디버그 브리지(ADB) 연결 관리
     - 디버거 데몬(debuggerd): 디버그 시스템 시작
     - 무선 인터페이스 레이어 데몬(rild): 무선 통신 연결 관리


    (3) 컨텍스트 매니저
    컨텍스트 매니저(Context Manager)는 안드로이드의 시스템 서비스를 관리하는 중요한 프로세스다. 시스템 서비스는 안드로이드 프레임워크를 구성하는 중요한 컴포넌트로서 카메라, 오디오, 비디오 처리에서부터 각종 애플리케이션 제작에 필요한 중요 API를 제공하는 등의 역할을 수행한다.

     안드로이드 내에서 동작하는 각종 시스템 서비스에 대한 정보는 컨텍스트 매니저에게서 얻을 수 있다. 따라서 시스템 서비스를 이용하고자 하는 애플리케이션이나 프레임워크의 내부 모듈은 이를 서비스 매니저에게 요청해야 한다. 요청 후에는 바인더(Binder)라는 안드로이드의 자체적인 IPC(Inter-process communication) 메커니즘을 통해 시스템 서비스를 이용할 수 있다.

    이를 위해서는 안드로이드의 모든 시스템 서비스는 부팅시 자신의 핸들 정보를 컨텍스트 매니저에 등록해야 하며, 이러한 서비스 등록 과정에서도 프로세스 간 통신을 수행하기 위해 바인더 IPC가 이용된다.

    (4) 미디어 서버
    미디어 서버(Media Server) 프로세스는 안드로이드에서 Audio Flinger(오디오 출력을 담당)나 Camera 서비스와 같이 C/C++ 기반으로 작성돼 있는 네이티브 시스템 서비스를 실행하는 역할을 한다.

    (5) Zygote
    Zygote는 안드로이드 애플리케이션의 로딩 시간을 단축하기 위한 프로세스로서 모든 자바 기반 안드로이드 애플리케이션은 Zygote를 통해 포크(fork)된 프로세스 상에서 동작한다.

    (6) 시스템 서버
    시스템 서버(System Server)는 Zygote에서 최초로 포크되어 실행되는 안드로이드 애플리케이션 프로세스다. 시스템 서버는 애플리케이션 생명 주기를 제어하는 액티비티 매지저 서비스(Activity Manager Service)나 단말기의 위치 정보를 제공하는 로케이션 매니저 서비스(Location Manager Service)와 같은 자바 시스템 서비스를 실행하는 역할을 한다.

     이처럼 시스템 서버에서 실행하는 자바 시스템 서비스도 안드로이드 애플리케이션이나 프레임워크 내부 모듈에서 이용할 수 있게 하기 위해서는 컨택스트 매니저에 등록돼 있어야 한다.

     그런데 바인더 IPC를 통해 자바 시스템 서비스를 C언어 기반의 서비스 매니저에 등록하려면 자바와 C언어 간의 인터페이스 역할을 하는 JNI(Java Native Interface)를 추가로 이용해야 한다.

  • Runtime Walkthrough





'Programing > Android' 카테고리의 다른 글

안드로이드 - JNI  (0) 2015.12.23
안드로이드 - Init 프로세스  (0) 2015.12.21
안드로이드 - 뷰  (0) 2015.12.21
안드로이드 - 4대 컴포넌트  (0) 2015.12.21
안드로이드 - 구성 및 특징  (0) 2015.12.21

+ Recent posts