AIDL(Android Interface Definition Language)은 사용자가 IPC를 추상화할 수 있는 도구입니다. 인터페이스( .aidl
파일에 지정됨)가 주어지면 다양한 빌드 시스템은 aidl
바이너리를 사용하여 C++ 또는 Java 바인딩을 구성하므로 런타임이나 비트 수에 관계없이 이 인터페이스를 프로세스 전체에서 사용할 수 있습니다.
AIDL은 Android의 모든 프로세스 간에, 즉 플랫폼 구성 요소 간에 또는 앱 간에 사용할 수 있습니다. 그러나 앱용 API로는 사용되지 않습니다. 예를 들어 AIDL은 플랫폼에서 SDK API를 구현하는 데 사용될 수 있지만 SDK API 표면에는 AIDL API가 직접 포함되지 않습니다. 앱 간에 AIDL을 직접 사용하는 방법에 대한 문서는 해당 Android 개발자 문서 를 참조하세요. APEX(Android 10부터) 또는 HAL(Android 11부터)과 같이 별도로 업데이트되는 플랫폼 구성 요소 간에 AIDL을 사용하는 경우 Stable AIDL 이라는 버전 관리 시스템을 사용해야 합니다.
예시
다음은 AIDL 인터페이스의 예입니다.
package my.package;
import my.package.Baz; // defined elsewhere
interface IFoo {
void doFoo(Baz baz);
}
서버 프로세스는 인터페이스를 등록하고 이에 대한 호출을 제공하고 클라이언트 프로세스는 이러한 인터페이스를 호출합니다. 많은 경우에 프로세스는 여러 인터페이스를 참조할 수 있기 때문에 클라이언트와 서버 모두의 역할을 합니다. AIDL 언어에 대한 자세한 내용은 AIDL 언어를 참조하십시오. 이러한 인터페이스를 사용하는 데 사용할 수 있는 다양한 런타임에 대한 자세한 내용은 AIDL 백엔드 를 참조하세요. 이러한 유형 선언은 주어진 언어의 클래스 선언과 정확히 같지만 프로세스 간에 작동합니다.
작동 방식
AIDL은 바인더 커널 드라이버를 사용하여 호출합니다. 호출할 때 메서드 식별자와 모든 개체는 버퍼에 패킹되고 바인더 스레드가 데이터 읽기를 기다리는 원격 프로세스에 복사됩니다. 바인더 스레드가 트랜잭션에 대한 데이터를 수신하면 스레드는 로컬 프로세스에서 기본 스텁 개체를 조회하고 이 클래스는 데이터의 압축을 풀고 로컬 인터페이스 개체를 호출합니다. 이 로컬 인터페이스 개체는 서버 프로세스가 만들고 등록하는 개체입니다. 동일한 프로세스와 동일한 백엔드에서 호출이 이루어지면 프록시 객체가 존재하지 않으므로 패킹이나 언패킹 없이 직접 호출됩니다.
장치의 서비스와 상호 작용
Android에는 기기의 서비스와 상호 작용할 수 있는 몇 가지 명령이 있습니다. 노력하다:
adb shell dumpsys --help # listing and dumping services
adb shell service --help # sending commands to services for testing