Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

AIDL 개요

Android 인터페이스 정의 언어(AIDL)는 사용자가 IPC를 추상화하는 데 사용하는 도구입니다. .aidl 파일에서 지정된 인터페이스의 경우 다양한 빌드 시스템에서 C++ 또는 자바 바인딩을 구성하는 데 aidl 바이너리를 사용하므로 런타임이나 비트율과 상관없이 프로세스 간에 인터페이스가 사용될 수 있습니다.

AIDL은 Android의 모든 프로세스, 즉 플랫폼 구성요소 간 또는 앱 간에 사용됩니다. 그러나 앱의 API로 사용되지는 않습니다. 예를 들어 AIDL은 플랫폼에서 SDK API를 구현하는 데 사용될 수 있지만 SDK API 노출 영역에는 AIDL API가 직접 포함되지 않습니다. 앱 간에 AIDL을 직접 사용하는 방법은 관련 Android 개발자 문서를 참조하세요. AIDL이 개별적으로 업데이트되는 플랫폼 구성요소(예: Android 10부터는 APEX 또는 Android 11부터는 HAL) 간에 사용되면 안정적 AIDL이라는 버전 관리 시스템을 사용해야 합니다.

다음은 AIDL 인터페이스의 예입니다.

    package my.package;

    import my.package.Baz; // defined elsewhere

    interface IFoo {
        void doFoo(Baz baz); // synchronous method
        oneway void doFoo(int a); // async method
    }

Android 10 이상에서는 parcelable 선언을 지원합니다. 예:

    package my.package;

    import my.package.Boo;

    parcelable Baz {
        @utf8InCpp String name = "baz";
        Boo boo;
    }

Android 11 이상에서는 enum 선언을 지원합니다. 예:

    package my.package;

    enum Boo {
        A = 1 * 4,
        B = 3,
    }

Android 12 이상에서는 union 선언을 지원합니다. 예를 들면 다음과 같습니다.

    package my.package;

    import my.package.FooSettings;
    import my.package.BarSettings;

    union Settings {
        FooSettings fooSettings;
        BarSettings barSettings;
        @utf8InCpp String str;
        int number;
    }

Android T(AOSP 실험용) 이상에서는 중첩 유형 선언을 지원합니다. 예를 들면 다음과 같습니다.

    package my.package;

    import my.package.Baz;

    interface IFoo {
        void doFoo(Baz.Nested nested);  // defined my/package/Baz.aidl
        void doBar(Bar bar);            // defined below

        parcelable Bar { ... }          // union/enum types can be nested, while
                                        // an interface can't.
    }

서버 프로세스는 인터페이스를 등록하여 호출을 제공하며 클라이언트 프로세스는 이러한 인터페이스를 호출합니다. 대부분의 경우 프로세스는 여러 인터페이스를 참조할 수 있으므로 클라이언트와 서버 역할을 모두 합니다. 인터페이스에서 사용할 수 있는 다양한 런타임에 관한 자세한 내용은 AIDL 백엔드를 참조하세요. 관련 유형 선언은 주어진 언어의 클래스 선언과 정확히 동일하지만 프로세스 간에 작동합니다.

작동 방식

AIDL은 호출 작업에 바인더 커널 드라이버를 사용합니다. 호출이 이루어지면 메서드 식별자와 모든 객체는 버퍼에 압축된 후 바인더 스레드가 데이터 읽기 작업을 대기 중인 원격 프로세스에 복사됩니다. 바인더 스레드가 트랜잭션 데이터를 수신하면 스레드는 로컬 프로세스에서 네이티브 스터브 객체를 찾으며, 클래스는 데이터를 압축해제한 후 로컬 인터페이스 객체를 호출합니다. 호출된 로컬 인터페이스 객체는 서버 프로세스에서 만들고 등록하는 객체입니다. 동일한 프로세스와 동일한 백엔드에서 호출이 이루어지는 경우 프록시 객체가 없으므로 압축 또는 압축해제 작업 없이 바로 호출이 발생합니다.

기기 서비스와 상호작용

Android에서 제공하는 명령어를 사용하여 기기 서비스와 상호작용할 수 있습니다. 다음을 시도해 보세요.

    adb shell dumpsys --help # listing and dumping services
    adb shell service --help # sending commands to services for testing