Android 사용자 정의 System Service 만들기
Android에서 사용자 정의 System Service를 생성하고 등록하는 방법에 대해 설명합니다. Android 플랫폼에서는 Java 기반의 System Service를 추가하여 다양한 기능을 확장할 수 있습니다. 본 글에서는 System Service를 구현하는 기본적인 과정과 클라이언트에서 접근하는 방법을 단계별로 설명합니다.
1. Java 기반 System Service 생성 및 등록 방법
Android의 System Service는 SystemServer
에서 초기화되며, 서비스는 ServiceManager
에 등록됩니다. 새로운 System Service를 만들려면 다음 단계를 따릅니다.
1.1 서비스 클래스 구현
System Service는 SystemService
클래스를 상속받아 구현합니다.
package com.example.systemservice;
import android.content.Context;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.Log;
public class MySystemService extends SystemService {
private static final String TAG = "MySystemService";
private final IBinder mBinder = new IMySystemService.Stub() {
@Override
public String getMessage() throws RemoteException {
return "Hello from MySystemService";
}
};
public MySystemService(Context context) {
super(context);
}
@Override
public void onStart() {
Log.i(TAG, "MySystemService starting...");
publishBinderService("my_system_service", mBinder);
}
}
1.2 AIDL 인터페이스 정의
클라이언트와의 통신을 위해 AIDL 인터페이스를 정의해야 합니다.
// IMySystemService.aidl
package com.example.systemservice;
interface IMySystemService {
String getMessage();
}
이 AIDL 파일을 생성하면 Android 빌드 시스템이 자동으로 Stub
클래스를 생성합니다.
2. SystemServer에서 서비스 등록하기
System Service는 SystemServer
에서 초기화됩니다. 이를 위해 먼저 SystemServer.java
를 수정해야 합니다.
2.1 SystemServer.java 수정
SystemServer.java
의 startOtherServices()
메서드에 서비스를 추가합니다.
private void startOtherServices() {
// 기존 코드...
try {
Slog.i(TAG, "Initializing MySystemService");
ServiceManager.addService("my_system_service", new MySystemService(mContext));
} catch (Throwable e) {
Slog.e(TAG, "Failure starting MySystemService", e);
}
// 기존 코드...
}
3. ServiceManager.addService()를 이용한 서비스 등록
ServiceManager.addService()
메서드를 이용해 서비스 등록을 수행합니다. 이 과정은 SystemService
내부에서 publishBinderService()
메서드로 대체할 수도 있습니다.
ServiceManager.addService("my_system_service", mBinder);
이 코드를 통해 System Server에서 my_system_service
라는 이름으로 서비스를 등록할 수 있습니다.
4. 클라이언트에서 서비스에 접근하는 방법
클라이언트에서 서비스에 접근하려면 ServiceManager.getService()
를 이용하여 바인더를 가져오고, IMySystemService.Stub.asInterface()
를 통해 AIDL 인터페이스를 획득해야 합니다.
4.1 클라이언트 코드 예제
package com.example.client;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
import com.example.systemservice.IMySystemService;
public class MySystemServiceClient {
public static void main(String[] args) {
IBinder binder = ServiceManager.getService("my_system_service");
if (binder == null) {
System.out.println("Failed to get MySystemService");
return;
}
IMySystemService service = IMySystemService.Stub.asInterface(binder);
try {
String message = service.getMessage();
System.out.println("Received message: " + message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
이제 클라이언트는 ServiceManager.getService("my_system_service")
를 통해 서비스에 접근할 수 있습니다.
결론
이번 글에서는 Android에서 사용자 정의 System Service를 만드는 방법을 설명했습니다. 주요 과정은 다음과 같습니다.
SystemService
클래스를 확장하여 새로운 System Service 구현- AIDL 파일을 이용하여 클라이언트와 통신 인터페이스 정의
SystemServer
에서 서비스 초기화 및 등록- 클라이언트에서
ServiceManager.getService()
를 이용하여 서비스 접근
이 방법을 이용하면 Android 플랫폼에서 원하는 기능을 추가할 수 있으며, 시스템 수준에서 서비스를 관리할 수 있습니다.
'Android > Custom System Service' 카테고리의 다른 글
Android 사용자 정의 System Service 만들기 (0) | 2025.06.08 |
---|---|
Android 사용자 정의 System Service 만들기 (0) | 2025.06.07 |
Android 사용자 정의 System Service 만들기 (0) | 2025.06.05 |
Android 사용자 정의 System Service 만들기 (0) | 2025.06.04 |
Android 사용자 정의 System Service 만들기 (0) | 2025.06.03 |