댓글 쓰기 권한이 없습니다. 로그인 하시겠습니까?
Android
2014.02.17 17:10
안드로이드 init.rc 문법
조회 수 29798 댓글 0
안드로이드 Init 문법 (./android/system/core/init/readme.txt 번역) ------------------------------------------------------- 안드로이드의 Init 문법은 Action, Command, Service, Option으로 구성되어 있다. 모든 문법의 해석은 줄 단위로 이루어지며, 빈칸으로 구분된 토큰으로 이루어져있다. C언어 문법과 마찬가지로 빈칸 앞에 백슬래쉬(\)를 추가하여 빈칸을 포함한 토큰을 만들 수 있다. 쌍따옴표를 사용하여도 마찬가지로 여러개의 토큰으로 나뉘는 것을 막을 수 있다. 줄의 마지막에 백슬래쉬를 추가하여 명령을 여러 줄로 나눌 수 있다. 샾(#)으로 시작하는 줄은 주석(샾 앞의 빈칸도 허용된다)으로 처리된다. Action과 Service는 새로운 Section이 시작됨을 명시한다. 모든 command와 option은 가장 마지막에 명시한 Section에 포함된다. 첫 번째 Section 전에 선언한 command와 option 모두 무시된다. Action과 service는 고유의 이름을 갖는다. 만약 두번째 정의한 action이나 service의 이름이 전에 정의한 것과 이름이 같은 경우 오류로 간주하며 무시된다. (??? 대신에 오버라이드해야 될까?) Action ------ action은 이름 붙은 command을 순서대로 나열한 것이다. action은 trigger를 가지는데 언제 action이 일어나야 할지를 결정할 때 쓰인다. action의 trigger와 일치하는 이벤트가 발생하면 해당 action이 실행 대기 큐(to-be-executed queue)의 마지막에 추가된다. (이미 큐에 들어가 있지 않는 경우) 큐에 들어가있는 각 action은 차례대로 큐에서 빠져나가며 빠져나간 action의 각 command 또한 차례대로 수행된다. Init은 activity의 명령을 수행하는 도중에 다른 activity(디바이스의 생성/소멸, 프로퍼티 설정, 프로세스 재시작)를 처리한다. action의 형태는 다음과 같다: on <trigger> <command> <command> <command> Service ------- 서비스는 init이 실행하는 프로그램이고 (선택적으로) 그 프로그램이 종료될 때 재시작하도록 할 수 있다. 서비스는 아래와 같은 형태로 기술된다: service <name> <pathname> [ <argument> ]* <option> <option> ... Option ------ option은 서비스의 수식자이다. 이는 init프로세스가 어떻게, 언제 서비스를 실행할지 결정한다. critical device-critical 서비스이다. 4분 동안 4번 이상 서비스가 종료되면 안드로이드 시스템이 재시작되어 recovery 모드로 진입한다. disabled 서비스가 자동으로 시작되지 않는다. 서비스의 이름을 통해 서비스를 시작한다. setenv <name> <value> 실행되는 프로세스의 환경 변수 <name>을 <value>로 설정한다. socket <name> <type> <perm> [ <user> [ <group> ] ] /dev/socket/<name> 에 유닉스 도메인 소켓을 생성하고 실행되는 프로세스에 file descriptor가 전달된다. <type>은 "dgram", "stream", "seqpacket"의 값을 가져야 한다. user와 group은 기본적으로 0이다. user <username> 서비스를 실행하기 전에 username을 변경한다. 기본적으로 사용자는 root로 되어 있다. (??? 아마도 기본값이 nobody가 되어야 할 듯?) 만약 프로세스가 리눅스 capability를 필요로 한다면 이 command를 사용할 수 없다. 대신에 프로세스 내부에서 root인 상태로 capability를 요구한 후 uid를 변경하면 된다. group <groupname> [ <goupname> ]* 서비스를 싱행하기 전에 groupname을 변경한다. 기본값은 root이다. oneshot 서비스가 종료된 후에 재시작하지 않는다. class <name> 서비스의 class name을 명시한다. 그룹에 속한 모든 서비스는 함께 시작하고, 종료된다. class option을 명시되지 않은 서비스는 default class에 속한다. onrestart 서비스가 재시작되면 command(아래 참조)를 실행한다. trigger ------ 트리거는 특정 종류의 이벤트를 나타내는 문자열로 이루어져 있고 특정 action이 일어날 수 있게 해준다. boot 이 트리거는 첫번째 trigger로 init이 시작될 때 발생한다.(init.conf가 로드된 이후) <name>=<value> 이 형태의 trigger는 <name> 프로퍼티의 값이 <value> 값으로 설정될 때 발생한다. device-added-<path> device-removed-<path> 이 형태의 trigger는 디바이스 노드가 추가되거나 제거될 때 발생한다. service-exited-<name> 이 형태의 trigger는 <name> 서비스가 종료될 때 발생한다. Triggers of this form occur when the specified service exits. Command --------- exec <path> [ <argument> ]* (<path>) 프로그램을 실행한다. 프로그램이 종료될 때까지 init을 block한다. init 프로세스의 수행이 멈출 수도 있으므로 주의한다. (??? timeout을 도입해야 할까?) export <name> <value> 환경 변수 <name>의 값을 <value>로 설정한다. 이 명령이 수행된 후에 실행되는 모든 프로세스는 이 값을 사용할 수 있다. ifup <interface> 네트워크 인터페이스 <interface>를 활성화한다. import <filename> <filename>을 추가하여 현재의 설정을 확장한다. hostname <name> host name을 설정한다. chdir <directory> 현재 working 디렉터리를 변경한다. chmod <octal-mode> <path> 파일 접근 권한을 변경한다. chown <owner> <group> <path> 파일 소유자와 그룹을 변경한다. chroot <directory> root 디렉터리를 변경한다. class_start <serviceclass> 이미 실행 중인 서비스가 아니라면 해당 class에 속한 모든 서비스를 실행한다. class_stop <serviceclass> 실행 중인 서비스라면 해당 class에 속한 모든 서비스를 종료한다. domainname <name> domain name을 설정한다. insmod <path> <path>에 있는 모듈을 설치한다. mkdir <path> [mode] [owner] [group] <path> 디렉터리를 생성한다. 선택적으로 접근 권한, 소유자, 그룹을 지정할 수 있는데 지정하지 않은 경우 생성된 디렉터리는 접근 권한 755, 소유자 root, 그룹 root의 속성을 갖는다. mount <type> <device> <dir> [ <mountoption> ]* <dir>에 디바이스를 마운트한다. <device>에 mtd block 디바이스를 명시하려면 mtd@name의 형태가 된다. <mountoption>은 "ro", "rw", "remount", "noatime", ... 를 포함한다. setkey 미정 (TBD=To Be Determined) setprop <name> <value> 시스템 프로퍼티 <name>을 <value>의 값으로 설정 setrlimit <resource> <cur> <max> 리소스의 rlimit을 설정한다. start <service> 서비스가 실행되고 있지 않다면 서비스를 실행한다. stop <service> 서비스가 실행되고 있다면 서비스를 종료한다. symlink <target> <path> <path>에 <target>값을 갖는 심볼릭 링크를 생성한다. sysclktz <mins_west_of_gmt> 시스템 clock base를 설정한다.(GMT라면 0으로 설정) trigger <event> 이벤트를 trigger한다. 다른 action으로 부터 action을 queue에 넣는다. write <path> <string> [ <string> ]* <path> 파일을 열고 한 개 혹은 여러개의 <string>을 쓴다. Property -------- Init은 무엇을 하고 있는지 파악하기 위한 몇몇 시스템 프로퍼티를 갱신한다 init.action 현재 수행되는 action의 이름과 같고 수행되는 것이 없으면 "" 값을 갖는다 init.command 현재 수행되는 command와 같고 수행되는 것이 없으면 "" 값을 갖는다 init.svc.<name> <name> 서비스의 상태 값을 갖는다 ("stopped", "running", "restarting") init.conf 예제 ----------------- # not complete -- just providing some examples of usage # on boot export PATH /sbin:/system/sbin:/system/bin export LD_LIBRARY_PATH /system/lib mkdir /dev mkdir /proc mkdir /sys mount tmpfs tmpfs /dev mkdir /dev/pts mkdir /dev/socket mount devpts devpts /dev/pts mount proc proc /proc mount sysfs sysfs /sys write /proc/cpu/alignment 4 ifup lo hostname localhost domainname localhost mount yaffs2 mtd@system /system mount yaffs2 mtd@userdata /data import /system/etc/init.conf class_start default service adbd /sbin/adbd user adb group adb service usbd /system/bin/usbd -r user usbd group usbd socket usbd 666 service zygote /system/bin/app_process -Xzygote /system/bin --zygote socket zygote 666 service runtime /system/bin/runtime user system group system on device-added-/dev/compass start akmd on device-removed-/dev/compass stop akmd service akmd /sbin/akmd disabled user akmd group akmd 디버깅 노트 ----------- 기본적으로 init에 의해 수행되는 프로그램의 stdout과 stderr은 /dev/null로 연결되어 있다. 디버깅을 돕기 위해 프로그램을 안드로이드 프로그램 logwrapper을 통해 수행할 수 있다. 이렇게 함으로써 stdout과 stderr은 안드로이드 로깅 시스템에 연결될 것이다. (logcat을 통해 접근) 예) service akmd /system/bin/logwrapper /sbin/akmd Dreamy의 코드 스크랩내가 모으고 내가 보는
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Designed by sketchbooks.co.kr / sketchbook5 board skin
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5