Android System & AOSP Engineering/Android Automotive

AOSP 환경에서 Custom Android System Service 구현 및 AIDL Binder IPC 추가 가이드

임베디드 친구 2026. 8. 3. 20:52
반응형

1. 커스텀 제어 장치 연동을 위한 AOSP Custom System Service 아키텍처 개요

안드로이드 임베디드 및 차량용(Automotive) 시스템 개발 시, 표준 Android SDK가 지원하지 않는 제어 장치(Custom Peripheral Hardware)를 제어해야 하는 경우가 있습니다. 애플리케이션 프레임워크 레벨에서 하드웨어 노드 접근 권한을 안전하게 분리하고 프로세스 간 통신(IPC)을 제어하기 위해서는 AOSP(Android Open Source Project) 소스 트리에 Custom System Service를 직접 추가해야 합니다. 본 포스팅에서는 AIDL(Android Interface Definition Language) 작성부터 SystemServer 등록, framework.jar 및 Custom SDK 빌드까지의 전체 과정을 단계별로 분석합니다.

2. AOSP Custom System Service 및 AIDL 핵심 요약 (Technical Summary)

  • AIDL 인터페이스 정의 (AIDL Interface Definition): frameworks/base/core/java/android/os/ICustomHardwareService.aidl 경로에 커스텀 IPC 인터페이스를 정의하고, frameworks/base/Android.bp 빌드 타겟의 소스 목록에 등록합니다.
  • 시스템 서비스 구현 및 등록 (SystemService Implementation & Registration): Binder IPC 프레임워크를 기반으로 SystemServer.java 내부에서 ServiceManager.addService() 메서드를 호출하여 커스텀 서비스를 시스템 프로세스에 등록합니다.
  • SDK 및 API 스텁 빌드 (SDK & API Stubs Build): make framework 명령어와 m api-stubs-docs-update-current-api 명령어를 실행하여 최신 API 시그니처를 업데이트하고 커스텀 API를 SDK 빌드에 포함시킵니다.

3. AIDL 기반 AOSP Custom System Service 설계 및 구현 분석

3.1 AIDL 인터페이스 정의 및 Android.bp 빌드 타겟 추가

프레임워크 IPC 바인딩을 생성하기 위해 AIDL 인터페이스 파일(.aidl)을 선언해야 합니다.
frameworks/base/core/java/android/os/ICustomHardwareService.aidl 파일 생성:

package android.os;

/**
 * AIDL interface for custom hardware control service.
 */
interface ICustomHardwareService {
    int getHardwareStatus();
    boolean setControlSignal(int signalCode);
}

AOSP Soong 빌드 시스템이 상기 AIDL을 컴파일하도록 frameworks/base/Android.bp 파일 내의 srcs 리스트에 AIDL 경로를 등록합니다.

// frameworks/base/Android.bp
filegroup {
    name: "framework-core-sources",
    srcs: [
        // ... existing sources
        "core/java/android/os/ICustomHardwareService.aidl",
    ],
}

3.2 Java System Service 구현 및 ServiceManager 등록

AIDL 스텁(Stub) 클래스를 상속받아 실제 비즈니스 로직을 처리하는 Custom Service 클래스를 작성합니다.
frameworks/base/services/core/java/com/android/server/CustomHardwareService.java:

package com.android.server;

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

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

    public CustomHardwareService(Context context) {
        mContext = context;
        Slog.i(TAG, "CustomHardwareService initialized.");
    }

    @Override
    public int getHardwareStatus() throws RemoteException {
        // Implementation: Read hardware node or call Native HAL
        return 1;
    }

    @Override
    public boolean setControlSignal(int signalCode) throws RemoteException {
        // Implementation: Control hardware peripheral
        Slog.d(TAG, "Control signal updated: " + signalCode);
        return true;
    }
}

부팅 과정에서 서비스가 백그라운드로 구동되도록 SystemServer.java에 등록합니다.
frameworks/base/services/java/com/android/server/SystemServer.java:

import com.android.server.CustomHardwareService;

private void startOtherServices() {
    // ...
    try {
        Slog.i(TAG, "Adding CustomHardwareService");
        ServiceManager.addService("custom_hardware", new CustomHardwareService(context));
    } catch (Throwable e) {
        Slog.e(TAG, "Failure starting CustomHardwareService", e);
    }
    // ...
}

3.3 AOSP 레벨별 아키텍처 역할 비교

구성 요소 (Component) 위치 (Location) 역할 및 주요 기능 (Role & Key Function)
AIDL Interface frameworks/base/core/java/android/os/ IPC 통신 규칙 및 클라이언트-서버 간 데이터 규격 정의
System Service Class frameworks/base/services/core/java/ ICustomHardwareService.Stub을 상속받아 하드웨어 제어 로직 구현
SystemServer frameworks/base/services/java/ 안드로이드 프레임워크 부팅 시 ServiceManager에 서비스 인스턴스 등록
Manager API frameworks/base/core/java/android/app/ 애플리케이션 개발자가 Context.getSystemService()로 접근 가능한 래퍼 클래스

4. AOSP 빌드 및 디버깅 팁 (Android System Debugging Tools)

4.1 ServiceManager 등록 상태 검증 (dumpsys 및 cmd)

빌드 후 대상 디바이스에 이미지를 올려 실행한 뒤, 셸(adb shell) 환경에서 서비스가 상주 중인지 확인합니다.

# Check if the service is registered in ServiceManager
adb shell service list | grep custom_hardware

# Dump status using dumpsys command
adb shell dumpsys custom_hardware

4.2 SELinux Policy (sepolicy) 컨텍스트 정의

안드로이드 8.0 이상에서는 SELinux Enforcing 모드로 인해 service_contexts에 레코드가 없으면 접근이 차단됩니다.
device///sepolicy/vendor/service_contexts 또는 system/sepolicy/private/service_contexts에 다음 항목을 반드시 추가하세요.

custom_hardware                           u:object_r:custom_hardware_service:s0

5. AOSP Custom Service 구현 시 흔히 하는 실수 및 예외 상황

5.1 make update-api 누락으로 인한 API 빌드 에러

frameworks/base 내부에 공개 API 메서드를 추가하거나 수정할 경우 API 체커가 빌드를 중단시킵니다.

  • 발생 오류 메시지: Error: Program type already present 또는 You have tried to change the API from what has been previously approved.
  • 해결책: 다음 소스 빌드 명령을 수행하여 current.txt 스텁 파일을 갱신해야 합니다.
# Update API check signature file
m api-stubs-docs-update-current-api

5.2 Binder Transaction 덤프 타임아웃 및 OOM 예외

SystemServer 프로세스 내부에서 무거운 I/O 작업을 블로킹 방식으로 처리할 경우 Watchdog에 의해 SystemServer가 강제 종료될 수 있습니다.

  • 원인: Service 메서드 내부에서 블로킹 파일 I/O나 JNI 호출 지연 발생.
  • 해결책: 작업 처리를 HandlerThread 또는 CompletableFuture 기반 비동기 스레드로 넘겨 Binder 스레드 풀 타임아웃을 방지해야 합니다.

6. 결론

AOSP 소스 트리에서 커스텀 시스템 서비스를 구현하려면 AIDL 선언, Android.bp 타겟 추가, SystemServer 상의 ServiceManager.addService() 구성을 거쳐야 합니다. 하드웨어 보안 제약 조건을 만족하기 위해 SELinux service_contexts 갱신과 api-stubs-docs-update-current-api 명령을 통한 API 동기화를 적용하여 안정적인 안드로이드 임베디드 플랫폼을 구축할 수 있습니다.

반응형