티스토리 뷰

 

 

<안드로이드  계층 구조>

https://onlyfor-me-blog.tistory.com/386

 

 

1) 리눅스  커널

하드웨어와 OS를 연결하는 다리 역할로,

  • 하드웨어 추상화
  • 메모리 관리
  • 보안 설정
  • 전원 관리
  • 다른 하드웨어 장치의 드라이버 관리(카메라, 블루투스, 오디오 등)
  • 네트워크 시스템 관리

의  역할을 수행한다.

 

 

우분투등   다른  리눅스 배포판에 있는 유틸리티는  포함하고 있지 않으며,

Binder, Ashmem(Android shared memory) 등이 추가로 포함되어  있다.

 

 

2) HAL

리눅스 커널과 하드웨어 기기간의 인터페이스 부분으로 단말기 제조사가 드라이버를 구현할 수 있도록 제공되는 계층

 

=>하드웨어는 low level 언어를  사용하는데, 이를  감추고 표준인터페이스를 제공하여 Java API Framework에서  하드웨어 기능을 사용할 수 있게 한다. 모듈별로(Audio, Bluetooth, Camera, Sensors) 인터페이스를 제공한다.

 

3) Native C/C++

안드로이드 OS가 애플리케이션 및 기능을 구동하기 위해 사용되는 라이브러리. 개발자가 Java Kotlin으로 만들어진 API를 호출하면 여기 구현되어진 C코드가 동작

 

=>작은 용량의 주기억장치와 저전력의 CPU가 탑재된 기기에서 동작하기 때문에 CPU, GPU 집약적 작업을 위한 라이브러리들은 기기에 최적화된 네이티브 코드로 컴파일되야 한다.

Media Framework: 미디어처리 담당(코텍, 음악, 영상, 사진)

Surface Manager: 화면의 창 구성을 처리

SQLite : 모바일을 위한 경량화된 로컬 DB

OpenGL ES : 2D/3D 그래픽 담당

 

4) Android Runtime

=> 안드로이드도 자바이기 때문에  가상머신이 필요하다.

=>JVM의 라이선스  문제로 구글을 DVM(달빅 VM)을 개발하여 사용해왔고, 현재는 ART(Android RunTime)을 사용하고 있다. 롤리팝 2014부터  ART를 사용하다가, 누가 2016부터 하이브리드  방식이 사용되는 중이다.

Dalvik: JIT 컴파일  방식사용으로 메모리를 많이 사용

ART: 앱 설치 시 미리 기계어로 해석해놓고(Ahead-Of-Time, AOT), 앱 실행 시에는 바로 실행하는 방식으로 성능을 향상시켰다. 앱 설치 시 요구되는 용량은  늘었다.

 

5) Java API Framework

=>네이티브 라이브러리를  추상화한 계층이다.

=> 안드로이드 애플리케이션은 자체 런타임에서 실행되며 Activity, Service, Broadcast Receiver, Content Provider와 같은 여러 구성 요소로 구성됩니다. 이러한 4대 컴포넌트는 다른 애플리케이션과 서로 상호작용할 수 있습니다.

  • Activity Manager : 애플리케이션 안의 액티비티들을 관리
  • Content Providers : 애플리케이션 간의 데이터 공유 관리
  • Telephony Manager : 음성통화 관리
  • Location Manager : GPS 또는 기지국 신호를 통해 위치 정보 관리
  • Resource Manager : 앱에서 사용하는 리소스들 관리
  • View System : UI에 쓰이는 안드로이드 뷰들을 관리
  • Notification Manager : 알림 관리

 

6) System Apps

OS내부에 내장되어있는 애플리케이션으로 개발자가 개발할 때 일부 기능을 가져다 사용할 수 있음

안드로이드 기본 제공 앱(전화, 문자, 캘린더, 계산기 등)과 스토어에서 다운받은 앱들이 속해서 각자의 기능들이 실행되는 영역

 


 

<안드로이드 부팅과정>

 

 

https://cs.android.com/android/platform/superproject/+/master:hardware/samsung/nfc/halimpl/include/sec_nfc.h?hl=ko

 

https://source.android.com/docs/core/architecture?hl=ko

 

https://aroundck.tistory.com/125

 

https://m.blog.naver.com/jyoun/221693070738

 

[Android] Service

Service 란? : Android에서 service는 UI 없이 주기적으로 특정한 일을 수행하는 백그라운드 process를...

blog.naver.com

 

 

 

https://m.blog.naver.com/jyoun/221691860304

 

Android Booting Sequence

https://community.nxp.com/docs/DOC-102546 Step 1: Power On and System Startup 시스템에 전원...

blog.naver.com

 

0)컴퓨터부팅과정

롬(read only memory)에  있는 바이오스(basic input output system) 코드를 불러온다.

바이오스는 post(장치가 정상인지 검사)  실행 후, 하드디스크의 mbr영역에 있는 부트로더 코드 실행한다.

운영체제가 메모리에 로드되고(커널만  항상  메모리에 상주) 운영체제의 명령에 의해 cpu는 첫 프로세스를 만들고., 이후 인터럽트가 발생하면 cpu는 각종 작업을 처리한다.

 

**부트로더(Boot Loader) : 운영체제를 시작하기 위해 OS를 RAM에 올려주는 부팅 전용 프로그램 

운영체제(boot)를 메모리로 읽어오는 역할(loader)

 

 

 

 

1) power on and system startup>

ROM에 미리 저장된 코드가 부트로드코드를 RAM으로 로드한다.

 

2) 부트로더

부트로더 코드는 커널을 실행하기 위해 프로세서, 시계, 키패드, 네트워크, 커널을 셋업한뒤, 커널을 부팅한다.

RAM으로 커널을  올린뒤, 커널 시작 지점으로 점프하여 커널을  시작한다.

 

3) 리눅스 커널

커널이 부팅되면 메모리, 캐시를 셋업, 스케줄링 작업, 드라이버 로딩 등 커널  초기화 작업을 한다.

시스템 셋업 과정이 끝나면, 시스템 파일 중 init파일을 찾아 root process를  실행하다.

 

[커널 부팅 요약]

1) kernel과 rootfs(RAMdisk) 이미지를 RAM으로 로딩

2) LK bootloader가 kernel의 시작번지로 jump하면, kernel은 자신의 압축을 풀기 시작

3) kernel은 C code를 실행하기 위한 환경을 준비

4) kernel subsystem 초기화

5) 각종 device driver 초기화

6) Ramdisk root FS 마운트

7) init process를 구동

8) Idle 상태에서 대기

 

 

4) init 프로세스

이 단계에서 안드로이드  로고를 볼 수 있다.

 

환경변수  설정 + 파일 시스템 마운트 + 파일 시스템의 퍼미션 설정

init프로세스는 가장 최초의 프로세스로 모든  프로세스의 조상이다.

4-1) 모든 폴더 파운트

4-2) init.rc  스크립트 실행 

https://cs.android.com/android/platform/superproject/+/master:system/core/rootdir/init.rc;bpv=0;bpt=0?hl=ko

init프로세스는 각종 daemon, context manager, media server, zygote등을  실행한다.

init프로세스가 실행하는 데몬은 다음과 같다.

  • sub 데몬 (usbd): usb 연결 관리
  • 안드로이드 디버그  브리지 데몬(adb) : 안드로이드 디버그 브리지(adb)연결  관리
  • 디버거 데몬 (debuggerd) : 디버그 시스템 시작
  • 무선  인터페이스 레이어 데몬 (rild) : 무선 통신 연결  관리

 

5) context manager

context manager  안드로이드의 system service 관리하는 프로세스이다.

context manager를 통해 service정보를 얻고 binder를 통해 IPC통신을 한다.

 

6) media server

 Audio Flinger ( 오디오 출력 담당 ) 과 Camera 서비스와 같이 C/C++ 기반으로 작성돼 있는

 네이티브 시스템 서비스를 실행하는 역할.

 

7) Zygote

Zygote은 Android에서 application을 빠르게 실행시키기 위하여 미리 fork 되어있는 process입니다. 즉, Zygote은 시스템이 시작할 때 여러개가 자동으로 만들어지고, 그 pool이 관리됩니다.

 

Jave는 각 application마다 독립된 메모리 공간인 JVM(Java Vertual Machine)에 할당받는데, JVM은 application이 실행되는 시점에 할당을 받습니다.

Android에서는 최소한의 libraries만 탑재하고 있는 process인 Zygote을 미리 여러개 만들어두고, application 실행 시 Zygote를 통해 application을 실행하는 구조입니다.

 

모든 자바 기반 안드로이드 애플리케이션은 Zygote를 통해 포크(fork)된 프로세스 상에서 동작한다.

 

8) system server

 Zygote에서 최초로 포크되어 실행되는 안드로이드 애플리케이션 프로세스이다.

 시스템 서버는 앱 생명 주기를 제어하는 액티비티 매니저 서비스 ( Activity Manager Service) 

 단말기의 위치 정보를 제공하는 로케이션 매니저 서비스 ( Location Manager Service ) 와 같은 자바 시스템 서비스를 실행하는 역할을 한다.

 

 

Service 란?

: Android에서 service는 UI 없이 주기적으로 특정한 일을 수행하는 백그라운드 process를 가리킨다.

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함