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
만약 정상적으로 동작하지 않는다면, 다음을 확인해야 합니다.
SystemServer.java
에서 서비스가 정상적으로 등록되었는지 확인Android.bp
파일이 올바르게 설정되었는지 확인- AOSP 빌드 후 에뮬레이터를 다시 실행하여 적용 여부 확인
결론
이번 포스팅에서는 Android의 사용자 정의 System Service를 추가하는 방법을 설명했습니다. 핵심 내용은 다음과 같습니다.
- AIDL 인터페이스 정의: System Service의 기본 인터페이스를 정의합니다.
- 서비스 구현: Java 클래스를 생성하여 해당 기능을 구현합니다.
- SystemServer에 등록: Android 부팅 시 서비스가 실행되도록 설정합니다.
- 빌드 시스템 구성:
Android.bp
파일을 수정하여 서비스가 정상적으로 빌드되도록 합니다. - AOSP 빌드 및 테스트: 새로운 System Service가 정상적으로 작동하는지 확인합니다.
이제 이를 바탕으로 원하는 기능을 수행하는 맞춤형 System Service를 개발할 수 있습니다.
'Android > Custom System Service' 카테고리의 다른 글
Android 사용자 정의 System Service 디버깅 및 문제 해결 (0) | 2025.06.10 |
---|---|
Android 사용자 정의 System Service 만들기: SELinux 정책 추가 및 접근 제어 (0) | 2025.06.09 |
Android 사용자 정의 System Service 만들기 (0) | 2025.06.07 |
Android 사용자 정의 System Service 만들기 (0) | 2025.06.06 |
Android 사용자 정의 System Service 만들기 (0) | 2025.06.05 |