blob: e7e369c5af5174837a0ddf7fb0823bcc16b68063 [file] [log] [blame]
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -07001Android Init Language
2---------------------
3
Tom Cherry3be66ed2015-09-01 14:49:38 -07004The Android Init Language consists of five broad classes of statements,
5which are Actions, Commands, Services, Options, and Imports.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -07006
7All of these are line-oriented, consisting of tokens separated by
8whitespace. The c-style backslash escapes may be used to insert
9whitespace into a token. Double quotes may also be used to prevent
10whitespace from breaking text into multiple tokens. The backslash,
11when it is the last character on a line, may be used for line-folding.
12
13Lines which start with a # (leading whitespace allowed) are comments.
14
15Actions and Services implicitly declare a new section. All commands
16or options belong to the section most recently declared. Commands
17or options before the first section are ignored.
18
Tom Cherry3be66ed2015-09-01 14:49:38 -070019Actions and Services have unique names. If a second Action is defined
20with the same name as an existing one, its commands are appended to
21the commands of the existing action. If a second Service is defined
22with the same name as an existing one, it is ignored and an error
23message is logged.
24
25
26Init .rc Files
27--------------
28The init language is used in plaintext files that take the .rc file
29extension. These are typically multiple of these in multiple
30locations on the system, described below.
31
32/init.rc is the primary .rc file and is loaded by the init executable
33at the beginning of its execution. It is responsible for the initial
34set up of the system. It imports /init.${ro.hardware}.rc which is the
35primary vendor supplied .rc file.
36
37During the mount_all command, the init executable loads all of the
38files contained within the /{system,vendor,odm}/etc/init/ directories.
39These directories are intended for all Actions and Services used after
40file system mounting.
41
Tom Cherry1fb20b82016-01-20 16:53:08 -080042One 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.
44This is primarily for supporting factory mode and other non-standard boot
45modes. The three default paths should be used for the normal boot process.
46
Tom Cherry3be66ed2015-09-01 14:49:38 -070047The intention of these directories is as follows
48 1) /system/etc/init/ is for core system items such as
Tom Cherry1fb20b82016-01-20 16:53:08 -080049 SurfaceFlinger, MediaService, and logcatd.
Tom Cherry3be66ed2015-09-01 14:49:38 -070050 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.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -070055
Tom Cherry1fb20b82016-01-20 16:53:08 -080056All services whose binaries reside on the system, vendor, or odm
57partitions should have their service entries placed into a
58corresponding init .rc file, located in the /etc/init/
59directory of the partition where they reside. There is a build
60system macro, LOCAL_INIT_RC, that handles this for developers. Each
61init .rc file should additionally contain any actions associated with
62its service.
63
64An example is the logcatd.rc and Android.mk files located in the
65system/core/logcat directory. The LOCAL_INIT_RC macro in the
66Android.mk file places logcatd.rc in /system/etc/init/ during the
67build process. Init loads logcatd.rc during the mount_all command and
68allows the service to be run and the action to be queued when
69appropriate.
70
71This break up of init .rc files according to their daemon is preferred
72to the previously used monolithic init .rc files. This approach
73ensures that the only service entries that init reads and the only
74actions that init performs correspond to services whose binaries are in
75fact present on the file system, which was not the case with the
76monolithic init .rc files. This additionally will aid in merge
77conflict resolution when multiple services are added to the system, as
78each one will go into a separate file.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -070079
Wei Wang254f4432016-08-23 11:58:09 -070080There are two options "early" and "late" in mount_all command
81which can be set after optional paths. With "--early" set, the
82init executable will skip mounting entries with "latemount" flag
83and triggering fs encryption state event. With "--late" set,
84init executable will only mount entries with "latemount" flag but skip
85importing rc files. By default, no option is set, and mount_all will
86mount_all will process all entries in the given fstab.
87
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -070088Actions
89-------
90Actions are named sequences of commands. Actions have a trigger which
91is used to determine when the action should occur. When an event
92occurs which matches an action's trigger, that action is added to
93the tail of a to-be-executed queue (unless it is already on the
94queue).
95
96Each action in the queue is dequeued in sequence and each command in
97that 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
101Actions take the form of:
102
Tom Cherry3be66ed2015-09-01 14:49:38 -0700103on <trigger> [&& <trigger>]*
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700104 <command>
105 <command>
106 <command>
107
108
109Services
110--------
111Services are programs which init launches and (optionally) restarts
112when they exit. Services take the form of:
113
114service <name> <pathname> [ <argument> ]*
115 <option>
116 <option>
117 ...
118
119
120Options
121-------
122Options are modifiers to services. They affect how and when init
123runs the service.
124
Viorel Suman70daa672016-03-21 10:08:07 +0200125console [<console>]
126 This service needs a console. The optional second parameter chooses a
127 specific console instead of the default. The default "/dev/console" can
128 be changed by setting the "androidboot.console" kernel parameter. In
129 all cases the leading "/dev/" should be omitted, so "/dev/tty0" would be
130 specified as just "console tty0".
131
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700132critical
Elliott Hughesd62f0602015-06-12 18:02:20 -0700133 This is a device-critical service. If it exits more than four times in
134 four minutes, the device will reboot into recovery mode.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700135
136disabled
Elliott Hughesd62f0602015-06-12 18:02:20 -0700137 This service will not automatically start with its class.
138 It must be explicitly started by name.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700139
140setenv <name> <value>
Elliott Hughesd62f0602015-06-12 18:02:20 -0700141 Set the environment variable <name> to <value> in the launched process.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700142
Elliott Hughes8d82ea02015-02-06 20:15:18 -0800143socket <name> <type> <perm> [ <user> [ <group> [ <seclabel> ] ] ]
Elliott Hughesd62f0602015-06-12 18:02:20 -0700144 Create a unix domain socket named /dev/socket/<name> and pass
145 its fd to the launched process. <type> must be "dgram", "stream" or "seqpacket".
146 User and group default to 0.
147 'seclabel' is the SELinux security context for the socket.
148 It defaults to the service security context, as specified by seclabel or
149 computed based on the service executable file security context.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700150
151user <username>
Jorge Lucangeli Obes24b29132016-10-27 10:33:03 -0400152 Change to 'username' before exec'ing this service.
Elliott Hughesd62f0602015-06-12 18:02:20 -0700153 Currently defaults to root. (??? probably should default to nobody)
Tom Cherrydbddb402015-12-11 12:54:50 -0800154 As of Android M, processes should use this option even if they
Jorge Lucangeli Obes24b29132016-10-27 10:33:03 -0400155 require Linux capabilities. Previously, to acquire Linux
Tom Cherrydbddb402015-12-11 12:54:50 -0800156 capabilities, a process would need to run as root, request the
157 capabilities, then drop to its desired uid. There is a new
158 mechanism through fs_config that allows device manufacturers to add
Jorge Lucangeli Obes24b29132016-10-27 10:33:03 -0400159 Linux capabilities to specific binaries on a file system that should
Tom Cherrydbddb402015-12-11 12:54:50 -0800160 be used instead. This mechanism is described on
161 http://source.android.com/devices/tech/config/filesystem.html. When
162 using this new mechanism, processes can use the user option to
163 select their desired uid without ever running as root.
Jorge Lucangeli Obes24b29132016-10-27 10:33:03 -0400164 As of Android O, processes can also request capabilities directly in their .rc
165 files. See the "capabilities" option below.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700166
167group <groupname> [ <groupname> ]*
Jorge Lucangeli Obes24b29132016-10-27 10:33:03 -0400168 Change to 'groupname' before exec'ing this service. Additional
Elliott Hughesd62f0602015-06-12 18:02:20 -0700169 groupnames beyond the (required) first one are used to set the
170 supplemental groups of the process (via setgroups()).
171 Currently defaults to root. (??? probably should default to nobody)
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700172
Jorge Lucangeli Obes24b29132016-10-27 10:33:03 -0400173capabilities <capability> [ <capability> ]*
174 Set capabilities when exec'ing this service. 'capability' should be a Linux
175 capability without the "CAP_" prefix, like "NET_ADMIN" or "SETPCAP". See
176 http://man7.org/linux/man-pages/man7/capabilities.7.html for a list of Linux
177 capabilities.
178
Elliott Hughes8d82ea02015-02-06 20:15:18 -0800179seclabel <seclabel>
180 Change to 'seclabel' before exec'ing this service.
Stephen Smalley3fb61102012-11-02 15:22:34 -0400181 Primarily for use by services run from the rootfs, e.g. ueventd, adbd.
182 Services on the system partition can instead use policy-defined transitions
183 based on their file security context.
184 If not specified and no transition is defined in policy, defaults to the init context.
185
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700186oneshot
Elliott Hughesd62f0602015-06-12 18:02:20 -0700187 Do not restart the service when it exits.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700188
189class <name>
Elliott Hughesd62f0602015-06-12 18:02:20 -0700190 Specify a class name for the service. All services in a
191 named class may be started or stopped together. A service
192 is in the class "default" if one is not specified via the
193 class option.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700194
195onrestart
Elliott Hughesd62f0602015-06-12 18:02:20 -0700196 Execute a Command (see below) when service restarts.
197
198writepid <file...>
199 Write the child's pid to the given files when it forks. Meant for
200 cgroup/cpuset usage.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700201
Vitalii Tomkiv081705c2016-05-18 17:36:30 -0700202priority <priority>
203 Scheduling priority of the service process. This value has to be in range
204 -20 to 19. Default priority is 0. Priority is set via setpriority().
Elliott Hughes841b2632015-02-12 14:28:54 -0800205
Jorge Lucangeli Obescd2518c2016-08-31 15:23:44 -0400206namespace <pid|mnt>
207 Enter a new PID or mount namespace when forking the service.
208
Marco Nelissen310f6702016-07-22 12:07:06 -0700209oom_score_adjust <value>
210 Sets the child's /proc/self/oom_score_adj to the specified value,
211 which must range from -1000 to 1000.
212
Jorge Lucangeli Obescd2518c2016-08-31 15:23:44 -0400213
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700214Triggers
215--------
Tom Cherry3be66ed2015-09-01 14:49:38 -0700216Triggers are strings which can be used to match certain kinds of
217events and used to cause an action to occur.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700218
Tom Cherry3be66ed2015-09-01 14:49:38 -0700219Triggers are subdivided into event triggers and property triggers.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700220
Tom Cherry3be66ed2015-09-01 14:49:38 -0700221Event triggers are strings triggered by the 'trigger' command or by
222the QueueEventTrigger() function within the init executable. These
223take the form of a simple string such as 'boot' or 'late-init'.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700224
Tom Cherry3be66ed2015-09-01 14:49:38 -0700225Property triggers are strings triggered when a named property changes
226value to a given new value or when a named property changes value to
227any new value. These take the form of 'property:<name>=<value>' and
228'property:<name>=*' respectively. Property triggers are additionally
229evaluated and triggered accordingly during the initial boot phase of
230init.
Badhri Jagan Sridharan0b415122014-10-10 23:19:06 -0700231
Tom Cherry3be66ed2015-09-01 14:49:38 -0700232An Action can have multiple property triggers but may only have one
233event trigger.
Badhri Jagan Sridharan0b415122014-10-10 23:19:06 -0700234
Tom Cherry3be66ed2015-09-01 14:49:38 -0700235For example:
236'on boot && property:a=b' defines an action that is only executed when
237the 'boot' event trigger happens and the property a equals b.
238
239'on property:a=b && property:c=d' defines an action that is executed
240at three times,
241 1) During initial boot if property a=b and property c=d
242 2) Any time that property a transitions to value b, while property
243 c already equals d.
244 3) Any time that property c transitions to value d, while property
245 a already equals b.
Badhri Jagan Sridharan0b415122014-10-10 23:19:06 -0700246
Elliott Hughes841b2632015-02-12 14:28:54 -0800247
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700248Commands
249--------
250
Elliott Hughes91a3be52015-03-20 11:00:15 -0700251bootchart_init
252 Start bootcharting if configured (see below).
253 This is included in the default init.rc.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700254
255chmod <octal-mode> <path>
256 Change file access permissions.
257
258chown <owner> <group> <path>
259 Change file owner and group.
260
261class_start <serviceclass>
262 Start all services of the specified class if they are
263 not already running.
264
265class_stop <serviceclass>
Elliott Hughes91a3be52015-03-20 11:00:15 -0700266 Stop and disable all services of the specified class if they are
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700267 currently running.
268
Elliott Hughes91a3be52015-03-20 11:00:15 -0700269class_reset <serviceclass>
270 Stop all services of the specified class if they are
271 currently running, without disabling them. They can be restarted
272 later using class_start.
273
274copy <src> <dst>
275 Copies a file. Similar to write, but useful for binary/large
276 amounts of data.
277
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700278domainname <name>
279 Set the domain name.
280
JP Abgrall3beec7e2014-05-02 21:14:29 -0700281enable <servicename>
282 Turns a disabled service into an enabled one as if the service did not
283 specify disabled.
284 If the service is supposed to be running, it will be started now.
285 Typically used when the bootloader sets a variable that indicates a specific
286 service should be started when needed. E.g.
287 on property:ro.boot.myfancyhardware=1
288 enable my_fancy_service_for_my_fancy_hardware
289
Elliott Hughes91a3be52015-03-20 11:00:15 -0700290exec [ <seclabel> [ <user> [ <group> ]* ] ] -- <command> [ <argument> ]*
291 Fork and execute command with the given arguments. The command starts
292 after "--" so that an optional security context, user, and supplementary
293 groups can be provided. No other commands will be run until this one
Mark Salyzyn17fff892015-06-02 11:11:02 -0700294 finishes. <seclabel> can be a - to denote default.
Elliott Hughes91a3be52015-03-20 11:00:15 -0700295
Elliott Hughes91a3be52015-03-20 11:00:15 -0700296export <name> <value>
297 Set the environment variable <name> equal to <value> in the
298 global environment (which will be inherited by all processes
299 started after this command is executed)
300
301hostname <name>
302 Set the host name.
303
304ifup <interface>
305 Bring the network interface <interface> online.
306
Hung-ying Tyanbfa6d752016-05-17 18:49:10 +0800307insmod [-f] <path> [<options>]
308 Install the module at <path> with the specified options.
309 -f
310 Force installation of the module even if the version of the running kernel
311 and the version of the kernel for which the module was compiled do not match.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700312
Elliott Hughes91a3be52015-03-20 11:00:15 -0700313load_all_props
314 Loads properties from /system, /vendor, et cetera.
315 This is included in the default init.rc.
316
317load_persist_props
318 Loads persistent properties when /data has been decrypted.
319 This is included in the default init.rc.
320
Elliott Hughesf682b472015-02-06 12:19:48 -0800321loglevel <level>
322 Sets the kernel log level to level. Properties are expanded within <level>.
323
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700324mkdir <path> [mode] [owner] [group]
325 Create a directory at <path>, optionally with the given mode, owner, and
326 group. If not provided, the directory is created with permissions 755 and
Johan Redestig0b42ba22015-03-15 17:39:41 +0100327 owned by the root user and root group. If provided, the mode, owner and group
328 will be updated if the directory exists already.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700329
Wei Wang254f4432016-08-23 11:58:09 -0700330mount_all <fstab> [ <path> ]* [--<option>]
Hung-ying Tyandc738ea2016-01-14 11:18:21 +0800331 Calls fs_mgr_mount_all on the given fs_mgr-format fstab and imports .rc files
Wei Wang254f4432016-08-23 11:58:09 -0700332 at the specified paths (e.g., on the partitions just mounted) with optional
333 options "early" and "late".
334 Refer to the section of "Init .rc Files" for detail.
Elliott Hughes91a3be52015-03-20 11:00:15 -0700335
Niklas Tibblingbc3f69f2012-08-01 13:15:38 +0200336mount <type> <device> <dir> [ <flag> ]* [<options>]
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700337 Attempt to mount the named device at the directory <dir>
Niklas Tibblingbc3f69f2012-08-01 13:15:38 +0200338 <flag>s include "ro", "rw", "remount", "noatime", ...
339 <options> include "barrier=1", "noauto_da_alloc", "discard", ... as
340 a comma separated string, eg: barrier=1,noauto_da_alloc
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700341
Elliott Hughes91a3be52015-03-20 11:00:15 -0700342powerctl
343 Internal implementation detail used to respond to changes to the
344 "sys.powerctl" system property, used to implement rebooting.
345
346restart <service>
347 Like stop, but doesn't disable the service.
348
Stephen Smalley726e8f72013-10-09 16:02:09 -0400349restorecon <path> [ <path> ]*
Stephen Smalley3fb61102012-11-02 15:22:34 -0400350 Restore the file named by <path> to the security context specified
351 in the file_contexts configuration.
352 Not required for directories created by the init.rc as these are
353 automatically labeled correctly by init.
354
Stephen Smalley726e8f72013-10-09 16:02:09 -0400355restorecon_recursive <path> [ <path> ]*
356 Recursively restore the directory tree named by <path> to the
357 security contexts specified in the file_contexts configuration.
Stephen Smalley726e8f72013-10-09 16:02:09 -0400358
Elliott Hughes91a3be52015-03-20 11:00:15 -0700359rm <path>
360 Calls unlink(2) on the given path. You might want to
361 use "exec -- rm ..." instead (provided the system partition is
362 already mounted).
363
364rmdir <path>
365 Calls rmdir(2) on the given path.
366
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700367setprop <name> <value>
Elliott Hughesf682b472015-02-06 12:19:48 -0800368 Set system property <name> to <value>. Properties are expanded
369 within <value>.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700370
371setrlimit <resource> <cur> <max>
372 Set the rlimit for a resource.
373
374start <service>
375 Start a service running if it is not already running.
376
377stop <service>
378 Stop a service from running if it is currently running.
379
Elliott Hughes91a3be52015-03-20 11:00:15 -0700380swapon_all <fstab>
381 Calls fs_mgr_swapon_all on the given fstab file.
382
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700383symlink <target> <path>
384 Create a symbolic link at <path> with the value <target>
385
The Android Open Source Project35237d12008-12-17 18:08:08 -0800386sysclktz <mins_west_of_gmt>
387 Set the system clock base (0 if system clock ticks in GMT)
388
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700389trigger <event>
390 Trigger an event. Used to queue an action from another
391 action.
392
Elliott Hughes91a3be52015-03-20 11:00:15 -0700393verity_load_state
394 Internal implementation detail used to load dm-verity state.
395
396verity_update_state <mount_point>
397 Internal implementation detail used to update dm-verity state and
398 set the partition.<mount_point>.verified properties used by adb remount
399 because fs_mgr can't set them directly itself.
400
Patrick McCormick96d0a4d2011-02-04 10:51:39 -0800401wait <path> [ <timeout> ]
Elliott Hughes91a3be52015-03-20 11:00:15 -0700402 Poll for the existence of the given file and return when found,
403 or the timeout has been reached. If timeout is not specified it
404 currently defaults to five seconds.
Patrick McCormick96d0a4d2011-02-04 10:51:39 -0800405
Elliott Hughesf682b472015-02-06 12:19:48 -0800406write <path> <content>
407 Open the file at <path> and write a string to it with write(2).
408 If the file does not exist, it will be created. If it does exist,
409 it will be truncated. Properties are expanded within <content>.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700410
411
Tom Cherry3be66ed2015-09-01 14:49:38 -0700412Imports
413-------
414The import keyword is not a command, but rather its own section and is
415handled immediately after the .rc file that contains it has finished
416being parsed. It takes the below form:
417
418import <path>
419 Parse an init config file, extending the current configuration.
420 If <path> is a directory, each file in the directory is parsed as
421 a config file. It is not recursive, nested directories will
422 not be parsed.
423
424There are only two times where the init executable imports .rc files,
425 1) When it imports /init.rc during initial boot
Hung-ying Tyandc738ea2016-01-14 11:18:21 +0800426 2) When it imports /{system,vendor,odm}/etc/init/ or .rc files at specified
427 paths during mount_all
Tom Cherry3be66ed2015-09-01 14:49:38 -0700428
429
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700430Properties
431----------
Tom Cherry3be66ed2015-09-01 14:49:38 -0700432Init provides information about the services that it is responsible
433for via the below properties.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700434
435init.svc.<name>
Tom Cherry3be66ed2015-09-01 14:49:38 -0700436 State of a named service ("stopped", "stopping", "running", "restarting")
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700437
438
Elliott Hughes841b2632015-02-12 14:28:54 -0800439Bootcharting
440------------
Elliott Hughes841b2632015-02-12 14:28:54 -0800441This version of init contains code to perform "bootcharting": generating log
442files that can be later processed by the tools provided by www.bootchart.org.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700443
Elliott Hughes59abac22015-03-28 12:12:51 -0700444On the emulator, use the -bootchart <timeout> option to boot with bootcharting
445activated for <timeout> seconds.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700446
Elliott Hughes841b2632015-02-12 14:28:54 -0800447On a device, create /data/bootchart/start with a command like the following:
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700448
Elliott Hughes841b2632015-02-12 14:28:54 -0800449 adb shell 'echo $TIMEOUT > /data/bootchart/start'
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700450
Elliott Hughes841b2632015-02-12 14:28:54 -0800451Where the value of $TIMEOUT corresponds to the desired bootcharted period in
452seconds. Bootcharting will stop after that many seconds have elapsed.
453You can also stop the bootcharting at any moment by doing the following:
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700454
Elliott Hughes841b2632015-02-12 14:28:54 -0800455 adb shell 'echo 1 > /data/bootchart/stop'
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700456
Elliott Hughes841b2632015-02-12 14:28:54 -0800457Note that /data/bootchart/stop is deleted automatically by init at the end of
458the bootcharting. This is not the case with /data/bootchart/start, so don't
459forget to delete it when you're done collecting data.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700460
Elliott Hughes841b2632015-02-12 14:28:54 -0800461The log files are written to /data/bootchart/. A script is provided to
462retrieve them and create a bootchart.tgz file that can be used with the
463bootchart command-line utility:
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700464
Elliott Hughes841b2632015-02-12 14:28:54 -0800465 sudo apt-get install pybootchartgui
Elliott Hughes59abac22015-03-28 12:12:51 -0700466 # grab-bootchart.sh uses $ANDROID_SERIAL.
Elliott Hughes841b2632015-02-12 14:28:54 -0800467 $ANDROID_BUILD_TOP/system/core/init/grab-bootchart.sh
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700468
Elliott Hughes59abac22015-03-28 12:12:51 -0700469One thing to watch for is that the bootchart will show init as if it started
470running at 0s. You'll have to look at dmesg to work out when the kernel
471actually started init.
472
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700473
Ben Cheng50bbde02015-06-09 17:04:36 +0800474Comparing two bootcharts
475------------------------
476A handy script named compare-bootcharts.py can be used to compare the
477start/end time of selected processes. The aforementioned grab-bootchart.sh
478will leave a bootchart tarball named bootchart.tgz at /tmp/android-bootchart.
479If two such barballs are preserved on the host machine under different
480directories, the script can list the timestamps differences. For example:
481
482Usage: system/core/init/compare-bootcharts.py base_bootchart_dir
483 exp_bootchart_dir
484
485process: baseline experiment (delta)
486 - Unit is ms (a jiffy is 10 ms on the system)
487------------------------------------
488/init: 50 40 (-10)
489/system/bin/surfaceflinger: 4320 4470 (+150)
490/system/bin/bootanimation: 6980 6990 (+10)
491zygote64: 10410 10640 (+230)
492zygote: 10410 10640 (+230)
493system_server: 15350 15150 (-200)
494bootanimation ends at: 33790 31230 (-2560)
495
496
Yasuhiro Matsudaf93db4b2015-06-15 18:49:35 +0900497Systrace
498--------
499Systrace [1] can be used for obtaining performance analysis reports during boot
500time on userdebug or eng builds.
501Here is an example of trace events of "wm" and "am" categories:
502
503 $ANDROID_BUILD_TOP/external/chromium-trace/systrace.py wm am --boot
504
505This command will cause the device to reboot. After the device is rebooted and
506the boot sequence has finished, the trace report is obtained from the device
507and written as trace.html on the host by hitting Ctrl+C.
508
509LIMITATION
510Recording trace events is started after persistent properties are loaded, so
511the trace events that are emitted before that are not recorded. Several
512services such as vold, surfaceflinger, and servicemanager are affected by this
513limitation since they are started before persistent properties are loaded.
514Zygote initialization and the processes that are forked from the zygote are not
515affected.
516
517[1] http://developer.android.com/tools/help/systrace.html
518
519
Elliott Hughes841b2632015-02-12 14:28:54 -0800520Debugging init
521--------------
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700522By default, programs executed by init will drop stdout and stderr into
523/dev/null. To help with debugging, you can execute your program via the
Elliott Hughesf682b472015-02-06 12:19:48 -0800524Android program logwrapper. This will redirect stdout/stderr into the
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700525Android logging system (accessed via logcat).
526
527For example
528service akmd /system/bin/logwrapper /sbin/akmd
Elliott Hughesf682b472015-02-06 12:19:48 -0800529
530For quicker turnaround when working on init itself, use:
531
Elliott Hughes841b2632015-02-12 14:28:54 -0800532 mm -j
Elliott Hughesf682b472015-02-06 12:19:48 -0800533 m ramdisk-nodeps
534 m bootimage-nodeps
535 adb reboot bootloader
536 fastboot boot $ANDROID_PRODUCT_OUT/boot.img
537
538Alternatively, use the emulator:
539
540 emulator -partition-size 1024 -verbose -show-kernel -no-window