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 등이 된다.

+ Recent posts