Android/Custom System Service

Android 사용자 정의 System Service 만들기

임베디드 친구 2025. 6. 8. 12:36
728x90
반응형

Android 사용자 정의 System Service 만들기

frameworks/base/에 서비스 추가하는 방법

Android에서 사용자 정의 System Service를 추가하려면 frameworks/base/ 디렉터리에서 작업을 수행해야 합니다. System Service는 Android의 기본 서비스와 유사한 방식으로 동작하며, 이를 위해 AIDL 인터페이스를 정의하고, Java 및 네이티브 코드에서 서비스의 동작을 구현해야 합니다.

1. AIDL 인터페이스 생성

먼저, AIDL 파일을 생성하여 서비스의 인터페이스를 정의해야 합니다. frameworks/base/core/java/android/os/ 경로 아래에 새로운 AIDL 파일을 추가합니다.

예제:

// ICustomService.aidl
package android.os;

interface ICustomService {
    void customMethod();
}

이 파일은 System Service와 클라이언트 간의 IPC(Inter-Process Communication)를 위한 인터페이스를 정의합니다.

2. System Service 구현

이제 해당 인터페이스를 구현하는 System Service를 frameworks/base/services/core/java/com/android/server/에 추가해야 합니다. 예를 들어, CustomService.java 파일을 추가할 수 있습니다.

package com.android.server;

import android.content.Context;
import android.os.ICustomService;
import android.os.RemoteException;
import android.util.Slog;

public class CustomService extends ICustomService.Stub {
    private static final String TAG = "CustomService";
    private final Context mContext;

    public CustomService(Context context) {
        mContext = context;
    }

    @Override
    public void customMethod() throws RemoteException {
        Slog.i(TAG, "Custom Method Called");
    }
}

3. SystemServer에서 서비스 등록

이제 SystemServer.java에 새로운 서비스가 실행되도록 코드를 추가해야 합니다. 해당 파일은 frameworks/base/services/java/com/android/server/SystemServer.java에 위치합니다.

import com.android.server.CustomService;

그리고 startOtherServices() 메서드에 다음과 같이 서비스를 추가합니다.

try {
    Slog.i("SystemServer", "Starting Custom Service");
    ServiceManager.addService("custom_service", new CustomService(mSystemContext));
} catch (Exception e) {
    Slog.e("SystemServer", "Failure starting Custom Service", e);
}

이제 Android OS가 부팅될 때 CustomService가 자동으로 실행됩니다.


Android.bp를 활용한 빌드 시스템 구성

Android는 AOSP(Android Open Source Project) 빌드 시스템을 통해 서비스 및 애플리케이션을 컴파일합니다. 이를 위해 Android.bp 파일을 생성해야 합니다.

1. AIDL 빌드 구성

AIDL 인터페이스를 포함하는 Android.bp 파일을 생성합니다.

frameworks/base/core/java/android/os/Android.bp:

aidl_interface {
    name: "custom_aidl",
    srcs: ["ICustomService.aidl"],
    imports: ["frameworks/base/core/java/android/os"],
}

2. 서비스 빌드 구성

frameworks/base/services/core/Android.bp 파일에 다음 내용을 추가합니다.

java_library {
    name: "custom_service",
    srcs: ["com/android/server/CustomService.java"],
    static_libs: ["framework"],
    aidl: true,
    visibility: ["//visibility:public"],
}

이제 빌드 과정에서 해당 서비스를 포함하여 컴파일할 수 있습니다.


System Service 추가 후 AOSP 빌드 및 부팅 테스트

System Service를 추가한 후 AOSP를 빌드하고, 에뮬레이터 또는 실제 기기에서 테스트해야 합니다.

1. AOSP 빌드 실행

서비스를 추가한 후 AOSP를 빌드해야 합니다. 전체 빌드를 실행하려면 다음 명령어를 사용합니다.

source build/envsetup.sh
lunch aosp_arm-eng
make -j$(nproc)

변경된 코드만 빌드하려면 services 모듈만 빌드할 수도 있습니다.

m services

2. 에뮬레이터 실행 및 서비스 확인

AOSP 빌드가 완료되면, 에뮬레이터를 실행합니다.

emulator -avd <AVD_NAME> -writable-system

이제 서비스가 정상적으로 동작하는지 확인하기 위해 ADB 명령어를 사용합니다.

adb shell service list | grep custom_service

서비스가 정상적으로 등록되었다면, 아래와 같은 출력이 나타나야 합니다.

43 custom_service: [com.android.server.CustomService]

3. 서비스 호출 테스트

서비스가 정상적으로 동작하는지 확인하기 위해 ADB에서 직접 호출해볼 수 있습니다.

adb shell service call custom_service 1

이제 로그를 확인하면 서비스가 정상적으로 호출되었는지 확인할 수 있습니다.

adb logcat -s CustomService

만약 정상적으로 동작하지 않는다면, 다음을 확인해야 합니다.

  1. SystemServer.java에서 서비스가 정상적으로 등록되었는지 확인
  2. Android.bp 파일이 올바르게 설정되었는지 확인
  3. AOSP 빌드 후 에뮬레이터를 다시 실행하여 적용 여부 확인

결론

이번 포스팅에서는 Android의 사용자 정의 System Service를 추가하는 방법을 설명했습니다. 핵심 내용은 다음과 같습니다.

  1. AIDL 인터페이스 정의: System Service의 기본 인터페이스를 정의합니다.
  2. 서비스 구현: Java 클래스를 생성하여 해당 기능을 구현합니다.
  3. SystemServer에 등록: Android 부팅 시 서비스가 실행되도록 설정합니다.
  4. 빌드 시스템 구성: Android.bp 파일을 수정하여 서비스가 정상적으로 빌드되도록 합니다.
  5. AOSP 빌드 및 테스트: 새로운 System Service가 정상적으로 작동하는지 확인합니다.

이제 이를 바탕으로 원하는 기능을 수행하는 맞춤형 System Service를 개발할 수 있습니다.

728x90
반응형