Android/Custom Framework

Android 사용자 정의 Framework Service 만들기

임베디드 친구 2025. 5. 22. 20:53
728x90
반응형

Android 사용자 정의 Framework Service 만들기

1. Framework Service 개념과 구조

Android는 다양한 서비스가 유기적으로 동작하는 운영체제이며, 이 중 핵심적인 역할을 수행하는 것이 System ServiceFramework Service입니다. Android에서 특정 기능을 시스템 전반에서 사용할 수 있도록 하려면 Framework Service를 구현하여 해당 기능을 애플리케이션과 연동해야 합니다.

이번 글에서는 Framework Service의 개념과 구조, System Service와의 차이점, 동작 방식 및 구성 요소, 그리고 Binder IPC를 통한 서비스 통신 개념을 설명하고, 필요한 경우 예제 코드를 함께 제공하겠습니다.


2. Framework Service란?

Framework Service는 Android 시스템의 핵심 기능을 제공하는 서비스로, framework 계층에서 동작하며 애플리케이션이 시스템 기능을 활용할 수 있도록 지원합니다. 대표적인 예로 다음과 같은 서비스들이 있습니다.

  • ActivityManagerService : 앱의 생명 주기를 관리
  • WindowManagerService : 윈도우 및 화면 렌더링을 관리
  • PackageManagerService : 앱 설치 및 제거 관리
  • PowerManagerService : 전원 관리 기능 제공

사용자 정의 Framework Service를 개발하면 특정 기능을 시스템 전반에 걸쳐 사용할 수 있도록 제공할 수 있습니다. 예를 들어, 맞춤형 보안 서비스나 데이터 동기화 서비스 등을 구현할 수 있습니다.


3. System Service와 Framework Service의 차이

System Service와 Framework Service는 Android 시스템에서 비슷한 역할을 하지만, 몇 가지 중요한 차이점이 있습니다.

구분 System Service Framework Service
실행 위치 system_server 프로세스 내에서 실행 framework 계층에서 실행
주 목적 하드웨어 제어 및 커널 관련 기능 제공 애플리케이션과 상호 작용하는 API 제공
예제 PowerManagerService, PackageManagerService ActivityManager, WindowManager
서비스 등록 방식 SystemServiceRegistry를 통해 등록 ServiceManager.addService()를 통해 등록

System Service는 system_server 프로세스에서 동작하는 반면, Framework Service는 framework 계층에서 실행되며 애플리케이션이 직접 접근할 수 있도록 API를 제공합니다.


4. Framework Service의 동작 방식 및 구성 요소

Framework Service는 다음과 같은 주요 요소로 구성됩니다.

4.1 Service Interface (AIDL)

Framework Service는 클라이언트와 서버 간의 통신을 위해 AIDL (Android Interface Definition Language)을 사용합니다. AIDL을 이용하여 서비스의 인터페이스를 정의하면, 애플리케이션과 Framework Service 간의 통신이 가능해집니다.

예제: IMyFrameworkService.aidl

package com.example.framework;

interface IMyFrameworkService {
    void setValue(int value);
    int getValue();
}

이렇게 AIDL 파일을 정의하면, 자동으로 클라이언트와 서버를 위한 Binder 인터페이스가 생성됩니다.

4.2 Service Implementation

Framework Service의 실제 구현은 AIDL 인터페이스를 상속받아 작성됩니다.

예제: MyFrameworkService.java

package com.example.framework;

import android.os.IBinder;
import android.os.RemoteException;
import com.example.framework.IMyFrameworkService;

public class MyFrameworkService extends IMyFrameworkService.Stub {
    private int value = 0;

    @Override
    public void setValue(int value) throws RemoteException {
        this.value = value;
    }

    @Override
    public int getValue() throws RemoteException {
        return value;
    }
}

4.3 Service Registration

Framework Service는 ServiceManager.addService()를 통해 등록됩니다. 이렇게 등록된 서비스는 클라이언트가 ServiceManager.getService()를 통해 접근할 수 있습니다.

예제: Service 등록

import android.os.ServiceManager;

public class MyFrameworkServiceManager {
    public static void registerService() {
        MyFrameworkService service = new MyFrameworkService();
        ServiceManager.addService("my_framework_service", service);
    }
}

이제 ServiceManager를 통해 "my_framework_service"라는 이름으로 서비스가 등록되었으며, 클라이언트는 이를 검색하여 사용할 수 있습니다.


5. Binder IPC를 통한 서비스 통신 개념

Framework Service는 Binder IPC (Inter-Process Communication)를 활용하여 클라이언트와 데이터를 주고받습니다. Binder는 Android에서 가장 핵심적인 IPC 메커니즘으로, 클라이언트와 서버가 서로 다른 프로세스에서 동작하더라도 효율적으로 데이터를 전달할 수 있도록 도와줍니다.

5.1 클라이언트 측 코드

클라이언트는 ServiceManager.getService()를 통해 Framework Service에 접근합니다.

import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
import com.example.framework.IMyFrameworkService;

public class FrameworkServiceClient {
    private static IMyFrameworkService service;

    public static void init() {
        IBinder binder = ServiceManager.getService("my_framework_service");
        service = IMyFrameworkService.Stub.asInterface(binder);
    }

    public static void useService() throws RemoteException {
        service.setValue(100);
        int result = service.getValue();
        System.out.println("Framework Service 값: " + result);
    }
}

5.2 서비스 호출 과정

  1. 클라이언트가 ServiceManager.getService("my_framework_service")를 호출하여 서비스의 IBinder 객체를 가져옵니다.
  2. IBinderIMyFrameworkService.Stub.asInterface()로 변환하여 서비스와 통신할 수 있는 인터페이스를 획득합니다.
  3. 클라이언트는 setValue(100)과 같은 메서드를 호출하여 서비스를 사용합니다.
  4. 서비스는 Binder를 통해 요청을 처리하고 결과를 반환합니다.

6. 마무리

이번 글에서는 Framework Service의 개념과 구조, System Service와의 차이, Binder IPC를 이용한 서비스 통신 방식 등을 설명하였습니다. 또한, AIDL 인터페이스 정의부터 서비스 등록 및 클라이언트 호출 예제 코드까지 포함하여 실질적인 구현 방법을 제시하였습니다.

Framework Service는 Android 시스템에서 중요한 역할을 수행하며, 사용자 정의 서비스를 통해 애플리케이션이 시스템과 더욱 긴밀하게 연동될 수 있도록 지원합니다.

반응형