Android/Framework

Android HAL 모듈 분석: Camera HAL과 Audio HAL

임베디드 친구 2025. 3. 25. 08:09
728x90
반응형

Android HAL 모듈 분석: Camera HAL과 Audio HAL

Android의 HAL(Hardware Abstraction Layer)은 하드웨어와 상위 애플리케이션 프레임워크 사이의 추상화 계층을 제공하는 중요한 구성 요소입니다. 이번 글에서는 HAL의 개념을 설명하고, 대표적인 HAL 모듈인 Camera HALAudio HAL을 AOSP(Android Open Source Project) 코드와 함께 분석하겠습니다.

1. HAL 개요

HAL은 Android의 아키텍처에서 하드웨어 추상화 계층을 담당하며, 하드웨어와 직접 상호 작용하는 Native 코드로 구현됩니다. Android의 상위 레벨 API(Application Framework)는 HAL을 통해 하드웨어에 접근하며, HAL은 다시 Vendor-Specific Code를 호출하여 실제 하드웨어 동작을 수행합니다.

HAL의 주요 특징은 다음과 같습니다:

  • 하드웨어 추상화: 하드웨어 제조사에 따라 다를 수 있는 구현을 표준 인터페이스로 제공함.
  • AIDL 또는 HIDL 사용: 최신 Android 버전에서는 HAL을 AIDL(Android Interface Definition Language) 또는 HIDL(Hardware Interface Definition Language)로 구현함.
  • vendor와 framework 분리: vendor-specific한 코드와 Android framework 코드가 분리되어 독립적인 업데이트 가능함.

HAL 모듈은 /hardware/interfaces/ 또는 /hardware/libhardware/ 디렉터리에 위치하며, 제조사별 구현은 /vendor/ 디렉터리에 존재합니다.


2. Camera HAL 분석

Camera HAL은 Android의 카메라 서브시스템을 관리하는 중요한 HAL 모듈입니다. Camera HAL은 다음과 같은 주요 컴포넌트로 구성됩니다:

2.1 Camera HAL의 구조

Camera HAL은 camera_device_t 인터페이스를 기반으로 구현되며, 다음과 같은 주요 파일들로 구성됩니다:

  • hardware/libhardware/include/hardware/camera.h
  • hardware/interfaces/camera/
  • frameworks/av/services/camera/libcameraservice/
  • vendor-specific camera HAL 구현

Camera HAL의 초기화 과정은 다음과 같습니다:

  1. CameraService 시작: CameraService는 CameraManager를 통해 카메라 장치를 관리합니다.
  2. Camera HAL 로드: hw_get_module("camera")를 호출하여 HAL 모듈을 로드합니다.
  3. Camera HAL과 연결: camera_open()을 호출하여 카메라 장치를 엽니다.
  4. 스트리밍 시작: HAL 인터페이스를 통해 프레임 버퍼를 가져오고 애플리케이션에 전달합니다.

2.2 Camera HAL 주요 코드 분석

아래는 camera_device_t 구조체의 일부를 보여주는 AOSP 코드입니다:

struct camera_device {
    hw_device_t common;
    int (*close)(struct camera_device *device);
    int (*initialize)(struct camera_device *device, camera_notify_callback notify);
    int (*configure_streams)(struct camera_device *device, camera_stream_configuration_t *config);
    int (*process_capture_request)(struct camera_device *device, camera_capture_request_t *request);
};

이 코드에서 주요 함수는 다음과 같습니다:

  • initialize(): 카메라 장치를 초기화하는 함수.
  • configure_streams(): 카메라의 스트림을 설정하는 함수.
  • process_capture_request(): 캡처 요청을 처리하는 함수.

이러한 인터페이스는 Camera HAL을 구현하는 제조사가 반드시 구현해야 하는 함수들입니다.


3. Audio HAL 분석

Audio HAL은 Android의 오디오 서브시스템을 관리하는 HAL 모듈입니다. Android의 오디오는 Audio Flinger가 Audio HAL을 호출하는 구조로 되어 있습니다.

3.1 Audio HAL의 구조

Audio HAL은 audio_hw_device_t 인터페이스를 기반으로 구현됩니다. 주요 파일은 다음과 같습니다:

  • hardware/libhardware/include/hardware/audio.h
  • hardware/interfaces/audio/
  • frameworks/av/services/audioflinger/
  • vendor-specific audio HAL 구현

Audio HAL의 동작 과정은 다음과 같습니다:

  1. AudioFlinger 시작: AudioFlinger 서비스가 시작되면서 오디오 하드웨어를 초기화합니다.
  2. Audio HAL 로드: hw_get_module("audio_hw")를 호출하여 HAL 모듈을 로드합니다.
  3. Stream 생성: open_output_stream() 또는 open_input_stream()을 호출하여 스트림을 엽니다.
  4. 오디오 데이터 처리: read() 또는 write()를 호출하여 오디오 데이터를 입출력합니다.

3.2 Audio HAL 주요 코드 분석

다음은 audio_hw_device_t 구조체의 일부입니다:

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 (*open_output_stream)(struct audio_hw_device *dev, audio_io_handle_t handle,
                              audio_devices_t devices, audio_output_flags_t flags,
                              struct audio_config *config, struct audio_stream_out **stream_out);
    int (*open_input_stream)(struct audio_hw_device *dev, audio_io_handle_t handle,
                             audio_devices_t devices, struct audio_config *config,
                             struct audio_stream_in **stream_in);
};

이 코드에서 주요 함수는 다음과 같습니다:

  • init_check(): Audio HAL이 정상적으로 초기화되었는지 확인하는 함수.
  • set_voice_volume(): 음성 통화 볼륨을 설정하는 함수.
  • open_output_stream(): 출력 스트림을 여는 함수.
  • open_input_stream(): 입력 스트림을 여는 함수.

Audio HAL은 다양한 오디오 경로(스피커, 이어폰, 블루투스 등)를 관리하며, 제조사는 이 인터페이스를 구현하여 하드웨어에 맞게 오디오를 처리해야 합니다.


4. 결론

이번 글에서는 Camera HALAudio HAL의 구조와 동작 원리를 분석하였습니다. HAL은 Android 시스템에서 하드웨어와 상위 프레임워크 사이의 인터페이스 역할을 하며, 제조사는 AOSP에서 제공하는 인터페이스를 구현하여 하드웨어와 연결해야 합니다. HAL의 구조를 이해하면 Android 시스템의 하드웨어 동작을 보다 깊이 있게 분석할 수 있으며, 향후 사용자 정의 HAL 모듈을 작성할 때도 큰 도움이 될 것입니다.

728x90
반응형