Android
2014.02.17 17:10

안드로이드 init.rc 문법

조회 수 29383 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
안드로이드 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의 코드 스크랩

내가 모으고 내가 보는

List of Articles
번호 분류 제목 날짜 조회 수 추천 수
225 PHP MySQL 기본 문법 2014.03.01 14083 0
224 Android Android C, C++ 레벨에서 call stack 보기 file 2014.02.25 20337 0
223 일반 LDAP Query 기본 2014.02.19 28124 0
222 C# DataGridView 컨트롤 Tutorial 2014.02.19 13375 0
221 C# HttpWebRequest 로 http GET, POST 전송 및 처리 2014.02.18 30790 0
» Android 안드로이드 init.rc 문법 2014.02.17 29383 0
219 Android ART(Android RunTime)에 대해 1 2014.02.10 17855 0
218 일반 findstr 사용법 - window용 find, grep 명령 2014.02.04 64905 0
217 Android Android RAM 사용량 측정 2014.02.04 12716 0
216 Android 킷캣에서 바뀐 점 정리 2014.01.26 13772 0
215 LINUX screen 명령어, 터미널 멀티세션 제공 1 2014.01.21 57299 0
214 PHP php 기본 문법 정리 secret 2014.01.16 0 0
213 Android 안드로이드 키 이벤트 (adb shell로 보내는 법) 2014.01.04 50950 0
212 Android adb로 폰 화면 동영상 저장 - KK 전용 2013.12.17 15936 0
211 개념 EXIF - Exchangeable Image File Format(교환 이미지 파일 형식) 1 2013.11.19 13508 0
목록
Board Pagination ‹ Prev 1 ... 15 16 17 18 19 20 21 22 23 24 ... 34 Next ›
/ 34

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5