Android/Custom System Service

Android 사용자 정의 System Service 만들기

임베디드 친구 2025. 6. 6. 23:20
728x90
반응형

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.javastartOtherServices() 메서드에 서비스를 추가합니다.

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를 만드는 방법을 설명했습니다. 주요 과정은 다음과 같습니다.

  1. SystemService 클래스를 확장하여 새로운 System Service 구현
  2. AIDL 파일을 이용하여 클라이언트와 통신 인터페이스 정의
  3. SystemServer에서 서비스 초기화 및 등록
  4. 클라이언트에서 ServiceManager.getService()를 이용하여 서비스 접근

이 방법을 이용하면 Android 플랫폼에서 원하는 기능을 추가할 수 있으며, 시스템 수준에서 서비스를 관리할 수 있습니다.

728x90
반응형