기록

[GPT가 알려주는] AIDL 파일 본문

잡동사니/GPT가 알려주는

[GPT가 알려주는] AIDL 파일

heylo 2025. 12. 8. 10:20

좋다. 이 질문을 제대로 이해하면 Android 시스템 아키텍처의 절반을 이해한 것과 같다.

바로 설명 들어갈게.
이건 DDS 연동뿐 아니라 앞으로도 계속 쓰이는 개념이야.


🎯 AIDL 파일을 가져오는 이유 = 시스템 서비스와 앱이 “Binder IPC”로 통신하기 위해서

🔥 핵심 한 줄

AIDL은 “시스템 서비스와 앱 사이의 인터페이스(약속)”를 정의하는 파일이다.

즉,

  • 앱 ↔ 시스템 서비스(dss_svc)
  • 앱 ↔ 안드로이드 프레임워크 서비스(LocationManager 같은)
  • 앱 ↔ 다른 앱

이런 IPC(프로세스 간 통신)를 Binder 기반으로 하기 위해 “함수들, 매개변수 타입들, 콜백 구조”를 정의하는 프로토콜이 필요함.

그게 바로 AIDL.


📌 1. AIDL은 "약속된 인터페이스를 정의하는 문서(프로토콜)"

예를 들어 네 AIDL:

interface IDdsService {
    oneway void registerCommand(int commandId, IDdsCallback callback);
    oneway void unregisterCommand(int commandId, IDdsCallback callback);
    oneway void setCommandData(int commandId, int messageId, byte channel, in byte[] data);
}

이거 하나로 무엇을 “약속”하는 거냐?

시스템 서비스(dss_svc) 쪽:

  • 이 함수들을 반드시 구현해야 한다

앱 쪽:

  • 이 함수들을 호출할 수 있다
  • 매개 변수 타입과 순서는 AIDL이 정한 대로만 쓸 수 있다

공식적인 API 계약서야.


📌 2. AIDL은 “Binder Stub/Proxy”를 자동 생성한다

안드로이드는 IPC를 Binder로 처리한다.
AIDL이 있으면 컴파일 시 아래를 자동 생성한다:

  • Stub: 서비스 구현이 상속해야 하는 클래스
  • Proxy: 앱이 함수 호출할 때 사용하는 리모트 인터페이스

즉 이거 없이 binder IPC 함수들은 만들 수 없다.

그래서 앱에서 이렇게 쓸 수 있는 것임:

val dds = IDdsService.Stub.asInterface(binder)

이 Stub.asInterface() 는 AIDL이 없으면 존재할 수가 없는 코드야.


📌 3. 앱이 dds_svc에 연결하려면 AIDL이 반드시 있어야 한다

보드에서는 dds_svc 가 아래처럼 binder 서비스로 등록됨:

ivi.dds.service.IDdsService

앱에서 이 binder 서비스를 호출하려면
그 서비스의 인터페이스 정의(AIDL)가 있어야 한다.

왜?

서비스는 binder handle만 던져주기 때문에,
그게 어떤 함수들을 제공하는지 모르기 때문.

Binder handle 자체는 “1과 0으로 된 데이터 조각”임.
해석하려면 AIDL 인터페이스가 필요함.

AIDL 없으면 binder 연결 불가능.


📌 4. Callback (IDdsCallback)도 AIDL로 정의해야 한다

왜냐?

callback = 시스템 서비스가 앱으로 호출한다 (역방향 IPC)

앱이 callback을 구현하면 시스템 서비스(dss_svc)가 이걸 호출함:

oneway void onReceive(int commandId, byte channel, int messageId, int timestamp, in byte[] data);

이것도 binder를 타고 프로세스 간 통신이 일어나니까
AIDL로 인터페이스를 정의해야 자동 Stub/Proxy가 만들어짐.


📌 5. 👑 결론: AIDL의 역할 3가지 요약

✅ 1) 앱 ↔ 시스템 서비스 사이의 공식 통신 규약 정의

✅ 2) IPC에 필요한 Stub/Proxy 자동 생성

→ 개발자가 직접 구현할 필요 없음

✅ 3) binder handle을 실제 사용 가능한 API로 변환

→ IDdsService.Stub.asInterface() 가 바로 이것


🔥 AIDL이 없으면 어떤 일이 일어나냐?

  • dds_svc binder 서비스 핸들을 앱에서 가져와도 사용 불가능
  • 함수 목록을 알 수 없음
  • 파라미터 구조도 알 수 없음
  • callback 보내고 받을 수 없음
  • 결국 DDS 메시지 수신 불가

앱은 dds_svc와 절대 통신할 수 없음.


🙋‍♂️ 너가 이해한 내용 확인 질문 하나만

AIDL 역할이 아래 중 어떤 것이라고 생각해?

  1. 앱과 시스템 서비스 사이의 API(약속)를 정의한다
  2. IPC에 필요한 binder Stub/Proxy를 자동 생성한다
  3. binder raw 핸들을 실제 함수 호출로 바꿔주는 변환 코드이다
  4. 위의 모두

정답은?
(너가 선택하면, 네 이해도가 어느 정도인지 바로 체크해줄게)