HAL의 구조 및 Android 프레임워크와의 관계
Android는 하드웨어 추상화 계층(Hardware Abstraction Layer, HAL)을 통해 하드웨어와 프레임워크 사이의 명확한 경계를 설정합니다. HAL은 하드웨어 구현을 추상화하여 상위 프레임워크에서 하드웨어 세부 사항을 몰라도 동작할 수 있도록 합니다. 이번 글에서는 HAL의 구조와 Android 프레임워크와의 관계를 살펴보겠습니다.
1. HAL이란?
HAL은 Android의 애플리케이션 프레임워크와 리눅스 커널 사이에 위치하는 계층으로, 특정 하드웨어 기능을 표준 인터페이스로 제공하는 역할을 합니다. 이를 통해 프레임워크는 하드웨어와 독립적으로 설계될 수 있으며, 하드웨어 제조사는 HAL을 구현하여 Android와 호환되는 드라이버를 개발할 수 있습니다.
2. Android HAL의 역할
HAL은 주로 다음과 같은 역할을 수행합니다.
- 하드웨어에 대한 추상화 제공
- 하드웨어 기능을 정의된 인터페이스로 노출
- AOSP의 호환성을 유지하면서 제조사가 자체적인 구현을 제공할 수 있도록 지원
- Native C/C++ 레이어를 통한 하드웨어 액세스 제공
HAL이 없다면 Android 프레임워크는 하드웨어별로 개별적인 처리를 해야 하며, 이는 유지보수와 확장성 측면에서 어려움을 초래할 것입니다.
3. HAL의 구조
HAL은 크게 두 가지 방식으로 구현됩니다.
3.1 전통적인 HAL (Legacy HAL)
Android 8.0(Oreo) 이전 버전에서는 HAL이 공유 라이브러리(.so)로 제공되었습니다. HAL 인터페이스는 hardware/libhardware/include/hardware/hardware.h
파일을 기반으로 정의됩니다.
HAL 모듈 정의 예제
#include <hardware/hardware.h>
static int open_device(const struct hw_module_t* module, const char* id, struct hw_device_t** device) {
// 하드웨어 장치 열기 로직
return 0;
}
static struct hw_module_methods_t module_methods = {
.open = open_device,
};
struct hw_module_t HAL_MODULE_INFO_SYM = {
.tag = HARDWARE_MODULE_TAG,
.module_api_version = 1,
.hal_api_version = 0,
.id = "example_hal",
.name = "Example HAL",
.author = "Example Vendor",
.methods = &module_methods,
};
이러한 HAL은 hw_get_module()
을 통해 로드되며, 프레임워크는 HAL 인터페이스를 통해 하드웨어와 통신합니다.
3.2 HIDL 기반 HAL
Android 8.0부터 도입된 HIDL(HAL Interface Definition Language)은 기존의 HAL 방식보다 더 모듈화된 구조를 제공합니다. HIDL은 HAL 인터페이스를 정의하는 새로운 언어로, 이를 통해 시스템 안정성과 유연성을 높일 수 있습니다.
HIDL 인터페이스 예제
HIDL 인터페이스는 .hal
파일로 정의됩니다.
package vendor.example.hardware.device@1.0;
interface IExampleDevice {
bool setParameter(int32_t param);
int32_t getParameter();
};
이 인터페이스는 hidl-gen
을 통해 자동으로 스텁 코드가 생성되며, C++ 또는 Java에서 이를 구현할 수 있습니다.
HIDL 서버 구현 예제 (C++)
class ExampleDevice : public IExampleDevice {
public:
Return<bool> setParameter(int32_t param) override {
// 하드웨어 설정 처리
return true;
}
Return<int32_t> getParameter() override {
return 42; // 예제 값
}
};
이러한 방식으로 HAL이 정의되면, Android 프레임워크는 hwservicemanager
를 통해 해당 HAL 인터페이스와 통신할 수 있습니다.
4. HAL과 Android 프레임워크의 관계
HAL과 Android 프레임워크는 서로 긴밀하게 연동됩니다. 다음은 HAL과 프레임워크 간의 상호작용 흐름을 정리한 것입니다.
- 애플리케이션에서 특정 하드웨어 기능을 요청합니다.
- Android 프레임워크가 요청을 처리하고, 네이티브 시스템 서비스(Android Runtime, Native Daemon 등)로 전달합니다.
- 네이티브 레이어에서 HAL 인터페이스를 호출합니다.
- HAL이 하드웨어 드라이버와 직접 통신하여 요청을 처리합니다.
- 처리된 결과가 다시 애플리케이션으로 반환됩니다.
예를 들어, 카메라를 제어하는 흐름을 보면 다음과 같습니다.
- Camera API가 호출됨 (Java/Kotlin)
CameraService
가 요청을 처리- HAL을 통해 하드웨어 드라이버와 통신
- 결과를 Camera API로 반환
이를 통해 Android는 다양한 하드웨어 플랫폼에서 동일한 애플리케이션이 동작할 수 있도록 보장합니다.
5. HAL의 발전 방향
Google은 Android 8.0부터 HIDL을 도입하여 HAL을 보다 안정적으로 개선하였습니다. 최근에는 HIDL보다 더 발전된 AIDL(Android Interface Definition Language)이 도입되어 일부 새로운 HAL에서 사용됩니다. AIDL 기반 HAL은 성능과 유지보수 측면에서 향상된 기능을 제공합니다.
6. 결론
HAL은 Android 시스템에서 하드웨어와 프레임워크 간의 다리 역할을 합니다. 전통적인 HAL과 HIDL 기반 HAL이 존재하며, 최근에는 AIDL이 도입되는 등 지속적인 발전이 이루어지고 있습니다. 이러한 HAL 구조를 통해 제조사는 다양한 하드웨어를 Android와 손쉽게 통합할 수 있으며, 개발자는 하드웨어에 관계없이 표준 API를 통해 기능을 사용할 수 있습니다.
Android의 HAL 구조를 이해하면 하드웨어 개발뿐만 아니라 시스템 소프트웨어 개발에도 도움이 될 것입니다. 앞으로도 HAL의 발전을 주목하며, 변화하는 구조에 맞춰 개발을 진행하는 것이 중요합니다.
'Android > Framework' 카테고리의 다른 글
HIDL(HAL Interface Definition Language) 개념과 구조 (0) | 2025.03.22 |
---|---|
HAL과 커널 드라이버의 관계 (0) | 2025.03.21 |
HAL이 필요한 이유 (0) | 2025.03.19 |
커스텀 Android 빌드 환경 구성하기 (0) | 2025.03.18 |
Android 빌드 시스템의 구조 (Soong, Makefile) (0) | 2025.03.17 |