본문 바로가기

AOSP

AOSP) 구조 파악하기 (AOSP 파일 구조)

AOSP 파일 구조

 
처음 안드로이드 공식 홈페이지에서 aosp 코드를 동기화를 하고 aosp 디렉토리를 열었을 때 무수히 많은 파일, 디렉토리를 확인하였습니다. aosp 프로젝트에 어떤 파일이 어느 디렉토리을 위치를 파악하여 대략적인 구조를 파악해 보겠습니다.
 
거의  하나의 레이어당 하나의 디렉토리가 맵핑되어 있다고 볼 수 있습니다. 

packages

위치: /packages
안드로이드 핸드폰을 사면 기본적으로 내장되어 있는 애플리케이션(전화 앱, 연락처 앱 등)들의 소스코드가 해당 디렉토리에 있습니다.
 

packages 디렉토리를 분석함으로써..

  • 일반적인 앱들의 구조를 파악
  • UI 디자인 방식 파악
  • 앱과 시스템의 상호작용 방식 파악

 


frameworks

위치: /frameworks
프레임워크 디렉토리에는 기본 시스템 실행 그리고 상호작용할 수 있게 도와주는 라이브러리API서비스들을 포함하고 있습니다. frameworks 디렉토리는 Android framework 레이어와 관련된 파일들 포함되어 있습니다.
 

frameworks 디렉토리를 분석함으로써..

  • 프레임워크의 핵심 구성요소를 파악 가능
  • 애플리케이션의 생명주기 파악 가능
  • 컴포넌트 간 정보전달 방식 파악 가능
  • 보안과 권한 부여를 어떤 방식으로 이루어지는 파악 가능
  • 저수준 시스템과의 상호작용 방식 파악 가

system

위치: /system
system 디렉토리는 안드로이드 구조의 중요한 요소입니다.
코어 시스템 레벨의 요소, 안드로이드 시스템 내 다양한 부분을 관리하는 서비스들을 포함하고 있습니다.

서브디렉리

core

필수적인 시스템 레벨의 컴포넌트와 안드로이드 os 동작에 근본적인 유틸리티를 포함하고 있습니다.
코어 시스템 서비스, 데본, 시스템 레벨 라이브러리들이 존재합니다.

extras

추가적인 시스템 컴포넌트와 안드로이드 프레임워크의 부분이 아닌 유틸리티들이 extras 디렉토리에 포함되어있습니다. 

health

시스템을 모니터링을 하는 컴포넌트들이 health 디렉토리에 포함되어 있습니다. 예를 들어 베터리 관리, 전원 관리 등..

io

입출력 동작에 관련된 컴포넌트들이 포함되어 있습니다. 시스템 레벨에서 동작시키는 입력 장치와 저장소 관련 컴포넌트들이 있습니다.

media

멀티미디어 처리에 관련된 컴포넌트들이 포함되어 있습니다. 예를 들어 오디오, 비디오, 그래픽 관련 컴포넌트가 있습니다.

netd( network daemon )

해당 디렉토리에는 네트워크 데몬을 위한 코드들이 있습니다. 해당 데몬은 네트워크와 관련된 작업을 관리하는 역할을 합니다. 그리고 라이팅, 방화벽 규칙을 포함합니다.

time

시간과 날짜와 관련된 기능에 관련된 코드가 포함되어 있습니다. 예를 들어 시간 동기화를 위한 기능 소스가 포함되어 있습니다.

vold( volume daemon )

저장공간과 관련된 데몬 코드들이 포함되어 있습니다. 해당 데몬은 저장소의 용량을 관리하고, 외부 저장소 디바이스 접근 제공합니다.

System 디렉토리를 분석함으로써..

시스템 서비스, 기기의 전력 또는 베터리 관리, 입출력 요소를 다루는 방법, 미디어 처리, 네트워크 처리, 시간 관리, 저장소 관리를 어떻게 하는 알 수 있습니다.
 
시스템 디렉토리를 이해하는 것은 로우 레벨 시스템 개발자로에게는 중요하다. 시스템 성능 최적화, 시스템 서비스에 관련된 문제 해결 이러한 문제를 해결하기 위해서는 system 디렉토리 내에 있는 것들을 이해하는것이 중요하다.


art와 dalvik 디렉토리

art, dalvik 디렉토리는 AOSP 코드 상에서 안드로이드 런타임과 관련이 있습니다. 두 디렉토리는 안드로이드 앱의 코드를 실행하거나 관리하는 역할을합니다. 

art(Andriod RunTime)

위치: /art
ART는 초기 Dalvik 가상머신 이후 개발되었고, Dalvik 가상머신에 영향을 받았습니다.
이전 가상머신보다 향상된 성능, 효율적인 메모리 관리가 가능한 개발자 도구로 소개되었습니다.

서브디렉리

runtime

해당 디렉토리는 런타임 라이브러리와 자바코드로 컴파일된 파일의 실행을 관리하는 컴포넌트가 포함되어 있습니다.
JIT(Just In Time) 컴파일, 가베지 컬렉션, 메모리 관리 등을 위한 컴포넌트를 포함하고 있습니다.

compiler

해당 디렉토리는 ART 컴파일러를 위한 소스코드를 포함하고 있습니다. 해당 컴파일러는 자바 바이트 코드를 기계어로 컴파일하는 역활을 가지고 있습니다. ART는 앱의 부팅과 성능 향상을 위해 AOT 컴파일 방식을 사용합니다. 

libdex

DEX(Dalvik Executable) 파일 형식은 패키징과 안드로이드 앱을 배포하는 데 사용됩니다.
해당 디렉토리는 DEX 파일을 처리하는 코드를 포함하고 있습니다.

dalvik

위치: /dalvik
 Dalvik은 낮은 버전의 안드로이드에서 사용된 런타임 환경입니다. 해당 런타임 환경은 앱이 실행되는 동안 바이트코트를 기계어로 컴파일하기 위해 JIT 컴파일을 채택하였습니다.

libdex

Dalvik 런타임에서 DEX파일을 처리하는 것과 관련된 코드를 포함하고 있습니다.

vm

해당 디렉토리는 인터프리터, JIT 컴파일러, 가베지 컬랙션, 메모리 관리 컴포넌트와 같이 Dalvik 가상머신의 코어 컴포넌트를 가지고 잇습니다. 

runtime 관련 디렉토리(art, dalvik)를 분석함으로써..

성능 최적화, 컴파일 기술, 런타임의 동작, 어떻게 저수준 시스템과의 상호 작용하는지 알 수 있습니다.


hardware

하드웨어 디렉토리는 HAL을 다루는 중요한 디렉토리입니다. HAL은 표준화된 인터페이스를 제공합니다.
각 서브트리들은 하드웨어 카테고리 별로 구성되어 있습니다.
위치: /hardware

서브디렉리

audio

디렉토리는 오디오 하드웨어 컴포넌트와 관련된 HAL 구현을 포함하고 있다. 사운드 카드, 오디오 코드, 오디오 입출력들이 있다.

camera

디렉토리는 카메라 HAL 구현을 담고 있다. 카메라와 상호작용하는 android framework 인터페이스를 제공한다.

libhardware

디렉토리는 HAL인터페이스의 정의와 각기 다른 하드웨어 컴포넌트에 걸친 공통 코드를 담고 있다. HAL 레이어의 핵심이다.

lights

LED와 관련된 HAL 디렉토리이다.

power

전력관리 관련된 HAL 디렉토리이다. CPU 주파수 스케일링, 베터리 관리 등 관련이 있다.

thermal

디렉토리는 기기 온도가 안전한 정도를 보장해주는 HAL 구현이다.


external

해당 디렉토리는 안드로이드가 의존하는 넓은 범위의 외부 라이브러리, 유틸리티를 포함하고 있습니다.
이런 외부 리소스들은 안드로이드 운영체제를 빌드하거나 다양한 기능을 제공할때 사용됩니다.
 
위치: /external

서브디렉리

bzip2

해당 서브디렉토리는 압축 유틸리티에 대한 소스코드를 포함하고 있습니다. 안드로이드 빌드 프로세스에서 압축과 압축 풀기이 사용됩니다.

chromium-webview

해당 서브디렉토리는 WebView 컴포넌트에 대한 소스코드를 포함하고 있습니다. WebView는 앱들이 웹콘텐츠를 앱 내에서 표시할 수 있게 해줍니다.

clang

해당 서브디렉토리는 Clang 컴파일러에 대한 소스코드를 포함하고 있습니다. 안드로이드 프로젝트에서 c/c++언어를 컴파일을 하기 위해 존재합니다.

e2fsprogs

해당 서브디렉토리는 ext2, ext3, ext4 파일시스템를 다루는 유틸리티를 동작시키는 소스코드를 포함하고 있습니다.

icu

해당 서브디렉토리는 Unicode 라이브러리를 포함하고 있습니다. 해당 라이브러리는 유니코드 및 표준을 지원합니다.

libpng

해당 서브디렉토리는 PNG파일을 처리하는 libpng 라이브러리를 포함하고 있습니다.

openssl

해당 서브디렉토리는 OpenSSL 라이브러리를 포함하고 있습니다. OpenSSL은 함호화와 보안 통신 기능을 제공합니다.

sqlite

해당 서브디렉토리는 SQLite 데이터베이스 엔진에 대한 소스코드를 포함하고 있습니다. 안드로이드 데이터 저장소 전역에서 사용되고 있습니다.

valgrind

해당 서브디렉토리는 Valgrind 메모리 분석 도구에 대한 소스코드를 포함하고 있습니다. 해당 라이브러리는 디버깅과 프로파일링에 사용됩니다.

zlib

해당 서브디렉토리는 zlib 라이브러리를 포함하고 있습니다. 해당 디렉토리는 압축과 압축 해제에 사용됩니다.

external 관련 디렉토리(art, dalvik)를 분석함으로써..

  • 빌드 프로세스에서 어떤 라이브리러와 의존성을 가지고 있는 확인 가능
  • 어떤 코드를 재사용하는지
  • 보안, 안정성을 확보하는지
  • 어떻게 상호 운용성을 확보하는지
  • 어떤 개발 도구를 사용하는지
  • 어떻게 코드를 유지 관리하는지
  • 오픈 소스 에코 시스템 이해

kernel

커널은 안드로이드 운영체제에서 사용되는 리눅스 커널을 위한 소스코드가 포함된 디렉토리입니다. 리눅스 커널은 하드웨어와 직접적으로 상호작요하고 필요한 서비스와 필수적인 상위 레벨 소프트웨어 레이어에 대한 추상화를 제공하는 운영체제의 필수적인 컴포넌트입니다. 
 
위치: /kernel

서브디렉토리

arch

해당 디렉토리는 다양한 안드로이드가 지원하는 프로세서 구조에 대한 구체적인 코드를 포함하고 있습니다.
예를 들어서 ARM, ARM64, x86등을 지원합니다.

block

해당 서브디렉토리는 디바이스 드라이버와 입출력 시스템와 관련된 블락(함수)를 포함하고 있습니다.

crypo

해당 서브디렉토리는 커널에서 구현된 암호화, 암호화 알고리즘과 관련된 코드를 포함하고 있습니다.

driver

해당 서브디렉토리는 다양한 하드웨어 컴포넌트를 위한 입력 장치, 네트워크 장치, 저장 장치 등과 같은 디바이스 드라이버를 포함하고 있습니다.

fs

해당 서브디렉토리는 커널이 지원하는 파일 시스템과 관련된 코드를 포함하고 있습니다. ext4, FAT, 등

ipc(inter-process-communication)

해당 서브디렉토리는 커널 내부에서 사용되거나 사용자단과 커널 사이에서 사용되느 ipc에 대한 코드를 포함하고 있습니다. 

kernel

해당 서브 디렉토리는 커널의 핵심에 관련된 코드를 포함하고 있습니다. 프로세스 관리, 메모리 관리, 커널 설치와 같은 동작과 관련 있습니다.

mm

해당 서브 디렉토리는 메모리 관리와 관련된 코드를 포함하고 있습니다. 예를 들어 가상 메모리 시스템, 메모리 할당과 같은 구현이 포함되어 있습니다.

net

해당 서브 디렉토리는 네트워킹과 관련된 코드가 포함 되어있습니다. 예를들어 네트워크 프로토콜, 소켓 처리, 네트워크 다바이스 드라이버에 관련된 코드가 존재합니다.

security

해당 서브 디렉토리는 보안 모듈, 커널 구현을 위한 정책과 관련된 코드들이 포함되어있습니다.

kernel관련 디렉토리(art, dalvik)를 분석함으로써..

  • 안드로이드와 관련된 하드웨어를 어떻게 추상화 하였는지 파악 가능
  • 커널 공간과 사용자 공간에서 어떤 일이 일어나는 파악 가능
  • 어떻게 하드웨어와 커널이 소통하는지 어떻게 하드웨어 특성을 활성화하는지 파악 가

 

용어

Daemon

UNIX나 Linux 운영체제에서 주로 사용되는 용어로, 사용자가 직접 인터페이스하지 않고 백그라운드에서 특정 작업을 수행하는 프로그램

서비스(Service)

Daemon과 같이 시스템에서 백그라운드에서 실행되며, 특정 작업을 수행하거나 시스템의 특정 기능을 관리하는 프로그램

운영체제에 따라 부르는 방식이 다른데 서비스 같은 경우에는 윈도우 환경 그리고 안드로이드에서 주로 서비스를 사용합니다.

JIT(Just In Time)

JIT 컴파일은 애플리케이션이 실행되는 동안 필요한 시점에 코드를 컴파일하는 방식입니다.
즉, 한꺼번에 컴파일하는 것이 아닌 해당 코드 실행이 필요할때 컴파일을 하는 방식입니다.
이를 통해 실행 속도를 높이고 메모리 사용을 최적화할 수 있습니다.

AOT(Ahead Of Time)

AOT(Ahead-of-Time) 컴파일은 프로그램의 코드를 실행하기 전에 미리 컴파일하는 방식입니다.
앞서 설명 드린 JIT 방식과 대조되는 방식이라고 할 수 있습니다.
Android에서는 AOT 컴파일이 주로 ART(Android Runtime)에서 사용됩니다.
 
 
https://medium.com/@samirdubey/discovering-androids-source-traversing-the-aosp-s-file-structure-7ad239823cc9

 

Discovering Android’s Source: Traversing the AOSP’s File Structure

Here’s a more detailed breakdown of the Android architecture and where you can find the corresponding files and folders in the AOSP…

medium.com