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 상수, 배열 크기 및 열거자는 상수 표현식을 사용하여 지정할 수 있습니다. 표현식은 괄호를 사용하여 연산을 중첩할 수 있습니다. 상수 표현식 값은 정수 또는 부동 소수점 값과 함께 사용할 수 있습니다.
true
및 false
리터럴은 부울 값을 나타냅니다. 값이 .
그러나 3.8
과 같이 접미사가 없는 것은 이중 값으로 간주됩니다. 부동 소수점 값에는 2.4f
와 같이 f
접미사가 있습니다. l
또는 L
접미사가 있는 정수 값은 64비트 long 값을 나타냅니다. 그렇지 않으면 정수 값은 8비트(바이트), 32비트(int) 및 64비트(long) 사이에서 가장 작은 값 보존 부호 있는 유형을 가져옵니다. 따라서 256
은 int
로 간주되지만 255 + 1
은 byte
0
으로 오버플로됩니다. 0x3
과 같은 16진수 값은 먼저 32비트와 64비트 사이에서 가장 작은 값을 유지하는 부호 없는 유형으로 해석된 다음 부호 없는 값으로 재해석됩니다. 따라서 0xffffffff
는 int
값 -1
을 갖습니다. Android T(AOSP 실험)부터 byte
값을 나타내기 위해 3u8
과 같은 상수에 접미사 u8
을 추가할 수 있습니다. 이 접미사는 중요하므로 0xffu8 * 3
과 같은 계산은 byte
유형의 경우 -3
으로 해석되는 반면 int
유형의 경우 0xff * 3
은 765
로 해석됩니다.
지원되는 연산자에는 C++ 및 Java 의미 체계가 있습니다. 가장 낮은 우선 순위에서 가장 높은 우선 순위로 이진 연산자는 || && | ^ & == != < > <= >= << >> + - * / %
. 단항 연산자는 + - ! ~
.