Android 사용자 정의 System Service 만들기: 예제 프로젝트 및 유지 방법
개요
Android의 System Service는 운영체제의 핵심 기능을 제공하는 중요한 구성 요소입니다. 개발자는 기본 제공되는 서비스 외에도 특정한 기능을 수행하는 사용자 정의 System Service를 추가하여, 커스텀 기능을 시스템 레벨에서 활용할 수 있습니다. 이번 글에서는 다음 내용을 다룹니다.
- 사용자 정의 System Service를 활용한 예제 프로젝트
- Android 앱과의 연동 사례 (System API 활용)
- OTA 업데이트 시 사용자 정의 System Service 유지 방법
1. 사용자 정의 System Service를 활용한 예제 프로젝트
사용자 정의 System Service를 직접 만들어보고 이를 활용하는 방법을 설명하겠습니다. 예제로 "CustomLoggerService"라는 시스템 서비스를 구현하여, 로그 메시지를 중앙에서 관리하는 기능을 추가하겠습니다.
1.1. System Service 정의하기
먼저, System Service를 구현하려면 frameworks/base/services/core/java/com/android/server/
경로 아래에 새로운 클래스를 생성해야 합니다.
CustomLoggerService.java
생성
package com.android.server;
import android.content.Context;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
public class CustomLoggerService extends ICustomLoggerService.Stub {
private static final String TAG = "CustomLoggerService";
private Context mContext;
public CustomLoggerService(Context context) {
this.mContext = context;
}
@Override
public void logMessage(String message) throws RemoteException {
Log.d(TAG, "Logged: " + message);
}
}
위 코드에서는 ICustomLoggerService.Stub
을 상속하여 사용자 정의 서비스의 핵심 기능을 구현했습니다. logMessage()
메서드를 통해 로그 메시지를 기록할 수 있습니다.
1.2. AIDL 인터페이스 정의하기
Android의 System Service는 클라이언트와 통신하기 위해 AIDL(IPC를 위한 인터페이스)을 활용합니다. ICustomLoggerService.aidl
파일을 생성하여 인터페이스를 정의해야 합니다.
ICustomLoggerService.aidl
package com.android.server;
interface ICustomLoggerService {
void logMessage(String message);
}
1.3. System Server에 등록하기
이제 SystemServer
에서 서비스를 등록해야 합니다. SystemServer.java
를 수정하여 서비스를 추가합니다.
SystemServer.java
수정
private void startOtherServices() {
Slog.i(TAG, "Starting CustomLoggerService");
ServiceManager.addService("custom_logger", new CustomLoggerService(mSystemContext));
}
위 코드를 추가하면 시스템 부팅 시 CustomLoggerService
가 실행됩니다.
2. Android 앱과의 연동 사례 (System API 활용)
사용자 정의 System Service를 Android 앱에서 활용하려면, System API
를 통해 서비스에 접근해야 합니다.
2.1. System Service 접근 코드
클라이언트 앱에서는 IBinder
를 통해 System Service에 접근하고, AIDL을 이용하여 서비스를 호출할 수 있습니다.
import android.os.IBinder;
import android.os.RemoteException;
import com.android.server.ICustomLoggerService;
public class LoggerClient {
private ICustomLoggerService mService;
public LoggerClient() {
IBinder binder = ServiceManager.getService("custom_logger");
mService = ICustomLoggerService.Stub.asInterface(binder);
}
public void log(String message) {
try {
mService.logMessage(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
위 코드에서는 ServiceManager.getService("custom_logger")
를 호출하여 서비스의 바인더를 가져오고, AIDL 인터페이스를 통해 메서드를 호출합니다.
2.2. System API 허용 설정
사용자 정의 System Service를 활용하기 위해서는 system_api
로 설정해야 합니다. service_manager
에 해당 서비스를 등록한 후 AndroidManifest.xml
에서 퍼미션을 허용해야 합니다.
<uses-permission android:name="android.permission.BIND_SYSTEM_SERVICE" />
3. OTA 업데이트 시 사용자 정의 System Service 유지 방법
Android는 OTA 업데이트 시 시스템 파티션을 덮어쓰므로, 커스텀 System Service가 삭제될 가능성이 있습니다. 이를 방지하려면 다음 전략을 활용할 수 있습니다.
3.1. 서비스 코드 유지 방법
- System Service 코드를
frameworks/base/
에 추가하는 경우, OTA 빌드 프로세스에서 해당 코드가 포함되도록 해야 합니다. - AOSP 기반의 커스텀 ROM을 개발하는 경우, OTA 업데이트에도 유지되도록
device/
디렉터리에 관련 패치를 추가할 수 있습니다.
3.2. Vendor Partition 활용
Android 10 이상에서는 vendor
파티션을 활용하여 사용자 정의 System Service를 유지할 수 있습니다. sepolicy
를 설정하여 해당 서비스가 vendor
영역에서 실행되도록 구성할 수 있습니다.
sepolicy
설정 예제
allow custom_logger default_android_service:service_manager { add find };
이 설정을 통해 custom_logger
서비스가 OTA 업데이트 후에도 실행되도록 구성할 수 있습니다.
3.3. OTA 업데이트 후 서비스 자동 재등록
OTA 후에도 서비스가 실행되도록 하기 위해 init.rc
에 해당 서비스를 추가할 수 있습니다.
service custom_logger /system/bin/custom_logger
class main
user system
group system
oneshot
결론
이번 포스팅에서는 사용자 정의 System Service를 직접 만들어보고, Android 앱과 연동하는 방법을 살펴보았습니다. 또한, OTA 업데이트 후에도 유지되는 방법을 설명했습니다. 이 글을 바탕으로 다양한 사용자 정의 System Service를 개발하고 활용할 수 있을 것입니다.
'Android > Custom System Service' 카테고리의 다른 글
Android 사용자 정의 System Service 만들기 - HAL 연동 및 성능 최적화 (0) | 2025.06.11 |
---|---|
Android 사용자 정의 System Service 디버깅 및 문제 해결 (0) | 2025.06.10 |
Android 사용자 정의 System Service 만들기: SELinux 정책 추가 및 접근 제어 (0) | 2025.06.09 |
Android 사용자 정의 System Service 만들기 (0) | 2025.06.08 |
Android 사용자 정의 System Service 만들기 (0) | 2025.06.07 |