AOSP Binder·AIDL 문서 · Linux 6.18.37 driver 경로

Binder 호출에서 커널이 실제로 전달하는 것

함수처럼 보이는 원격 호출을 프로세스·스레드·버퍼·handle로 나누어 봅니다.

원격 객체의 handle은 포인터가 아닙니다

프로세스 A에서 얻은 Binder handle은 A의 Binder 참조를 식별하는 값입니다. 프로세스 B의 함수 주소나 B가 가진 C++ 객체 포인터를 A가 그대로 역참조한다는 뜻이 아닙니다. 프록시는 메서드 번호와 인자를 요청 메시지로 만들고, 커널은 수신할 객체와 프로세스를 찾아 전달합니다.

동기 Binder 호출의 기본 경로
  1. 클라이언트의 proxy

    메서드와 인자를 Parcel로 구성합니다.

    transaction 요청을 Binder driver에 전달합니다.

  2. Binder driver

    대상 참조·권한·버퍼를 처리하고 수신 측에 작업을 대기시킵니다.

    수신 스레드가 요청을 읽을 수 있게 합니다.

  3. 서버의 stub와 구현

    요청을 해석하고 서비스 코드를 실행합니다.

    reply transaction을 보냅니다.

  4. 클라이언트

    응답을 해석해 원래 호출자에게 결과를 돌려줍니다.

화살표는 요청과 응답의 전달입니다. 매 화살표가 반드시 한 번의 context switch와 일대일로 대응한다는 뜻은 아닙니다.

일반적인 transaction 데이터와 큰 공유 버퍼를 구분해야 합니다. Binder가 메모리 매핑을 사용한다는 사실만으로 모든 인자가 복사 없이 전달된다고 설명하면 틀립니다. 파일 descriptor와 Binder 객체 참조는 별도 처리되고, 대용량 데이터를 위한 공유 메모리의 수명·동기화는 호출자가 설계해야 합니다. Binder transaction 구현

동기 호출은 호출 스레드를 기다리게 할 수 있습니다

서버가 응답할 때까지 클라이언트의 호출 스레드가 대기할 수 있습니다. 따라서 UI 스레드에서 오래 걸리는 동기 호출을 하면 화면 응답이 늦어질 수 있습니다. 서버 쪽도 Binder thread pool을 통해 여러 요청이 동시에 들어올 수 있으므로 공유 상태를 보호해야 합니다.

상황왜 문제가 됩니까?설계할 부분
잠금을 잡은 채 다른 서비스에 동기 호출호출 상대가 다시 나를 호출하면 잠금과 중첩 호출이 얽힐 수 있습니다.잠금 범위를 줄이고 외부 호출 전후의 객체 상태를 정합니다.
오래 걸리는 작업을 Binder 스레드에서 수행처리 가능한 스레드를 오래 점유합니다.작업 분리와 응답 정책을 설계합니다. 무조건 thread 수만 늘리지 않습니다.
oneway를 쓰면 완료됐다고 가정호출자가 reply를 기다리지 않는 것과 서버 작업 완료는 다릅니다.완료가 필요하면 callback·상태 조회 등 별도의 규약을 둡니다.

oneway 요청도 데이터 전달과 자원을 사용합니다. “즉시 실행”, “절대 blocking되지 않음”, “여러 호출이 마음대로 병렬 실행됨”을 모두 보장하는 옵션은 아닙니다. AIDL backend와 호출 방식 AIDL 언어와 oneway

binder·hwbinder·vndbinder는 역사적 문맥이 있습니다

Android 8의 Treble 설명에는 framework와 vendor 통신을 분리하기 위한 /dev/binder, /dev/hwbinder, /dev/vndbinder 구분이 자주 나옵니다. 이후 Stable AIDL은 안정성 규칙을 갖춘 인터페이스로 system과 vendor 사이의 통신을 지원합니다. 따라서 “vendor는 언제나 /dev/binder를 사용할 수 없다”는 문장을 현재의 모든 구성에 적용하지 않습니다.

자료에서 만난 이름읽을 때 확인할 것
HIDL HALHIDL 인터페이스인지, binderized인지 passthrough인지 확인합니다.
AIDL HALStable AIDL·VINTF 안정성과 사용하는 backend를 확인합니다.
vndservicemanagerAndroid 11 이후 deprecation과 제품의 실제 사용 여부를 확인합니다.
binder driver사용자 공간의 AIDL/HIDL 코드 생성기와 역할을 구분합니다.

Binder IPC의 버전별 변화 AIDL HAL 규칙

서비스를 못 찾는 것과 transaction 실패를 나눕니다

서비스 검색 실패라면 먼저 서비스가 시작됐는지, 이름과 instance가 맞는지, 올바른 manager에 등록됐는지 봅니다. 등록은 됐지만 호출이 실패하면 권한·인터페이스 버전·서버 생존 여부·transaction 크기·스레드 상태를 확인합니다. 드라이버 로그 한 줄만 보고 서비스 구현의 모든 원인을 판단하지 않습니다.

service list
ps -A
logcat -b all

위 명령은 관찰용 예입니다. 실제로 볼 수 있는 서비스와 로그는 빌드 종류·실행 권한에 따라 달라집니다.