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