AIDL 언어

AIDL 언어는 느슨하게 Java 언어를 기반으로 합니다. 파일은 인터페이스 계약과 이 계약에서 사용되는 다양한 데이터 유형 및 상수를 지정합니다.

패키지

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

    package my.package;

Java와 유사하게 AIDL 파일은 패키지와 일치하는 폴더 구조에 있어야 합니다. my.package 패키지가 있는 파일은 my/package/ 폴더에 있어야 합니다.

유형

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

주석

AIDL 언어의 여러 부분은 주석을 지원합니다. 주석 목록과 적용 가능한 위치는 AIDL 주석 을 참조하십시오.

수입품

다른 인터페이스에 정의된 유형을 사용하려면 먼저 빌드 시스템에 종속성을 추가해야 합니다. cc_*java_* Soong 모듈에서 .aidl 파일이 Android 플랫폼 빌드의 srcs 바로 아래에 사용되는 경우 필드 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 백엔드 스레드 관리 를 참조하십시오.

메서드는 0개 이상의 인수를 가질 수 있습니다. 메서드에 대한 인수는 in , out 또는 inout 일 수 있습니다. 이것이 인수 유형에 미치는 영향에 대한 논의는 AIDL 백엔드 방향성 을 참조하십시오.

소포

백엔드별 소포 가능 항목을 만드는 방법에 대한 설명을 보려면 AIDL 백엔드 맞춤형 소포 가능 항목 을 참조하세요.

Android 10 이상은 AIDL에서 직접 소포 가능 선언을 지원합니다. 예를 들어:

    package my.package;

    import my.package.Boo;

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

노동조합

Android 12 이상은 공용체 선언을 지원합니다. 예를 들어:

    package my.package;

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

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

열거

Android 11 이상은 열거형 선언을 지원합니다. 예를 들어:

    package my.package;

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

중첩 유형 선언

Android T(AOSP 실험적) 이상은 중첩 유형 선언을 지원합니다. 예를 들어:

    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 및 공용체는 다음과 같은 정수 및 문자열 상수를 포함할 수도 있습니다.

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

상수 표현식

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

truefalse 리터럴은 부울 값을 나타냅니다. 값이 . 그러나 3.8 과 같이 접미사가 없는 것은 이중 값으로 간주됩니다. 부동 소수점 값에는 2.4f 와 같이 f 접미사가 있습니다. l 또는 L 접미사가 있는 정수 값은 64비트 long 값을 나타냅니다. 그렇지 않으면 정수 값은 8비트(바이트), 32비트(int) 및 64비트(long) 사이에서 가장 작은 값 보존 부호 있는 유형을 가져옵니다. 따라서 256int 로 간주되지만 255 + 1byte 0 으로 오버플로됩니다. 0x3 과 같은 16진수 값은 먼저 32비트와 64비트 사이에서 가장 작은 값을 유지하는 부호 없는 유형으로 해석된 다음 부호 없는 값으로 재해석됩니다. 따라서 0xffffffffint-1 을 갖습니다. Android T(AOSP 실험)부터 byte 값을 나타내기 위해 3u8 과 같은 상수에 접미사 u8 을 추가할 수 있습니다. 이 접미사는 중요하므로 0xffu8 * 3 과 같은 계산은 byte 유형의 경우 -3 으로 해석되는 반면 int 유형의 경우 0xff * 3765 로 해석됩니다.

지원되는 연산자에는 C++ 및 Java 의미 체계가 있습니다. 가장 낮은 우선 순위에서 가장 높은 우선 순위로 이진 연산자는 || && | ^ & == != < > <= >= << >> + - * / % . 단항 연산자는 + - ! ~ .