AIDL 개요

AIDL(Android 인터페이스 정의 언어)은 사용자가 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