Android의 주요 IPC 기법
안드로이드는 다양한 프로세스 간 통신(IPC, Inter-Process Communication) 방식을 제공합니다. IPC는 서로 다른 프로세스에서 실행되는 구성 요소 간 데이터를 주고받거나 서비스를 호출할 수 있도록 해줍니다. 안드로이드의 주요 IPC 기법으로는 Broadcast, Service, Content Provider, AIDL 등이 있습니다. 이 글에서는 각각의 개념을 설명하고 AIDL을 활용한 IPC 방법을 AOSP 코드와 함께 살펴보겠습니다.
1. 안드로이드의 주요 IPC 기법
안드로이드에서 사용되는 주요 IPC 기법은 다음과 같습니다.
1.1 Broadcast
Broadcast는 하나의 애플리케이션이 여러 애플리케이션 또는 시스템에 이벤트를 전달할 때 사용됩니다. 예를 들어, 네트워크 상태 변경, 배터리 부족, 앱 설치 완료 등의 시스템 이벤트를 여러 애플리케이션이 수신할 수 있습니다.
BroadcastReceiver 등록 방법
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("MyReceiver", "Broadcast received: " + intent.getAction());
}
}
동적 등록
IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_LOW);
MyReceiver receiver = new MyReceiver();
registerReceiver(receiver, filter);
정적 등록 (AndroidManifest.xml)
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
1.2 Service
Service는 백그라운드에서 실행되며, UI 없이 특정 작업을 수행하는 데 사용됩니다. 특히 Bound Service는 IPC 용도로 활용됩니다.
Service 구현 예시
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
public class MyBinder extends Binder {
MyService getService() {
return MyService.this;
}
}
}
1.3 Content Provider
Content Provider는 애플리케이션 간 데이터를 공유하기 위한 구조화된 방법을 제공합니다. SQLite 데이터베이스, 파일 또는 네트워크 자원을 다른 애플리케이션과 공유하는 데 사용됩니다.
Content Provider 구현 예시
public class MyContentProvider extends ContentProvider {
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
return database.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
}
}
Content Provider 호출 예시
Cursor cursor = getContentResolver().query(MyContentProvider.CONTENT_URI, null, null, null, null);
2. AIDL을 활용한 IPC
AIDL(Android Interface Definition Language)은 안드로이드에서 프로세스 간 메서드 호출을 가능하게 하는 인터페이스를 정의하는 언어입니다. AIDL을 사용하면 클라이언트 애플리케이션이 서비스 애플리케이션과 통신할 수 있습니다.
2.1 AIDL 파일 생성
AIDL 인터페이스는 *.aidl
확장자를 가지며, 서버와 클라이언트가 동일한 인터페이스를 공유해야 합니다.
IRemoteService.aidl
interface IRemoteService {
int add(int a, int b);
}
2.2 Service 구현
AIDL 인터페이스를 구현하는 Service를 작성해야 합니다.
RemoteService.java
public class RemoteService extends Service {
private final IRemoteService.Stub binder = new IRemoteService.Stub() {
@Override
public int add(int a, int b) {
return a + b;
}
};
@Override
public IBinder onBind(Intent intent) {
return binder;
}
}
2.3 클라이언트에서 서비스 바인딩
클라이언트는 ServiceConnection
을 통해 서비스와 연결해야 합니다.
클라이언트 코드
private IRemoteService remoteService;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
remoteService = IRemoteService.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
remoteService = null;
}
};
Intent intent = new Intent("com.example.REMOTE_SERVICE");
bindService(intent, connection, Context.BIND_AUTO_CREATE);
2.4 AOSP 코드에서 AIDL 확인하기
AOSP에서는 여러 시스템 서비스가 AIDL을 활용하여 IPC를 수행합니다. 예를 들어, ActivityManagerService는 IActivityManager.aidl
을 통해 IPC를 처리합니다.
IActivityManager.aidl
interface IActivityManager {
void startActivity(in Intent intent, in Bundle options);
}
ActivityManagerService.java
public class ActivityManagerService extends IActivityManager.Stub {
@Override
public void startActivity(Intent intent, Bundle options) {
// Activity 시작 로직
}
}
3. 결론
안드로이드는 다양한 IPC 메커니즘을 제공하여 프로세스 간의 데이터 공유와 서비스 호출을 가능하게 합니다. Broadcast, Service, Content Provider를 활용하여 간단한 IPC를 수행할 수 있으며, AIDL을 사용하면 복잡한 메서드 호출 기반 IPC가 가능합니다.
특히 AOSP에서는 AIDL을 기반으로 한 IPC가 광범위하게 사용되므로, 이를 이해하면 안드로이드 시스템 내부 동작을 보다 깊이 있게 분석할 수 있습니다. 개발자는 필요에 따라 적절한 IPC 기법을 선택하여 애플리케이션의 효율성과 보안성을 높이는 것이 중요합니다.
'Android > Framework' 카테고리의 다른 글
AOSP 빌드 및 환경 설정 (0) | 2025.04.17 |
---|---|
System API 접근 및 확장 (0) | 2025.04.16 |
Application과 Framework의 관계 (0) | 2025.04.14 |
Android Framework에서 새로운 시스템 서비스 추가 및 활용 (0) | 2025.04.13 |
Binder IPC 개념 및 동작 방식 (0) | 2025.04.12 |