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을 개발할 수 있을 것입니다.
'Android > Daemon' 카테고리의 다른 글
Android Daemon의 IPC (Inter-Process Communication) (0) | 2025.06.21 |
---|---|
Android Daemon과 Java/Kotlin 인터페이스 연결 (0) | 2025.06.19 |
Android Daemon을 위한 Android.mk 및 CMakeLists.txt 구성 (0) | 2025.06.17 |
Android Daemon을 위한 기본 C/C++ 코드 작성 (0) | 2025.06.16 |
Android에서 Daemon이란? (0) | 2025.06.15 |