AIDL은 Android Process간 대화를 진행하기위해 사용하는 Interface 언어이다. AIDL이 아닌 메시지를 통해 프로세스간 대화를 주고받는 방법도 있지만 이 역시 AIDL을 내재화하여 진행하는 방법이다.
기본적으로 AIDL interface를 Android Studio에서 New를 통해서 만들게 되면 이에 따른 java code가 자동으로 생성되고 이를 원하는 동작을 하도록 구현해줌으로써 프로세스간의 대화하는 동작을 구현할 수 있다. 마찬가지로 서버측에서도 똑같이 aidl 을 복사해온 뒤 생성되는 java code에 구현한다.
예를들어 기본적으로 하나의 apk내 Activity에서 Service와 통신을 한다면 Activity에서 Service를 호출하는 부분과 Service로부터 Activity로 이벤트를 받는 방식의 2가지 통신 기능이 필요한데 이 때 각각 AIDL로 만들어 2개의 AIDL로 Activity와 Service간의 통신을 진행할 수 있다.
1. Service 와의 대화
위와같이 안드로이드에서는 Kernel Memory 영역만 프로세스간에 공유가 가능하기 때문에 위와 같은 방법을 이용하나 커널 메모리를 통해 직렬화하여 메모리를 공유하되 직렬화하여 받은 메모리를 재조립하기 위해서 RPC 영역에서 해당 메모리 재조립을 진행하기 위한 방법이 공유되고 해당 내용을 바탕으로 재조립되어 Process B에서 호출이 진행된다.
커널영역은 IPC 영역으로 Binder를 통해서 데이터를 공유할 수 있고 RPC영역은 aidl언어로 작성하여 Process간에 데이터 재조합과 직렬화 즉 프로세스간에 대화하는 방법을 정의한다.
정리하면 IPC는 바인더를 통해 직렬화하여 데이터를 주고받는 공간이고 RPC는 aidl언어를 통해 직렬화로 데이터를 만드는 rule과 직렬화로 받은 데이터를 다시 재조립하는 rule을 작성하고 공유하는 것이다.
여기서 AIDL이 역할이 IPC를 통해 데이터를 송수신하는 방법을 정의함은 물론 Proxy와 Stub의 동작들을 구현해주는 역할을 진행한다. 즉 AIDL을 작성해줌으로써 Proxy와 Stub동작이 모두 자동으로 구현된다. 또한 위 그림에서 보듯 aidl부분은 동일한 부분을 참조하기 때문에 aidl파일은 두 프로세스 파일에 똑같이 작성해야 한다(보통 복붙을 통해서 진행한다)
그리고 BInder 및 Service 호출과정을 코드로 저장하면 위와 같다. 각 Client와 Service쪽 코드를 보면 위와 같이 Client의 Activity에서 service 시작을 명시하면 자동으로 Service의 onBind가 호출되어 인스턴스를 생성 하고 마찬가지로 unbindService 호출 시에도 이에 따른 함수들이 자동으로 호출된다.
즉 개발자 입장에서는 AIDL을 통해 Service와 대화할 인터페이스를 작성한 뒤 bindService, unbindService 함수만 호출해줌으로써 일련의 함수들이 자동으로 호출되고 동작되는 것이다.
-> 위 내용이 안드로이드 프로스세간에 통신을 위한 방법이다. 기본적으로 안드로이드에서는 맨 처음 언급한 바와같이 process 즉 apk간에 보안성 유지를 위해 커널 메모리만 공유가 가능하고 이러한 안드로이드 특징상 위와같은 binder, service등을 통해서 프로세스간의 통신이 이루어진다. 그리고 이러한 통신을 지원하기 위한 안드로이드의 배려(?)가 바로 AIDL 이다.
2. 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
}
AIDL은 위와 같이 인터페이스 형식으로 간단하게 작성한다. 위 안드로이드 개발자 Develop 기본 포맷 예시이고 다른 Service와의 대화를 위한 예시를보면
package com.example.remoteservice;
import com.example.remoteservice.IRemoteServiceCallback;
interface IRemoteService {
boolean addCallback(IRemoteServiceCallback callback);
boolean removeCallback(IRemoteServiceCallback callbac);
}
와 같다. 위와 같이 보통 Service와의 통신을 위해서는 Service측으로 전달해주는 IRemoteService와 Service로부터 이벤트 리포팅 방식으로 응답을 받기위한IRemoteServiceCallback 총 2개를 기본적으로 AIDL을 통해 인터페이스 선언을 진행해준다.
위와 같이 .aidl파일을 만들게되면 build.gradle을 통해 자동으로 이에 따른 java파일 생성이 가능하고 해당 java파일이 생성됩니다.
이후에는 Stub, Proxy와 연결을 통해서 데이터를 매끄럽게 주고 받을 수 있도록 해주면 된다.
AIDL은 Java와의 연결뿐만아니라 백엔드 즉 Native, C++과도 연결이 가능하다. 이러한 AIDL이 바로 HIDL을 대체하는 AIDL 등이 된다.
'Android > 안드로이드 운영체제' 카테고리의 다른 글
[Android] 안드로이드(11) - KeyStore (0) | 2021.01.02 |
---|---|
[Android] 안드로이드(10) - 파티션 (2) | 2020.12.13 |
[Android] 안드로이드(8) - Application의 권한 (0) | 2020.11.21 |
[Android] 안드로이드(7) - TEE (0) | 2020.11.21 |
[Android] 안드로이드(6) - Biometric (0) | 2020.11.01 |