1 Android Init Language 2 --------------------- 3 4 The Android Init Language consists of five broad classes of statements, 5 which are Actions, Commands, Services, Options, and Imports. 6 7 All of these are line-oriented, consisting of tokens separated by 8 whitespace. The c-style backslash escapes may be used to insert 9 whitespace into a token. Double quotes may also be used to prevent 10 whitespace from breaking text into multiple tokens. The backslash, 11 when it is the last character on a line, may be used for line-folding. 12 13 Lines which start with a # (leading whitespace allowed) are comments. 14 15 Actions and Services implicitly declare a new section. All commands 16 or options belong to the section most recently declared. Commands 17 or options before the first section are ignored. 18 19 Actions and Services have unique names. If a second Action is defined 20 with the same name as an existing one, its commands are appended to 21 the commands of the existing action. If a second Service is defined 22 with the same name as an existing one, it is ignored and an error 23 message is logged. 24 25 26 Init .rc Files 27 -------------- 28 The init language is used in plaintext files that take the .rc file 29 extension. These are typically multiple of these in multiple 30 locations on the system, described below. 31 32 /init.rc is the primary .rc file and is loaded by the init executable 33 at the beginning of its execution. It is responsible for the initial 34 set up of the system. It imports /init.${ro.hardware}.rc which is the 35 primary vendor supplied .rc file. 36 37 During the mount_all command, the init executable loads all of the 38 files contained within the /{system,vendor,odm}/etc/init/ directories. 39 These directories are intended for all Actions and Services used after 40 file system mounting. 41 42 One may specify paths in the mount_all command line to have it import 43 .rc files at the specified paths instead of the default ones listed above. 44 This is primarily for supporting factory mode and other non-standard boot 45 modes. The three default paths should be used for the normal boot process. 46 47 The intention of these directories is as follows 48 1) /system/etc/init/ is for core system items such as 49 SurfaceFlinger, MediaService, and logcatd. 50 2) /vendor/etc/init/ is for SoC vendor items such as actions or 51 daemons needed for core SoC functionality. 52 3) /odm/etc/init/ is for device manufacturer items such as 53 actions or daemons needed for motion sensor or other peripheral 54 functionality. 55 56 All services whose binaries reside on the system, vendor, or odm 57 partitions should have their service entries placed into a 58 corresponding init .rc file, located in the /etc/init/ 59 directory of the partition where they reside. There is a build 60 system macro, LOCAL_INIT_RC, that handles this for developers. Each 61 init .rc file should additionally contain any actions associated with 62 its service. 63 64 An example is the logcatd.rc and Android.mk files located in the 65 system/core/logcat directory. The LOCAL_INIT_RC macro in the 66 Android.mk file places logcatd.rc in /system/etc/init/ during the 67 build process. Init loads logcatd.rc during the mount_all command and 68 allows the service to be run and the action to be queued when 69 appropriate. 70 71 This break up of init .rc files according to their daemon is preferred 72 to the previously used monolithic init .rc files. This approach 73 ensures that the only service entries that init reads and the only 74 actions that init performs correspond to services whose binaries are in 75 fact present on the file system, which was not the case with the 76 monolithic init .rc files. This additionally will aid in merge 77 conflict resolution when multiple services are added to the system, as 78 each one will go into a separate file. 79 80 There are two options "early" and "late" in mount_all command 81 which can be set after optional paths. With "--early" set, the 82 init executable will skip mounting entries with "latemount" flag 83 and triggering fs encryption state event. With "--late" set, 84 init executable will only mount entries with "latemount" flag but skip 85 importing rc files. By default, no option is set, and mount_all will 86 mount_all will process all entries in the given fstab. 87 88 Actions 89 ------- 90 Actions are named sequences of commands. Actions have a trigger which 91 is used to determine when the action should occur. When an event 92 occurs which matches an action's trigger, that action is added to 93 the tail of a to-be-executed queue (unless it is already on the 94 queue). 95 96 Each action in the queue is dequeued in sequence and each command in 97 that action is executed in sequence. Init handles other activities 98 (device creation/destruction, property setting, process restarting) 99 "between" the execution of the commands in activities. 100 101 Actions take the form of: 102 103 on <trigger> [&& <trigger>]* 104 <command> 105 <command> 106 <command> 107 108 109 Services 110 -------- 111 Services are programs which init launches and (optionally) restarts 112 when they exit. Services take the form of: 113 114 service <name> <pathname> [ <argument> ]* 115 <option> 116 <option> 117 ... 118 119 120 Options 121 ------- 122 Options are modifiers to services. They affect how and when init 123 runs the service. 124 125 critical 126 This is a device-critical service. If it exits more than four times in 127 four minutes, the device will reboot into recovery mode. 128 129 disabled 130 This service will not automatically start with its class. 131 It must be explicitly started by name. 132 133 setenv <name> <value> 134 Set the environment variable <name> to <value> in the launched process. 135 136 socket <name> <type> <perm> [ <user> [ <group> [ <seclabel> ] ] ] 137 Create a unix domain socket named /dev/socket/<name> and pass 138 its fd to the launched process. <type> must be "dgram", "stream" or "seqpacket". 139 User and group default to 0. 140 'seclabel' is the SELinux security context for the socket. 141 It defaults to the service security context, as specified by seclabel or 142 computed based on the service executable file security context. 143 144 user <username> 145 Change to username before exec'ing this service. 146 Currently defaults to root. (??? probably should default to nobody) 147 As of Android M, processes should use this option even if they 148 require linux capabilities. Previously, to acquire linux 149 capabilities, a process would need to run as root, request the 150 capabilities, then drop to its desired uid. There is a new 151 mechanism through fs_config that allows device manufacturers to add 152 linux capabilities to specific binaries on a file system that should 153 be used instead. This mechanism is described on 154 http://source.android.com/devices/tech/config/filesystem.html. When 155 using this new mechanism, processes can use the user option to 156 select their desired uid without ever running as root. 157 158 group <groupname> [ <groupname> ]* 159 Change to groupname before exec'ing this service. Additional 160 groupnames beyond the (required) first one are used to set the 161 supplemental groups of the process (via setgroups()). 162 Currently defaults to root. (??? probably should default to nobody) 163 164 seclabel <seclabel> 165 Change to 'seclabel' before exec'ing this service. 166 Primarily for use by services run from the rootfs, e.g. ueventd, adbd. 167 Services on the system partition can instead use policy-defined transitions 168 based on their file security context. 169 If not specified and no transition is defined in policy, defaults to the init context. 170 171 oneshot 172 Do not restart the service when it exits. 173 174 class <name> 175 Specify a class name for the service. All services in a 176 named class may be started or stopped together. A service 177 is in the class "default" if one is not specified via the 178 class option. 179 180 onrestart 181 Execute a Command (see below) when service restarts. 182 183 writepid <file...> 184 Write the child's pid to the given files when it forks. Meant for 185 cgroup/cpuset usage. 186 187 188 Triggers 189 -------- 190 Triggers are strings which can be used to match certain kinds of 191 events and used to cause an action to occur. 192 193 Triggers are subdivided into event triggers and property triggers. 194 195 Event triggers are strings triggered by the 'trigger' command or by 196 the QueueEventTrigger() function within the init executable. These 197 take the form of a simple string such as 'boot' or 'late-init'. 198 199 Property triggers are strings triggered when a named property changes 200 value to a given new value or when a named property changes value to 201 any new value. These take the form of 'property:<name>=<value>' and 202 'property:<name>=*' respectively. Property triggers are additionally 203 evaluated and triggered accordingly during the initial boot phase of 204 init. 205 206 An Action can have multiple property triggers but may only have one 207 event trigger. 208 209 For example: 210 'on boot && property:a=b' defines an action that is only executed when 211 the 'boot' event trigger happens and the property a equals b. 212 213 'on property:a=b && property:c=d' defines an action that is executed 214 at three times, 215 1) During initial boot if property a=b and property c=d 216 2) Any time that property a transitions to value b, while property 217 c already equals d. 218 3) Any time that property c transitions to value d, while property 219 a already equals b. 220 221 222 Commands 223 -------- 224 225 bootchart_init 226 Start bootcharting if configured (see below). 227 This is included in the default init.rc. 228 229 chmod <octal-mode> <path> 230 Change file access permissions. 231 232 chown <owner> <group> <path> 233 Change file owner and group. 234 235 class_start <serviceclass> 236 Start all services of the specified class if they are 237 not already running. 238 239 class_stop <serviceclass> 240 Stop and disable all services of the specified class if they are 241 currently running. 242 243 class_reset <serviceclass> 244 Stop all services of the specified class if they are 245 currently running, without disabling them. They can be restarted 246 later using class_start. 247 248 copy <src> <dst> 249 Copies a file. Similar to write, but useful for binary/large 250 amounts of data. 251 252 domainname <name> 253 Set the domain name. 254 255 enable <servicename> 256 Turns a disabled service into an enabled one as if the service did not 257 specify disabled. 258 If the service is supposed to be running, it will be started now. 259 Typically used when the bootloader sets a variable that indicates a specific 260 service should be started when needed. E.g. 261 on property:ro.boot.myfancyhardware=1 262 enable my_fancy_service_for_my_fancy_hardware 263 264 exec [ <seclabel> [ <user> [ <group> ]* ] ] -- <command> [ <argument> ]* 265 Fork and execute command with the given arguments. The command starts 266 after "--" so that an optional security context, user, and supplementary 267 groups can be provided. No other commands will be run until this one 268 finishes. <seclabel> can be a - to denote default. 269 270 export <name> <value> 271 Set the environment variable <name> equal to <value> in the 272 global environment (which will be inherited by all processes 273 started after this command is executed) 274 275 hostname <name> 276 Set the host name. 277 278 ifup <interface> 279 Bring the network interface <interface> online. 280 281 insmod <path> 282 Install the module at <path> 283 284 load_all_props 285 Loads properties from /system, /vendor, et cetera. 286 This is included in the default init.rc. 287 288 load_persist_props 289 Loads persistent properties when /data has been decrypted. 290 This is included in the default init.rc. 291 292 loglevel <level> 293 Sets the kernel log level to level. Properties are expanded within <level>. 294 295 mkdir <path> [mode] [owner] [group] 296 Create a directory at <path>, optionally with the given mode, owner, and 297 group. If not provided, the directory is created with permissions 755 and 298 owned by the root user and root group. If provided, the mode, owner and group 299 will be updated if the directory exists already. 300 301 mount_all <fstab> [ <path> ]* [--<option>] 302 Calls fs_mgr_mount_all on the given fs_mgr-format fstab and imports .rc files 303 at the specified paths (e.g., on the partitions just mounted) with optional 304 options "early" and "late". 305 Refer to the section of "Init .rc Files" for detail. 306 307 mount <type> <device> <dir> [ <flag> ]* [<options>] 308 Attempt to mount the named device at the directory <dir> 309 <device> may be of the form mtd@name to specify a mtd block 310 device by name. 311 <flag>s include "ro", "rw", "remount", "noatime", ... 312 <options> include "barrier=1", "noauto_da_alloc", "discard", ... as 313 a comma separated string, eg: barrier=1,noauto_da_alloc 314 315 powerctl 316 Internal implementation detail used to respond to changes to the 317 "sys.powerctl" system property, used to implement rebooting. 318 319 restart <service> 320 Like stop, but doesn't disable the service. 321 322 restorecon <path> [ <path> ]* 323 Restore the file named by <path> to the security context specified 324 in the file_contexts configuration. 325 Not required for directories created by the init.rc as these are 326 automatically labeled correctly by init. 327 328 restorecon_recursive <path> [ <path> ]* 329 Recursively restore the directory tree named by <path> to the 330 security contexts specified in the file_contexts configuration. 331 332 rm <path> 333 Calls unlink(2) on the given path. You might want to 334 use "exec -- rm ..." instead (provided the system partition is 335 already mounted). 336 337 rmdir <path> 338 Calls rmdir(2) on the given path. 339 340 setprop <name> <value> 341 Set system property <name> to <value>. Properties are expanded 342 within <value>. 343 344 setrlimit <resource> <cur> <max> 345 Set the rlimit for a resource. 346 347 start <service> 348 Start a service running if it is not already running. 349 350 stop <service> 351 Stop a service from running if it is currently running. 352 353 swapon_all <fstab> 354 Calls fs_mgr_swapon_all on the given fstab file. 355 356 symlink <target> <path> 357 Create a symbolic link at <path> with the value <target> 358 359 sysclktz <mins_west_of_gmt> 360 Set the system clock base (0 if system clock ticks in GMT) 361 362 trigger <event> 363 Trigger an event. Used to queue an action from another 364 action. 365 366 umount <path> 367 Unmount the filesystem mounted at that path. 368 369 verity_load_state 370 Internal implementation detail used to load dm-verity state. 371 372 verity_update_state <mount_point> 373 Internal implementation detail used to update dm-verity state and 374 set the partition.<mount_point>.verified properties used by adb remount 375 because fs_mgr can't set them directly itself. 376 377 wait <path> [ <timeout> ] 378 Poll for the existence of the given file and return when found, 379 or the timeout has been reached. If timeout is not specified it 380 currently defaults to five seconds. 381 382 write <path> <content> 383 Open the file at <path> and write a string to it with write(2). 384 If the file does not exist, it will be created. If it does exist, 385 it will be truncated. Properties are expanded within <content>. 386 387 388 Imports 389 ------- 390 The import keyword is not a command, but rather its own section and is 391 handled immediately after the .rc file that contains it has finished 392 being parsed. It takes the below form: 393 394 import <path> 395 Parse an init config file, extending the current configuration. 396 If <path> is a directory, each file in the directory is parsed as 397 a config file. It is not recursive, nested directories will 398 not be parsed. 399 400 There are only two times where the init executable imports .rc files, 401 1) When it imports /init.rc during initial boot 402 2) When it imports /{system,vendor,odm}/etc/init/ or .rc files at specified 403 paths during mount_all 404 405 406 Properties 407 ---------- 408 Init provides information about the services that it is responsible 409 for via the below properties. 410 411 init.svc.<name> 412 State of a named service ("stopped", "stopping", "running", "restarting") 413 414 415 Bootcharting 416 ------------ 417 This version of init contains code to perform "bootcharting": generating log 418 files that can be later processed by the tools provided by www.bootchart.org. 419 420 On the emulator, use the -bootchart <timeout> option to boot with bootcharting 421 activated for <timeout> seconds. 422 423 On a device, create /data/bootchart/start with a command like the following: 424 425 adb shell 'echo $TIMEOUT > /data/bootchart/start' 426 427 Where the value of $TIMEOUT corresponds to the desired bootcharted period in 428 seconds. Bootcharting will stop after that many seconds have elapsed. 429 You can also stop the bootcharting at any moment by doing the following: 430 431 adb shell 'echo 1 > /data/bootchart/stop' 432 433 Note that /data/bootchart/stop is deleted automatically by init at the end of 434 the bootcharting. This is not the case with /data/bootchart/start, so don't 435 forget to delete it when you're done collecting data. 436 437 The log files are written to /data/bootchart/. A script is provided to 438 retrieve them and create a bootchart.tgz file that can be used with the 439 bootchart command-line utility: 440 441 sudo apt-get install pybootchartgui 442 # grab-bootchart.sh uses $ANDROID_SERIAL. 443 $ANDROID_BUILD_TOP/system/core/init/grab-bootchart.sh 444 445 One thing to watch for is that the bootchart will show init as if it started 446 running at 0s. You'll have to look at dmesg to work out when the kernel 447 actually started init. 448 449 450 Comparing two bootcharts 451 ------------------------ 452 A handy script named compare-bootcharts.py can be used to compare the 453 start/end time of selected processes. The aforementioned grab-bootchart.sh 454 will leave a bootchart tarball named bootchart.tgz at /tmp/android-bootchart. 455 If two such barballs are preserved on the host machine under different 456 directories, the script can list the timestamps differences. For example: 457 458 Usage: system/core/init/compare-bootcharts.py base_bootchart_dir 459 exp_bootchart_dir 460 461 process: baseline experiment (delta) 462 - Unit is ms (a jiffy is 10 ms on the system) 463 ------------------------------------ 464 /init: 50 40 (-10) 465 /system/bin/surfaceflinger: 4320 4470 (+150) 466 /system/bin/bootanimation: 6980 6990 (+10) 467 zygote64: 10410 10640 (+230) 468 zygote: 10410 10640 (+230) 469 system_server: 15350 15150 (-200) 470 bootanimation ends at: 33790 31230 (-2560) 471 472 473 Systrace 474 -------- 475 Systrace [1] can be used for obtaining performance analysis reports during boot 476 time on userdebug or eng builds. 477 Here is an example of trace events of "wm" and "am" categories: 478 479 $ANDROID_BUILD_TOP/external/chromium-trace/systrace.py wm am --boot 480 481 This command will cause the device to reboot. After the device is rebooted and 482 the boot sequence has finished, the trace report is obtained from the device 483 and written as trace.html on the host by hitting Ctrl+C. 484 485 LIMITATION 486 Recording trace events is started after persistent properties are loaded, so 487 the trace events that are emitted before that are not recorded. Several 488 services such as vold, surfaceflinger, and servicemanager are affected by this 489 limitation since they are started before persistent properties are loaded. 490 Zygote initialization and the processes that are forked from the zygote are not 491 affected. 492 493 [1] http://developer.android.com/tools/help/systrace.html 494 495 496 Debugging init 497 -------------- 498 By default, programs executed by init will drop stdout and stderr into 499 /dev/null. To help with debugging, you can execute your program via the 500 Android program logwrapper. This will redirect stdout/stderr into the 501 Android logging system (accessed via logcat). 502 503 For example 504 service akmd /system/bin/logwrapper /sbin/akmd 505 506 For quicker turnaround when working on init itself, use: 507 508 mm -j 509 m ramdisk-nodeps 510 m bootimage-nodeps 511 adb reboot bootloader 512 fastboot boot $ANDROID_PRODUCT_OUT/boot.img 513 514 Alternatively, use the emulator: 515 516 emulator -partition-size 1024 -verbose -show-kernel -no-window 517 518 You might want to call klog_set_level(6) after the klog_init() call 519 so you see the kernel logging in dmesg (or the emulator output). 520