HAL(Hardware Abstraction Layer, 하드웨어 추상화 계층)은 운영체제 커널과 상위 소프트웨어 스택 사이에 표준화된 인터페이스를 제공하여, 하드웨어 제조사별 구현 차이를 소프트웨어 계층이 직접 다루지 않아도 되도록 격리하는 소프트웨어 구조다.[1] AOSP 아키텍처에서 HAL은 Android framework가 카메라·오디오·센서 같은 하드웨어 기능을 벤더 중립적 API로 호출할 수 있게 해 주며, 실제 드라이버 구현은 하위 벤더 영역에 위임한다.[2] 안드로이드 (운영체제) 8.0(Oreo)의 Project Treble 이후 HAL 인터페이스는 시스템 파티션과 벤더 파티션을 명확히 분리하는 핵심 경계가 되었다.[3]

1. 개념과 역할

HAL의 본질은 "구현을 숨기는 계약"이다. 운영체제나 애플리케이션 계층은 HAL이 정의한 함수 서명과 데이터 구조만 보고, 그 뒤에서 실제 하드웨어를 제어하는 드라이버 코드는 보지 않는다.[1] 이 원칙 덕분에 같은 Android 시스템 이미지를 다양한 하드웨어 플랫폼에 올릴 수 있고, 벤더는 자신의 칩셋이나 주변장치에 맞는 HAL 구현체만 교체하면 된다.[2]

AOSP 스택에서 HAL은 Linux 커널 드라이버 바로 위, native libraries와 Android framework 아래에 위치한다.[2] 앱이 카메라를 열거나 센서 데이터를 읽을 때 호출 경로는 프레임워크 → HAL → 커널 드라이버 순으로 내려가며, 각 단계는 정해진 인터페이스로만 통신한다. Application Sandbox가 앱 간 격리를 강제하듯이, HAL 경계는 하드웨어 접근 경로를 한 곳으로 모아 예측 가능한 보안 표면을 만든다.[2]

2. HIDL과 AIDL: 인터페이스 정의 언어의 변천

Android 8.0 이전까지 HAL은 C 헤더 파일로 정의된 단순한 공유 라이브러리 형태였다. 이 방식은 호환성 경계가 불분명해 Android 프레임워크를 업데이트할 때 벤더 드라이버를 함께 재컴파일해야 하는 문제를 낳았다.[3]

2.1 HIDL (HAL Interface Definition Language)

Android 8.0에서 도입된 HIDL은 HAL 인터페이스를 언어 중립적인 정의 파일(.hal)로 기술하고, 이를 바탕으로 C++ 또는 Java 바인딩을 자동 생성하는 IDL이다.[4] HIDL HAL은 두 가지 실행 모드를 지원했다.

  • 바인더화(Binderized) HAL: 별도 프로세스에서 동작하며 Binder IPC로 통신한다. 안정성과 격리를 높이지만 IPC 오버헤드가 있다. Android 8.0 이후 출시 기기는 이 방식만 허용된다.[4]
  • 패스스루(Passthrough) HAL: HAL 구현이 클라이언트 프로세스와 같은 공간에 공유 라이브러리로 로드된다. IPC 비용이 없어 빠르지만 프로세스 격리가 제공되지 않는다. Android 8.0으로 업그레이드하는 기존 기기의 하위 호환 경로로만 허용되었다.[4]

2.2 AIDL for HAL (Android 11+)

Android 11부터 AIDL(Android Interface Definition Language)로 HAL을 정의하는 방식이 공식 지원되었다.[5] AIDL은 원래 앱과 시스템 서비스 간 IPC에 사용되던 언어인데, 안정성 어노테이션과 버전 관리 기능이 추가되면서 HAL 용도로 확장되었다. Android 13부터는 HIDL이 공식 deprecated되었고, 새로운 HAL은 모두 AIDL로 작성해야 한다.[5]

AIDL HAL은 바인더화 방식만 지원하며(패스스루 없음), HIDL보다 버전 관리가 단순하고 단일 IPC 런타임으로 전체 스택을 구현할 수 있다는 장점이 있다.[5] 카메라, 오디오, 센서 등 주요 서브시스템은 Android 13~14 기간에 AIDL로 이전이 진행되었다.

3. Project Treble과 벤더 분리

2017년 Android 8.0과 함께 발표된 Project Treble은 HAL 아키텍처를 근본적으로 바꾼 이니셔티브다.[3] 핵심 아이디어는 Android framework(시스템 파티션)와 벤더별 HAL 구현(벤더 파티션)을 물리적으로 다른 파티션에 배치하고, 그 경계를 안정적인 인터페이스로 정의하는 것이다.[3]

이 분리가 중요한 이유는 OTA 업데이트 속도와 직결되기 때문이다. Treble 이전에는 Google이 새 Android 버전을 내놓아도, 칩셋 벤더가 HAL을 새 버전에 맞게 재컴파일·검증하고 기기 제조사가 다시 테스트해야 했다. Treble 이후에는 프레임워크 파티션을 벤더 파티션 재컴파일 없이 독립적으로 교체할 수 있게 되었다.[3]

Treble은 또한 VTS(Vendor Test Suite)를 도입해 벤더 인터페이스의 호환성을 자동으로 검증한다. VTS는 CTS(Compatibility Test Suite)의 벤더 버전으로, HAL 구현이 명세를 만족하는지 확인한다.[3] Verified Boot가 부팅 체인의 무결성을 보장하듯이, VTS는 런타임 전에 벤더 구현의 계약 준수를 검증하는 역할을 한다.

4. 주요 HAL 모듈

Android는 하드웨어 서브시스템별로 HAL 인터페이스를 별도로 정의한다. AOSP에서 전통적인 HAL 인터페이스는 hardware/libhardware/include/hardware/ 아래 C 헤더로, HIDL·AIDL 시대에는 hardware/interfaces/ 아래 IDL 파일로 정의된다.[2] 대표적인 모듈은 다음과 같다.

  • Camera HAL: 카메라 캡처·스트리밍·설정을 추상화한다. Android 8.0에서 HIDL 기반 Camera HAL3 인터페이스로 표준화되었고, 이후 AIDL로 전환이 진행 중이다.[6]
  • Audio HAL: 오디오 입출력 경로, 스트림 설정, 음량 제어를 담당한다. Android 13부터 AIDL Audio HAL이 권장된다.[7]
  • Sensors HAL: 가속도계·자이로스코프·조도 센서 등 IMU 계열 센서 데이터를 제공한다. Sensors HAL 2.0은 HIDL 기반으로 이벤트 큐 방식을 도입했다.
  • Bluetooth HAL: Bluetooth 스택과 커널 드라이버 사이를 중계한다.
  • Wi-Fi HAL: 스캔, 연결, 상태 보고 등 Wi-Fi 제어 경로를 제공한다. libhardware_legacy 아래에 위치해 일부 비표준 인터페이스를 포함한다.
  • GPS/GNSS HAL: 위치 정보 제공자와 시스템 위치 서비스를 연결한다.
  • Graphics/Display HAL: 화면 컴포지션과 하드웨어 가속을 담당하는 Gralloc, HWC(Hardware Composer) HAL이 여기에 속한다.

5. 다른 운영체제의 HAL과 비교

HAL 개념은 Android 고유의 것이 아니다. Windows와 Linux도 각각 다른 방식으로 하드웨어 추상화를 구현한다.[8]

Windows HAL: Windows NT 커널은 hal.dll을 통해 커널 모드에서 하드웨어 추상화를 제공한다. 인터럽트 처리, 타이머, DMA, I/O 버스 접근 등 저수준 기능이 HAL에 포함된다. 64비트 Windows에서는 x86-64의 표준화 덕분에 단일 HAL 파일만 존재한다.[8]

Linux HAL (구 freedesktop.org HAL): 2000년대 중반 Linux 데스크톱 생태계는 D-Bus 기반 HAL 데몬(hald)을 사용했으나, 2008~2010년경 기능이 udev와 /sys 가상 파일시스템으로 통합되면서 deprecated되었다.[8] 현재 Linux는 별도의 "HAL 계층" 없이 커널이 직접 sysfs, devtmpfs, udev 규칙을 통해 하드웨어를 노출한다.

Android HAL은 이 두 방식과 달리 사용자 공간에서 동작하는 독립 프로세스(binderized) 또는 라이브러리(passthrough) 형태로 구현되며, IDL로 정의된 IPC 경계와 버전 관리 계약을 명시적으로 강제한다는 점이 특징이다.[1][2]

6. HAL과 보안 모델

HAL은 Application SandboxVerified Boot와 함께 Android 보안 계층의 일부를 형성한다. 바인더화 HAL은 별도 프로세스로 실행되어 SELinux 정책으로 접근이 제어되며, 프레임워크나 앱이 HAL을 직접 조작하지 못하도록 권한 경계를 강제한다.[2] 이 구조는 하드웨어 벤더 코드의 결함이 안드로이드 (운영체제) 프레임워크 전체로 전파되는 것을 제한한다.

7. 관련 문서

8. 인용 및 각주

[1] Hardware abstraction layer (HAL) overview, Android Open Source Project, Ssource.android.com(새 탭에서 열림)

[2] Architecture overview, Android Open Source Project, Ssource.android.com(새 탭에서 열림)

[3] Android Developers Blog: Here comes Treble: A modular base for Android, 2017, Aandroid-developers.googleblog.com(새 탭에서 열림)

[4] HIDL, Android Open Source Project, Ssource.android.com(새 탭에서 열림)

[5] AIDL for HALs, Android Open Source Project, Ssource.android.com(새 탭에서 열림)

[6] Camera HAL, Android Open Source Project, Ssource.android.com(새 탭에서 열림)

[7] AIDL and HIDL Audio HAL comparison, Android Open Source Project, Ssource.android.com(새 탭에서 열림)

[8] The Linux Kernel documentation. "Driver implementer's API guide." Ddocs.kernel.org(새 탭에서 열림)