HIDL과 AIDL의 차이
Android 시스템에서 프로세스 간 통신(IPC, Inter-Process Communication)은 필수적인 요소입니다. Android에서는 이를 위해 AIDL(Android Interface Definition Language)과 HIDL(Hardware Interface Definition Language)이라는 두 가지 주요 인터페이스 정의 언어를 제공합니다. 이 두 기술은 목적과 사용 방식에서 차이가 있으며, Android 프레임워크와 하드웨어 간의 연결을 담당하는 중요한 역할을 합니다. 이번 포스팅에서는 AIDL과 HIDL의 차이를 설명하고, 각각의 동작 방식과 실제 AOSP 코드 예제를 통해 비교해 보겠습니다.
1. AIDL(Android Interface Definition Language) 개요
AIDL은 Android의 애플리케이션 레벨에서 IPC를 지원하는 인터페이스 정의 언어입니다. 일반적으로 서로 다른 프로세스에서 실행되는 Android 컴포넌트 간 데이터를 교환할 때 사용됩니다.
AIDL의 특징
- Android 애플리케이션 간 IPC 지원: AIDL은 기본적으로 앱 간 통신을 위해 설계되었습니다.
- 동기식 호출 지원: 클라이언트가 원격 서비스를 호출하면 해당 메서드가 실행될 때까지 차단됩니다.
- 멀티스레딩 지원: 여러 클라이언트가 하나의 서비스에 동시에 접근할 수 있습니다.
- Binder를 기반으로 동작: AIDL은 Android의 Binder IPC 메커니즘을 이용하여 프로세스 간 데이터를 전달합니다.
AIDL 사용 예제
AIDL 파일을 정의하여 인터페이스를 생성한 후, 클라이언트와 서비스에서 이를 구현해야 합니다.
1) AIDL 인터페이스 정의 (IExampleService.aidl)
// IExampleService.aidl
package com.example.aidl;
interface IExampleService {
String getMessage();
}
2) 서비스 구현 (ExampleService.java)
public class ExampleService extends Service {
private final IExampleService.Stub binder = new IExampleService.Stub() {
@Override
public String getMessage() {
return "Hello from AIDL Service";
}
};
@Override
public IBinder onBind(Intent intent) {
return binder;
}
}
3) 클라이언트에서 서비스 바인딩
private IExampleService exampleService;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
exampleService = IExampleService.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
exampleService = null;
}
};
Intent intent = new Intent(this, ExampleService.class);
bindService(intent, connection, Context.BIND_AUTO_CREATE);
2. HIDL(Hardware Interface Definition Language) 개요
HIDL은 Android의 하드웨어 인터페이스를 정의하는 언어로, Android의 Vendor 및 HAL 계층에서 사용됩니다. Android 8.0(Oreo)부터 기존의 HAL 인터페이스를 대체하기 위해 도입되었습니다.
HIDL의 특징
- 하드웨어 추상화 계층(HAL)에서 사용: AIDL과 달리 HIDL은 하드웨어 및 시스템 서비스에서 사용됩니다.
- 비동기 및 동기 호출 지원: AIDL과 달리 동기 및 비동기 호출을 모두 지원합니다.
- C++ 및 Java 지원: HIDL 인터페이스는 C++과 Java에서 사용할 수 있습니다.
- AIDL보다 성능이 뛰어남: HIDL은 성능을 최적화하여 AIDL보다 더 높은 성능을 제공합니다.
HIDL 사용 예제
HIDL을 사용하려면 .hal
파일을 정의하고 이를 구현해야 합니다.
1) HIDL 인터페이스 정의 (IExample.hal)
package vendor.example.hardware.example@1.0;
interface IExample {
getMessage() generates (string message);
}
2) HIDL 인터페이스 구현 (Example.cpp)
#include "IExample.h"
namespace vendor::example::hardware::example::V1_0::implementation {
Return<std::string> Example::getMessage() {
return "Hello from HIDL Service";
}
} // namespace
3) HIDL 서비스 등록
sp<IExample> service = new Example();
configureRpcThreadpool(1, true);
status_t status = service->registerAsService();
3. AIDL과 HIDL의 차이점 비교
특징 | AIDL | HIDL |
---|---|---|
주요 사용처 | 애플리케이션 IPC | 하드웨어 HAL 및 Vendor 계층 |
기본 언어 | Java (C++ 지원 가능) | C++ (Java 지원 가능) |
성능 | 일반적인 IPC 성능 | 성능 최적화 (더 빠름) |
동기/비동기 지원 | 동기 호출 | 동기 및 비동기 호출 모두 지원 |
사용 목적 | 앱 및 시스템 서비스 간 통신 | HAL 및 드라이버와 통신 |
4. 결론
AIDL과 HIDL은 각각의 목적과 용도가 다릅니다. AIDL은 Android 애플리케이션 및 시스템 서비스 간 IPC를 담당하며, HIDL은 하드웨어 추상화 계층(HAL)에서 사용됩니다. HIDL은 AIDL보다 성능이 뛰어나며, 동기 및 비동기 호출을 지원하여 하드웨어 인터페이스에 적합합니다. 반면, AIDL은 Java 기반으로 사용이 쉬우며, 일반적인 Android 애플리케이션 개발에 더 적합합니다.
AOSP에서는 HIDL을 사용하여 하드웨어 인터페이스를 정의하고, AIDL을 통해 프레임워크 및 애플리케이션 간 IPC를 처리합니다. 따라서 각 기술의 특성을 이해하고 적절한 상황에서 사용하는 것이 중요합니다.
'Android > Framework' 카테고리의 다른 글
Android HAL 모듈 분석: Camera HAL과 Audio HAL (0) | 2025.03.25 |
---|---|
Android HAL과 Binder IPC 이해하기 (0) | 2025.03.24 |
HIDL(HAL Interface Definition Language) 개념과 구조 (0) | 2025.03.22 |
HAL과 커널 드라이버의 관계 (0) | 2025.03.21 |
HAL의 구조 및 Android 프레임워크와의 관계 (0) | 2025.03.20 |