자주 받는 질문중의 하나는 “AIDL의 정확한 문법이 어떻게 되는가?” 입니다. 안드로이드의 문서에는 예제 형태로만
설명되어 있을 뿐 형식화된 문법이 제시되지 않고 있습니다. 대충 알고 대충 써라? 천만의 말씀.

 안드로이드(Android) 1.6 AIDL의 BNF Grammar 입니다. Yacc 문법을 따릅니다.

document:
document_items
| headers document_items
;

headers:
package
| imports
| package imports
;

package:
PACKAGE
;

imports:
IMPORT
| IMPORT imports
;

document_items:

| document_items declaration
;

declaration:
parcelable_decl
| interface_decl
;

parcelable_decl:
PARCELABLE IDENTIFIER ';'
;

interface_header:
INTERFACE
| ONEWAY INTERFACE
;

interface_decl:
interface_header IDENTIFIER '{' interface_items '}'
;

interface_items:

| interface_items method_decl
;

method_decl:
type IDENTIFIER '(' arg_list ')' ';'
| ONEWAY type IDENTIFIER '(' arg_list ')' ';'
;

arg_list:

| arg
| arg_list ',' arg
;

arg:
direction type IDENTIFIER
;

type:
IDENTIFIER
| IDENTIFIER ARRAY
| GENERIC
;

direction:

| IN
| OUT
| INOUT
;

PARCELABLE, INTERFACE, IN, OUT, INOUT, ONEWAY 는 각각 키워드(Keyword)
parcelable, interface, in, out, inout, oneway를 뜻하고, IMPORT, PACKAGE 는 각각
import, package 문장 전체를 뜻합니다. ARRAY 는 하나 이상의 []를 뜻하고, GENERIC 은
Collection<Object,String>과 같은 Java Generic 표현을 뜻합니다. IDENTIFIER 는
대략 Java 의 클래스 명으로 쓸 수 있는 문자열이라고 보시면 됩니다. 주석 관련 구문 요소들은 생략했습니다.
SDK 의 AIDL 설명에는 나오지 않지만, oneway 키워드를 인터페이스 또는 메쏘드 앞에 붙일 수 있음을 알 수
있습니다. One-way call 에 대한 설명은 android.os.IBinder.FLAG_ONEWAY 에 대한 SDK 문서에
등장합니다. 비록 AIDL 에서의 사용법을 설명하고 있지는 않지만, 메쏘드 실행이 끝나기를 기다리지 않고 호출 즉시 복귀하는
방법을 제공하고 있음을 알 수 있습니다. AIDL 에서 oneway 로 지정한 메쏘드들의 Proxy 는 모두 transact() 를
호출할 때 FLAG_ONEWAY 를 포함하게 됩니다. 인터페이스에 oneway 를 지정하면 모든 메쏘드에 oneway 를 지정한
효과가 발생합니다. 다중 배열은 지원되는 반면 인터페이스 계승은 지원되지 않음을 확인할 수 있습니다.

Leave a Reply

Your email address will not be published. Required fields are marked *