1
2Android Init Language
3---------------------
4
5The Android Init Language consists of four broad classes of statements,
6which are Actions, Commands, Services, and Options.
7
8All of these are line-oriented, consisting of tokens separated by
9whitespace.  The c-style backslash escapes may be used to insert
10whitespace into a token.  Double quotes may also be used to prevent
11whitespace from breaking text into multiple tokens.  The backslash,
12when it is the last character on a line, may be used for line-folding.
13
14Lines which start with a # (leading whitespace allowed) are comments.
15
16Actions and Services implicitly declare a new section.  All commands
17or options belong to the section most recently declared.  Commands
18or options before the first section are ignored.
19
20Actions and Services have unique names.  If a second Action or Service
21is declared with the same name as an existing one, it is ignored as
22an error.  (??? should we override instead)
23
24
25Actions
26-------
27Actions are named sequences of commands.  Actions have a trigger which
28is used to determine when the action should occur.  When an event
29occurs which matches an action's trigger, that action is added to
30the tail of a to-be-executed queue (unless it is already on the
31queue).
32
33Each action in the queue is dequeued in sequence and each command in
34that action is executed in sequence.  Init handles other activities
35(device creation/destruction, property setting, process restarting)
36"between" the execution of the commands in activities.
37
38Actions take the form of:
39
40on <trigger>
41   <command>
42   <command>
43   <command>
44
45
46Services
47--------
48Services are programs which init launches and (optionally) restarts
49when they exit.  Services take the form of:
50
51service <name> <pathname> [ <argument> ]*
52   <option>
53   <option>
54   ...
55
56
57Options
58-------
59Options are modifiers to services.  They affect how and when init
60runs the service.
61
62critical
63   This is a device-critical service. If it exits more than four times in
64   four minutes, the device will reboot into recovery mode.
65
66disabled
67   This service will not automatically start with its class.
68   It must be explicitly started by name.
69
70setenv <name> <value>
71   Set the environment variable <name> to <value> in the launched process.
72
73socket <name> <type> <perm> [ <user> [ <group> [ <context> ] ] ]
74   Create a unix domain socket named /dev/socket/<name> and pass
75   its fd to the launched process.  <type> must be "dgram", "stream" or "seqpacket".
76   User and group default to 0.
77   Context is the SELinux security context for the socket.
78   It defaults to the service security context, as specified by seclabel or
79   computed based on the service executable file security context.
80
81user <username>
82   Change to username before exec'ing this service.
83   Currently defaults to root.  (??? probably should default to nobody)
84   Currently, if your process requires linux capabilities then you cannot use
85   this command. You must instead request the capabilities in-process while
86   still root, and then drop to your desired uid.
87
88group <groupname> [ <groupname> ]*
89   Change to groupname before exec'ing this service.  Additional
90   groupnames beyond the (required) first one are used to set the
91   supplemental groups of the process (via setgroups()).
92   Currently defaults to root.  (??? probably should default to nobody)
93
94seclabel <securitycontext>
95  Change to securitycontext before exec'ing this service.
96  Primarily for use by services run from the rootfs, e.g. ueventd, adbd.
97  Services on the system partition can instead use policy-defined transitions
98  based on their file security context.
99  If not specified and no transition is defined in policy, defaults to the init context.
100
101oneshot
102   Do not restart the service when it exits.
103
104class <name>
105   Specify a class name for the service.  All services in a
106   named class may be started or stopped together.  A service
107   is in the class "default" if one is not specified via the
108   class option.
109
110onrestart
111    Execute a Command (see below) when service restarts.
112
113Triggers
114--------
115   Triggers are strings which can be used to match certain kinds
116   of events and used to cause an action to occur.
117
118boot
119   This is the first trigger that will occur when init starts
120   (after /init.conf is loaded)
121
122<name>=<value>
123   Triggers of this form occur when the property <name> is set
124   to the specific value <value>.
125
126device-added-<path>
127device-removed-<path>
128   Triggers of these forms occur when a device node is added
129   or removed.
130
131service-exited-<name>
132   Triggers of this form occur when the specified service exits.
133
134
135Commands
136--------
137
138exec <path> [ <argument> ]*
139   Fork and execute a program (<path>).  This will block until
140   the program completes execution.  It is best to avoid exec
141   as unlike the builtin commands, it runs the risk of getting
142   init "stuck". (??? maybe there should be a timeout?)
143
144export <name> <value>
145   Set the environment variable <name> equal to <value> in the
146   global environment (which will be inherited by all processes
147   started after this command is executed)
148
149ifup <interface>
150   Bring the network interface <interface> online.
151
152import <filename>
153   Parse an init config file, extending the current configuration.
154
155hostname <name>
156   Set the host name.
157
158chdir <directory>
159   Change working directory.
160
161chmod <octal-mode> <path>
162   Change file access permissions.
163
164chown <owner> <group> <path>
165   Change file owner and group.
166
167chroot <directory>
168  Change process root directory.
169
170class_start <serviceclass>
171   Start all services of the specified class if they are
172   not already running.
173
174class_stop <serviceclass>
175   Stop all services of the specified class if they are
176   currently running.
177
178domainname <name>
179   Set the domain name.
180
181enable <servicename>
182   Turns a disabled service into an enabled one as if the service did not
183   specify disabled.
184   If the service is supposed to be running, it will be started now.
185   Typically used when the bootloader sets a variable that indicates a specific
186   service should be started when needed. E.g.
187     on property:ro.boot.myfancyhardware=1
188        enable my_fancy_service_for_my_fancy_hardware
189
190
191insmod <path>
192   Install the module at <path>
193
194mkdir <path> [mode] [owner] [group]
195   Create a directory at <path>, optionally with the given mode, owner, and
196   group. If not provided, the directory is created with permissions 755 and
197   owned by the root user and root group.
198
199mount <type> <device> <dir> [ <mountoption> ]*
200   Attempt to mount the named device at the directory <dir>
201   <device> may be of the form mtd@name to specify a mtd block
202   device by name.
203   <mountoption>s include "ro", "rw", "remount", "noatime", ...
204
205restorecon <path> [ <path> ]*
206   Restore the file named by <path> to the security context specified
207   in the file_contexts configuration.
208   Not required for directories created by the init.rc as these are
209   automatically labeled correctly by init.
210
211restorecon_recursive <path> [ <path> ]*
212   Recursively restore the directory tree named by <path> to the
213   security contexts specified in the file_contexts configuration.
214   Do NOT use this with paths leading to shell-writable or app-writable
215   directories, e.g. /data/local/tmp, /data/data or any prefix thereof.
216
217setcon <securitycontext>
218   Set the current process security context to the specified string.
219   This is typically only used from early-init to set the init context
220   before any other process is started.
221
222setenforce 0|1
223   Set the SELinux system-wide enforcing status.
224   0 is permissive (i.e. log but do not deny), 1 is enforcing.
225
226setkey
227   TBD
228
229setprop <name> <value>
230   Set system property <name> to <value>.
231
232setrlimit <resource> <cur> <max>
233   Set the rlimit for a resource.
234
235setsebool <name> <value>
236   Set SELinux boolean <name> to <value>.
237   <value> may be 1|true|on or 0|false|off
238
239start <service>
240   Start a service running if it is not already running.
241
242stop <service>
243   Stop a service from running if it is currently running.
244
245symlink <target> <path>
246   Create a symbolic link at <path> with the value <target>
247
248sysclktz <mins_west_of_gmt>
249   Set the system clock base (0 if system clock ticks in GMT)
250
251trigger <event>
252   Trigger an event.  Used to queue an action from another
253   action.
254
255wait <path> [ <timeout> ]
256  Poll for the existence of the given file and return when found,
257  or the timeout has been reached. If timeout is not specified it
258  currently defaults to five seconds.
259
260write <path> <string>
261   Open the file at <path> and write a string to it with write(2)
262   without appending.
263
264
265Properties
266----------
267Init updates some system properties to provide some insight into
268what it's doing:
269
270init.action 
271   Equal to the name of the action currently being executed or "" if none
272
273init.command
274   Equal to the command being executed or "" if none.
275
276init.svc.<name>
277   State of a named service ("stopped", "running", "restarting")
278
279
280Example init.conf
281-----------------
282
283# not complete -- just providing some examples of usage
284#
285on boot
286   export PATH /sbin:/system/sbin:/system/bin
287   export LD_LIBRARY_PATH /system/lib
288
289   mkdir /dev
290   mkdir /proc
291   mkdir /sys
292
293   mount tmpfs tmpfs /dev
294   mkdir /dev/pts
295   mkdir /dev/socket
296   mount devpts devpts /dev/pts
297   mount proc proc /proc
298   mount sysfs sysfs /sys
299
300   write /proc/cpu/alignment 4
301
302   ifup lo
303
304   hostname localhost
305   domainname localhost
306
307   mount yaffs2 mtd@system /system
308   mount yaffs2 mtd@userdata /data
309
310   import /system/etc/init.conf
311
312   class_start default
313
314service adbd /sbin/adbd
315   user adb
316   group adb
317
318service usbd /system/bin/usbd -r
319   user usbd
320   group usbd
321   socket usbd 666
322
323service zygote /system/bin/app_process -Xzygote /system/bin --zygote
324   socket zygote 666
325
326service runtime /system/bin/runtime
327   user system
328   group system
329
330on device-added-/dev/compass
331   start akmd
332
333on device-removed-/dev/compass
334   stop akmd
335
336service akmd /sbin/akmd
337   disabled
338   user akmd
339   group akmd
340
341Debugging notes
342---------------
343By default, programs executed by init will drop stdout and stderr into
344/dev/null. To help with debugging, you can execute your program via the
345Andoird program logwrapper. This will redirect stdout/stderr into the
346Android logging system (accessed via logcat).
347
348For example
349service akmd /system/bin/logwrapper /sbin/akmd
350