Android/Daemon

Android에서 사용자 정의 Daemon 등록 및 실행 방법

임베디드 친구 2025. 6. 18. 22:06
728x90
반응형

Android에서 사용자 정의 Daemon 등록 및 실행 방법

Android에서는 일반적인 Linux 시스템과 달리 systemd를 사용하지 않으며, init 시스템을 통해 서비스 및 Daemon을 관리합니다. 따라서 Android에서 NDK를 활용하여 사용자 정의 Daemon을 등록하고 실행하려면 Android의 init 시스템을 이해하고 적절한 설정을 적용해야 합니다.

본 포스팅에서는 Android에서 Daemon을 등록하고 실행하는 방법을 상세히 설명하며, init.rc를 활용한 자동 실행 방법, systemd 없이 Android에서 서비스를 실행하는 방식, property_service 및 SELinux 정책 설정까지 다루겠습니다.

1. Android 시스템에서 Daemon을 등록하는 방법

1.1 Android init 시스템 개요

Android의 init 시스템은 init.rc 스크립트를 기반으로 실행되며, 각 서비스 및 Daemon을 정의하여 자동 실행이 가능합니다. 기본적으로 init 프로세스는 부팅 시 init.rc 및 관련 스크립트를 로드하고, 정의된 서비스들을 실행합니다.

1.2 init.rc에서 Daemon 등록하기

Android에서 Daemon을 등록하기 위해 init.rc 파일에 다음과 같이 서비스 항목을 추가할 수 있습니다.

service mydaemon /system/bin/mydaemon
    user root
    group root
    oneshot
    disabled
    seclabel u:r:su_daemon:s0

주요 옵션 설명

  • service mydaemon /system/bin/mydaemon : /system/bin/ 경로에 있는 mydaemon 실행 파일을 서비스로 등록
  • user root : Daemon을 실행할 사용자 계정 지정
  • group root : Daemon이 속할 그룹 지정
  • oneshot : 프로세스가 종료되면 재시작되지 않음 (기본값은 자동 재시작)
  • disabled : 기본적으로 비활성화된 상태에서 시작 (추후 setprop 명령어를 통해 활성화 가능)
  • seclabel u:r:su_daemon:s0 : SELinux 보안 레이블 설정

2. init.rc를 활용한 Daemon 자동 실행

init.rc에서 Daemon을 자동 실행하도록 설정하려면 on boot 섹션에서 서비스가 시작되도록 정의해야 합니다.

on boot
    start mydaemon

이렇게 설정하면 부팅 시 mydaemon이 자동으로 실행됩니다.

2.1 init.rc 파일 위치 및 수정 방법

Android의 init.rc 파일은 일반적으로 /system/etc/init/ 또는 /vendor/etc/init/에 위치하며, 수정 후에는 시스템을 리부팅해야 적용됩니다.

2.2 setprop 명령어를 이용한 Daemon 실행

앞서 disabled 옵션을 설정한 경우, 실행하려면 다음과 같이 setprop 명령어를 사용해야 합니다.

setprop ctl.start mydaemon

Daemon을 중지하려면 다음과 같이 입력합니다.

setprop ctl.stop mydaemon

3. systemd 없이 Android에서 서비스 실행 방식

Android는 systemd를 사용하지 않으므로, Linux에서 일반적으로 사용되는 systemctl 명령어가 동작하지 않습니다. 대신 다음과 같은 방법으로 서비스 및 Daemon을 실행할 수 있습니다.

3.1 ndk-build를 이용한 실행 파일 제작

Android NDK를 이용하여 실행 파일을 만들고, 이를 시스템의 /system/bin/에 배치하여 실행할 수 있습니다. Android.mk 예제는 다음과 같습니다.

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := mydaemon
LOCAL_SRC_FILES := mydaemon.c
LOCAL_LDLIBS := -llog

include $(BUILD_EXECUTABLE)

3.2 CLI에서 직접 실행하기

NDK로 빌드한 실행 파일을 /system/bin/에 배치한 후 직접 실행할 수도 있습니다.

/system/bin/mydaemon &

4. property_service 및 SELinux 정책 설정

4.1 property_service를 이용한 서비스 제어

Android에서는 property_service를 이용하여 서비스를 관리합니다. setprop 명령어를 사용하여 특정 속성을 변경하면 init에서 해당 서비스의 실행 상태를 조절할 수 있습니다.

실행 예제

setprop mydaemon.enable 1

init.rc에서 속성 감지 및 실행

on property:mydaemon.enable=1
    start mydaemon

on property:mydaemon.enable=0
    stop mydaemon

이렇게 설정하면 setprop mydaemon.enable 1을 실행할 때 Daemon이 시작되며, setprop mydaemon.enable 0을 실행하면 종료됩니다.

4.2 SELinux 정책 설정

Android는 SELinux를 활용하여 보안 정책을 강제합니다. 따라서 SELinux 정책을 설정하지 않으면 Daemon이 실행되지 않을 수 있습니다.

SELinux 정책 파일 예제

SELinux 정책을 적용하려면 mydaemon.te 파일을 작성합니다.

type mydaemon, domain;
init_daemon_domain(mydaemon)

이 정책을 컴파일하여 적용하면 SELinux에서 Daemon 실행이 허용됩니다.

5. 예제 코드: Android NDK 기반 Daemon 구현

다음은 Android NDK를 이용하여 간단한 Daemon을 작성하는 C 코드 예제입니다.

5.1 mydaemon.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <syslog.h>

int main() {
    openlog("mydaemon", LOG_PID, LOG_DAEMON);
    syslog(LOG_NOTICE, "MyDaemon started");

    while (1) {
        syslog(LOG_INFO, "MyDaemon is running...");
        sleep(10);
    }

    syslog(LOG_NOTICE, "MyDaemon terminated");
    closelog();
    return 0;
}

이 코드를 빌드하여 init.rc에 등록하면 Android 시스템에서 실행 가능한 Daemon을 만들 수 있습니다.

6. 결론

이번 포스팅에서는 Android에서 사용자 정의 Daemon을 등록하고 실행하는 방법을 설명했습니다. init.rc를 활용한 자동 실행, systemd 없이 서비스를 실행하는 방식, property_service 및 SELinux 설정 방법까지 다루었습니다. 또한, NDK를 이용하여 간단한 Daemon을 작성하는 예제 코드도 제공하였습니다.

이 내용을 기반으로 다양한 Android 시스템 서비스 및 백그라운드 작업을 수행하는 Daemon을 개발할 수 있을 것입니다.

반응형