AIDL 언어

AIDL 언어는 대략적으로 자바 언어에 기반합니다. 파일에서는 인터페이스 계약을 지정하고 이 계약에 사용된 다양한 데이터 유형과 상수를 지정합니다.

패키지

모든 AIDL 파일은 다양한 백엔드의 패키지 이름에 대응하는 선택적 패키지로 시작됩니다. 패키지 선언은 다음과 같습니다.

    package my.package;

자바와 마찬가지로 AIDL 파일은 패키지와 일치하는 폴더 구조에 있어야 합니다. my.package 패키지를 포함하는 파일은 my/package/ 폴더에 있어야 합니다.

유형

AIDL 파일은 여러 위치에서 유형을 지정할 수 있습니다. AIDL 언어에서 지원하는 유형의 정확한 목록은 AIDL 백엔드 유형을 참고하세요.

주석

AIDL 언어의 여러 부분에서 주석을 지원합니다. 주석 목록과 주석을 적용할 수 있는 위치는 AIDL 주석을 참고하세요.

가져오기

다른 인터페이스에 정의된 유형을 사용하려면 먼저 빌드 시스템에 종속 항목을 추가해야 합니다. Android 플랫폼 빌드의 srcs 아래에 .aidl 파일이 직접 사용되는 cc_*java_* Soong 모듈에서는 aidl: { include_dirs: ... } 필드를 사용하여 디렉터리를 추가할 수 있습니다. aidl_interface를 사용하여 가져오는 항목은 여기를 참고하세요.

가져오기 명령은 다음과 같습니다.

    import some.package.Foo;  // explicit import

동일한 패키지에서 유형을 가져올 때 패키지를 생략할 수 있습니다. 하지만 패키지를 생략하면 패키지 없이 유형을 지정하고 전역 네임스페이스에 배치할 때 모호한 가져오기 오류가 발생할 수 있습니다. 일반적으로 모든 유형에 네임스페이스가 지정되어야 합니다.

    import Foo;  // same as my.package.Foo

유형 정의

AIDL 파일은 일반적으로 인터페이스로 사용되는 유형을 정의합니다.

인터페이스

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

    interface ITeleport {
        void teleport(Location baz, float speed);
        String getName();
    }

인터페이스는 일련의 메서드를 사용하여 객체를 정의합니다. 메서드는 oneway(oneway void doFoo())이거나 동기식일 수 있습니다. 인터페이스가 oneway(oneway interface ITeleport {...})로 정의된 경우 인터페이스의 모든 메서드는 암시적으로 oneway입니다. 단방향 메서드는 비동기식으로 전달되며 결과를 반환할 수 없습니다. 또한, 같은 스레드에서 같은 바인더로 가는 단방향 메서드는 잠재적으로 다른 스레드에 있더라도 순차적 실행이 보장됩니다. 스레드 설정 방법에 관한 설명은 AIDL 백엔드 스레드 관리를 참고하세요.

메서드는 인수가 없거나 하나 이상의 인수를 가질 수 있습니다. 메서드의 인수는 in, out, inout일 수 있습니다. 이것이 인수 유형에 미치는 영향에 관한 설명은 AIDL 백엔드 방향을 참고하세요.

Parcelable

백엔드별 parcelable을 만드는 방법에 관한 설명은 AIDL 백엔드 맞춤 parcelable을 참고하세요.

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

    package my.package;

    import my.package.Boo;

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

Union

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;
    }

Enum

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

    package my.package;

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

중첩 유형 선언

Android 13 이상에서는 중첩 유형 선언을 지원합니다. 예:

    package my.package;

    import my.package.Baz;

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

        parcelable Bar { ... }          // nested type definition
    }

상수

맞춤 AIDL 인터페이스, parcelable, union에는 다음과 같은 정수 및 문자열 상수도 포함될 수 있습니다.

    const @utf8InCpp String HAPPY = ":)";
    const String SAD = ":(";
    const byte BYTE_ME = 1;
    const int ANSWER = 6 * 7;

상수 표현식

AIDL 상수, 배열 크기 및 열거자는 상수 표현식을 사용하여 지정할 수 있습니다. 표현식은 괄호를 사용하여 연산을 중첩할 수 있습니다. 상수 표현식 값은 정수 또는 부동 소수점 수 값과 함께 사용할 수 있습니다.

truefalse 리터럴은 불리언 값을 나타냅니다. 3.8과 같이 .이 있는 값(접미사 없음)은 이중 값으로 간주됩니다. 부동 소수점 수 값에는 접미사 f가 있습니다(예: 2.4f). l 또는 L 접미사가 있는 정수 값은 64비트의 긴 값을 나타냅니다. 그렇지 않은 경우 정수 값은 8비트(byte), 32비트(int), 64비트(long) 중에 최솟값이 보존되는 부호 있는 유형을 가져옵니다. 따라서 256int로 간주되지만 255 + 1byte 0이 되도록 오버플로됩니다. 0x3과 같은 16진수 값은 먼저 32비트와 64비트 사이의 최솟값이 보존되는 부호 없는 유형으로 해석된 후 부호 없는 값으로 다시 해석됩니다. 따라서 0xffffffff에는 int-1이 있습니다. Android 13부터는 접미사 u83u8과 같은 상수에 추가하여 byte 값을 나타낼 수 있습니다. 이 접미사는 0xffu8 * 3과 같은 계산이 byte 유형의 -3으로 해석되어야 하는 반면 0xff * 3int 유형의 765가 되어야 하므로 중요합니다.

지원되는 연산자에는 C++ 및 자바 시맨틱스가 있습니다. 가장 낮은 우선순위에서 가장 높은 우선순위로 바이너리 연산자 순서는 || && | ^ & == != < > <= >= << >> + - * / %입니다. 단항 연산자는 + - ! ~입니다.