Android의 전체 아키텍처 개요
Android는 개방형 모바일 운영체제로, 다양한 하드웨어에서 동작할 수 있도록 여러 계층으로 구성되어 있습니다. 본 포스팅에서는 Android의 전체 아키텍처를 Linux Kernel, HAL(Hardware Abstraction Layer), Native Libraries, Framework, Application Layer로 나누어 설명합니다. 또한, 각 계층의 역할과 AOSP(Android Open Source Project) 코드 일부를 예시로 들어 설명하겠습니다.
1. Android 아키텍처 개요
Android 아키텍처는 크게 다음과 같은 계층으로 구성됩니다:
- Linux Kernel: 하드웨어와 직접 상호작용하며 Android 시스템의 기반이 되는 계층
- HAL (Hardware Abstraction Layer): 하드웨어 인터페이스를 정의하여 상위 계층에서 하드웨어를 제어할 수 있도록 하는 계층
- Native Libraries & Runtime: C/C++ 기반의 라이브러리 및 Android 런타임 환경(ART)
- Android Framework: 애플리케이션 개발을 위한 API 및 시스템 서비스 제공
- Application Layer: 사용자 애플리케이션이 실행되는 계층
이제 각 계층에 대해 상세히 살펴보겠습니다.
2. Linux Kernel
Android는 Linux Kernel을 기반으로 동작합니다. 이는 메모리 관리, 프로세스 스케줄링, 네트워크 스택, 보안 등을 담당합니다. 또한 Android는 표준 Linux Kernel에 추가적인 기능을 포함하여 사용합니다.
주요 기능
- Binder IPC (Inter-Process Communication): 프로세스 간 통신을 위한 Android 고유의 메커니즘
- Power Management (Wakelocks): 전력 관리를 위한 기능
- Security Modules (SELinux): 보안 강화를 위한 SELinux 지원
- Device Drivers: 하드웨어 제어를 위한 다양한 드라이버 제공
AOSP 코드 예시 (Binder IPC)
Android의 프로세스 간 통신(IPC)은 Binder를 통해 이루어집니다. Binder는 drivers/android/binder.c
에 구현되어 있습니다.
static int binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
struct binder_proc *proc = filp->private_data;
struct binder_thread *thread = NULL;
int ret;
mutex_lock(&proc->inner_lock);
thread = binder_get_thread(proc);
if (!thread) {
mutex_unlock(&proc->inner_lock);
return -ENOMEM;
}
ret = binder_ioctl_write_read(proc, thread, cmd, arg);
mutex_unlock(&proc->inner_lock);
return ret;
}
이 코드는 Binder 장치 드라이버에서 ioctl 호출을 처리하는 부분입니다.
3. Hardware Abstraction Layer (HAL)
HAL은 상위 프레임워크와 하드웨어를 연결하는 역할을 합니다. 하드웨어 제조업체는 HAL 인터페이스를 구현하여 Android 시스템과 호환되도록 합니다.
주요 역할
- 하드웨어 종속적인 기능을 캡슐화하여 상위 계층과의 독립성 유지
- 표준 인터페이스 제공을 통해 다양한 하드웨어 지원
.so
라이브러리 형태로 제공됨
AOSP 코드 예시 (Audio HAL)
Android의 Audio HAL 인터페이스는 hardware/libhardware/include/hardware/audio.h
에 정의되어 있습니다.
struct audio_hw_device {
struct hw_device_t common;
int (*init_check)(const struct audio_hw_device *dev);
int (*set_voice_volume)(struct audio_hw_device *dev, float volume);
int (*set_master_volume)(struct audio_hw_device *dev, float volume);
struct audio_stream_out *(*open_output_stream)(
struct audio_hw_device *dev, audio_io_handle_t handle);
};
이 구조체는 오디오 장치를 제어하기 위한 HAL 인터페이스입니다.
4. Native Libraries & Android Runtime (ART)
Android는 C/C++ 기반의 네이티브 라이브러리를 사용하여 성능을 향상시킵니다. 대표적인 라이브러리는 다음과 같습니다.
주요 라이브러리
- libc (Bionic): Android용 경량 C 라이브러리
- liblog: 시스템 로그 관련 라이브러리
- SQLite: 경량 데이터베이스 관리 시스템
- OpenGL ES: 2D/3D 그래픽 렌더링 지원
- Media Libraries: 오디오 및 비디오 코덱 지원
Android는 ART(Android Runtime)를 통해 애플리케이션을 실행합니다. 이는 JIT 및 AOT 컴파일을 지원하여 성능을 최적화합니다.
5. Android Framework
Android Framework는 애플리케이션 개발을 위한 주요 API와 시스템 서비스를 제공합니다. 주요 컴포넌트는 다음과 같습니다.
주요 시스템 서비스
- Activity Manager: 애플리케이션 생명 주기 관리
- Window Manager: 화면 및 UI 렌더링 관리
- Package Manager: 애플리케이션 패키지 관리
- Content Provider: 애플리케이션 간 데이터 공유 지원
- Telephony Manager: 전화 및 네트워크 기능 관리
AOSP 코드 예시 (Activity Manager)
ActivityManagerService
는 Android의 프로세스 및 앱 생명 주기를 관리합니다.
public class ActivityManagerService extends IActivityManager.Stub {
public void startActivity(Intent intent) {
enforceCallingPermission("android.permission.START_ACTIVITY");
ProcessRecord app = getProcessRecord();
startActivityLocked(app, intent);
}
}
이 코드는 startActivity
호출을 처리하는 부분입니다.
6. Application Layer
Application Layer는 사용자가 직접 실행하는 애플리케이션이 포함된 계층입니다. 모든 앱은 Android Framework의 API를 사용하여 개발됩니다.
주요 특징
- Java/Kotlin을 사용하여 개발 가능
AndroidManifest.xml
을 통해 앱 권한 및 구성 정의Activity
,Service
,BroadcastReceiver
,ContentProvider
컴포넌트를 사용하여 앱 구성
예제 코드 (MainActivity)
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
이 코드는 기본적인 Android 애플리케이션의 MainActivity를 정의하는 코드입니다.
결론
본 포스팅에서는 Android의 전체 아키텍처를 계층별로 살펴보았습니다. Android는 Linux Kernel을 기반으로 하드웨어와 상호작용하며, HAL을 통해 하드웨어 추상화를 수행합니다. Native Libraries 및 Android Runtime이 애플리케이션 실행 환경을 제공하며, Framework 계층에서 다양한 시스템 서비스를 관리합니다. 마지막으로, Application Layer에서 사용자가 실행하는 애플리케이션이 동작합니다.
'Android > Framework' 카테고리의 다른 글
Android HAL이 필요한 이유 (0) | 2025.03.19 |
---|---|
커스텀 Android 빌드 환경 구성하기 (0) | 2025.03.18 |
Android 빌드 시스템의 구조 (Soong, Makefile) (0) | 2025.03.17 |
Android 시스템 부팅 과정 개요 (0) | 2025.03.16 |
Android의 역사와 발전 과정 (0) | 2025.03.14 |