안드로이드의 rc 파일은 일반 리눅스의 실행 스크립트 파일이 아니다. 예를 들어 외부 명령어를 실행하기 위해서 해당 실행파일의 경로를 rc 파일에 넣어놔도 실행되지 않을 것이다. 이것은 rc 파일을 안드로이드 init 프로세스 에서 직접 파싱해서 지정된 문법이 아니면 파싱할 수 없기 때문이다. 그럼 이 문법에 대해서 알아보자. rc 파일의 문법은 은 크게 action 과 service 그리고 여기서 쓰이는 command 로 구분 할 수 있다. command 는 혼자서는 쓰일 수 없고 action 이나 service 와 함께 써야 한다.
(1) action
action 은 순서와 상관없이 문서의 아무 곳에나 위치 할 수 있고 아래와 같은 형태를 가지고 있다.
on <trigger>
<command>
[...]
여기서 trigger 에 의해 command가 실행되는 시점을 지정하게 되는데 사용 가능한 trigger 는 다음과 같다.
* early-init : 기본적인 device 만 마운트 하고 실행하도록 하는 것이다. 여기서는 프로퍼티가 로드되지 않았기 때문에 사용할 수 없다.
* init : early-init 다음에 property를 로드하고 바로 실행하게 된다.
* early-boot : init을 마친 후 시그널 처리를 위한 소켓생성을 완료하고 바로 실행하게 된다.
* boot : early-boot 가 실행되고 바로 실행된다.
* property:<name>=<value> : boot 가 실행되고 나서 property를 검색해서 일치하는 것이 있다면 해당 command를 실행하게 된다.
(2) service :
service 역시 순서와 상관없이 문서의 아무 곳에나 위치 할 수 있고 아래와 같은 형태를 가지고 있다. init.rc 파일을 보면 마치 action 에 service 가 포함된 것처럼 보이지만 action 과 service 는 각각 따로 동작한다.
service <name> <program>
| group <gid> [gidn] [...]
| keycodes <keycode> [keycoden] [...]
| onrestart <command>
| setenv <name> <value>
| socket <name> <type(dgram|stream)> <perm> [uid] [gid]
| user <uid>
| class <classname>
| capability | console | disabled | oneshot | critical | ioprio
service : 서비스 구분자
name : 최대 16바이트 크기의 서비스의 이름
program : 실행할 서비스 명
group : 실행 group 권한 설정
keycodes : 해당 프로세스로 전송될 keycode 설정
onrestart : 서비스 재시작시 실행될 커멘드 설정
setenv : 환경변수 지정
socket : “/dev/socket/<name>” 유닉스 도메인 소켓 생성해서 실행되는 프로세스에 fd를 넘겨줌
usr : 실행할 user 권한 설정
class : 클래스 지정한다. 만약 지정하지 않을 경우 "default" 로 지정됨.
capability : 수행하는 작업 없음
console:커널에서 지정한 콘솔로 출력을 내보냄
oneshort : 처음 한번 만 실행되고 실행 않음
disabled : 처음 실행시 실행 않음
critical : 만약 해당 서비스가 4분 안에 4번 이상 재시작 된다면 recovery 모드로 재부팅
ioprio : io priorities
(3) command
command 는 직접 실행파일의 위치를 가져다 놓아서 실행하는 것이 아니고 일정한 문법에 따라 내부 명령어를 실행하는 형태로 되어있다. 여기서 쓰이는 내부 명령어는 아래와 같다.
* class_start <name> : <name> 에 해당하는 서비스를 찾아서 disabled 되지 않은 서비스를 실행한다.
* class_stop <name> : <name> 에 해당하는 서비스를 찾아서 중지한다.
* domainname <name> : "/proc/sys/kernel/domainname" 에 도메인명을 셋팅한다.
* export <name> <value> : 환경변수를 셋팅한다.
* hostname <hostname> : "/proc/sys/kernel/hostname" 에 호스트네임을 셋팅한다.
* ifup <interface> : 네트웍 인터페이스 카드를 켠다.
* insmod <path> : <path> 에 해당하는 모듈을 인스톨한다.
* mkdir <dir> [mode] [owner] [group] : <dir> 디렉토리를 생성한다.
* mount <type> <device> <path> <flags...> <options> : 마운트 한다.
* setprop <name> <value> : 공유 프로퍼티를 설정한다.
* start <servicename> : 서비스를 실행한다.
* stop <servicename> : 서비스를 중지한다.
* restart <servicename> : 서비스를 재시작 한다.
* symlink <target> <dest> : 심볼릭 링크를 생성한다.
* sysclktz <minute> : 그리니치 서측분차를 설정한다.
* write <file> <content> : 해당 파일에 내용을 쓴다.
* copy <source> <target> : 파일을 복사한파일의 owner 와 group을 변경한다.다.
* chown <owner> <group> <file> : 파일의 owner 와 group을 변경한다.
* chmod <perm> <file> : 파일의 퍼미션을 변경한다.
* loglevel <level> : 로그 레벨을 설정할 수 있습니다. 범위는 0~6까지 입니다.
* setrlimit <resource> <softlimit> <hardlimit> : resource 의 제한을 설정한다.
* device <source> <perm> <uid> <gid>
* setkey <table> <index> <value>
[출처] [펌]Android Init|작성자 레오
'Android' 카테고리의 다른 글
앱 설치, 삭제, 업데이트 시에 발생하는 이벤트 가져오기 (0) | 2013.05.19 |
---|---|
안드로이드 개발 툴들 (0) | 2013.05.19 |
실행중인 프로세스 확인하기 (0) | 2013.05.15 |
android 개발환경 설치 (0) | 2013.02.02 |
토글버튼 이미지 변경 (0) | 2013.01.27 |