Name Date Size #Lines LOC

..--

fuzzer/H25-Apr-2025-523417

libprefetch/prefetch/H25-Apr-2025-5,2644,016

parser/H25-Apr-2025-435301

test_kill_services/H25-Apr-2025-18298

test_service/H25-Apr-2025-166128

test_upgrade_mte/H25-Apr-2025-339254

test_utils/H25-Apr-2025-9741

.clang-formatH A D25-Apr-2025291 1413

Android.bpH A D25-Apr-202516.4 KiB688634

AndroidTest.xmlH A D25-Apr-20252 KiB3821

MODULE_LICENSE_APACHE2HD25-Apr-20250

NOTICEH A D25-Apr-202510.4 KiB191158

OWNERSH A D25-Apr-202562 43

README.mdH A D25-Apr-202548.1 KiB1,096868

README.ueventd.mdH A D25-Apr-202510.8 KiB214167

TEST_MAPPINGH A D25-Apr-2025356 2524

action.cppH A D25-Apr-20258.1 KiB249180

action.hH A D25-Apr-20253.2 KiB10370

action_manager.cppH A D25-Apr-20254.2 KiB13289

action_manager.hH A D25-Apr-20252.1 KiB6840

action_parser.cppH A D25-Apr-20255.9 KiB183129

action_parser.hH A D25-Apr-20251.5 KiB5026

apex_init_util.cppH A D25-Apr-20255.1 KiB159109

apex_init_util.hH A D25-Apr-20251.1 KiB3912

block_dev_initializer.cppH A D25-Apr-20259.6 KiB250154

block_dev_initializer.hH A D25-Apr-20251.6 KiB5227

bootchart.cppH A D25-Apr-20256.8 KiB217146

bootchart.hH A D25-Apr-2025921 3512

builtin_arguments.hH A D25-Apr-20251.1 KiB4017

builtins.cppH A D25-Apr-202546.5 KiB1,3541,084

builtins.hH A D25-Apr-20251.2 KiB4620

capabilities.cppH A D25-Apr-20257 KiB224169

capabilities.hH A D25-Apr-20251.2 KiB4421

check_builtins.cppH A D25-Apr-20257.7 KiB270196

check_builtins.hH A D25-Apr-20252.2 KiB5531

compare-bootcharts.pyH A D25-Apr-20255.4 KiB14789

debug_ramdisk.hH A D25-Apr-2025888 277

devices.cppH A D25-Apr-202530 KiB817576

devices.hH A D25-Apr-20256.8 KiB196138

devices_test.cppH A D25-Apr-202513 KiB333253

epoll.cppH A D25-Apr-20253.6 KiB12189

epoll.hH A D25-Apr-20251.5 KiB6335

epoll_test.cppH A D25-Apr-20252.1 KiB7139

extra_free_kbytes.shH A D25-Apr-20255.1 KiB14959

firmware_handler.cppH A D25-Apr-202510.2 KiB287218

firmware_handler.hH A D25-Apr-20252 KiB6737

firmware_handler_test.cppH A D25-Apr-20254.4 KiB14598

first_stage_console.cppH A D25-Apr-20254.1 KiB145107

first_stage_console.hH A D25-Apr-20251,009 3614

first_stage_init.cppH A D25-Apr-202521.3 KiB576437

first_stage_init.hH A D25-Apr-2025917 298

first_stage_main.cppH A D25-Apr-2025742 224

first_stage_mount.cppH A D25-Apr-202534.5 KiB980741

first_stage_mount.hH A D25-Apr-20251.2 KiB4517

fscrypt_init_extensions.cppH A D25-Apr-20254.5 KiB138105

fscrypt_init_extensions.hH A D25-Apr-2025890 3010

grab-bootchart.shH A D25-Apr-2025626 2313

host_builtin_map.pyH A D25-Apr-20251.4 KiB4637

host_import_parser.cppH A D25-Apr-20251.2 KiB4117

host_import_parser.hH A D25-Apr-20251 KiB3614

host_init_stubs.hH A D25-Apr-20251.6 KiB6733

host_init_verifier.cppH A D25-Apr-202511.8 KiB344277

import_parser.cppH A D25-Apr-20251.7 KiB5731

import_parser.hH A D25-Apr-20251.4 KiB4822

init.cppH A D25-Apr-202541.3 KiB1,148880

init.hH A D25-Apr-20251.5 KiB5322

init_test.cppH A D25-Apr-202525 KiB803641

interface_utils.cppH A D25-Apr-20254.4 KiB12489

interface_utils.hH A D25-Apr-20251.7 KiB4916

interprocess_fifo.cppH A D25-Apr-20252.3 KiB9765

interprocess_fifo.hH A D25-Apr-20251.6 KiB5327

interprocess_fifo_test.cppH A D25-Apr-20251.5 KiB5431

keychords.cppH A D25-Apr-20258.5 KiB294240

keychords.hH A D25-Apr-20252.4 KiB10059

keychords_test.cppH A D25-Apr-20259.5 KiB348262

keyword_map.hH A D25-Apr-20252.9 KiB8848

lmkd_service.cppH A D25-Apr-20253.8 KiB13288

lmkd_service.hH A D25-Apr-20251.3 KiB4517

main.cppH A D25-Apr-20252.7 KiB8451

modalias_handler.cppH A D25-Apr-20251 KiB3714

modalias_handler.hH A D25-Apr-20251.1 KiB4318

mount_handler.cppH A D25-Apr-20257.2 KiB210155

mount_handler.hH A D25-Apr-20251.6 KiB6032

mount_namespace.cppH A D25-Apr-20259.9 KiB244126

mount_namespace.hH A D25-Apr-20251,015 3611

noop_builtins.cppH A D25-Apr-2025941 339

oneshot_on_test.cppH A D25-Apr-20251.7 KiB5020

parser.cppH A D25-Apr-20256.8 KiB199148

parser.hH A D25-Apr-20253.5 KiB9738

perfboot.pyH A D25-Apr-202515.9 KiB463352

persistent_properties.cppH A D25-Apr-202512.4 KiB327250

persistent_properties.hH A D25-Apr-20251.3 KiB4116

persistent_properties.protoH A D25-Apr-2025879 2824

persistent_properties_test.cppH A D25-Apr-20258.8 KiB243175

property_service.cppH A D25-Apr-202558.4 KiB1,5801,217

property_service.hH A D25-Apr-20251.1 KiB4418

property_service.protoH A D25-Apr-20251.2 KiB4640

property_service_test.cppH A D25-Apr-20254.7 KiB12286

property_type.cppH A D25-Apr-20252.4 KiB8762

property_type.hH A D25-Apr-2025867 319

property_type_test.cppH A D25-Apr-20253.4 KiB9667

proto_utils.hH A D25-Apr-20251.8 KiB6336

reboot.cppH A D25-Apr-202536.4 KiB951713

reboot.hH A D25-Apr-20251.2 KiB3914

reboot_test.cppH A D25-Apr-20256.2 KiB196150

reboot_utils.cppH A D25-Apr-20257.7 KiB209144

reboot_utils.hH A D25-Apr-20251.4 KiB3914

result.hH A D25-Apr-2025933 286

rlimit_parser.cppH A D25-Apr-20253.3 KiB9161

rlimit_parser.hH A D25-Apr-2025941 3612

rlimit_parser_test.cppH A D25-Apr-20257.1 KiB151117

second_stage_resources.hH A D25-Apr-20251,007 3311

security.cppH A D25-Apr-20258.2 KiB235133

security.hH A D25-Apr-20251 KiB3714

selabel.cppH A D25-Apr-20252.5 KiB8042

selabel.hH A D25-Apr-20251.1 KiB3312

selinux.cppH A D25-Apr-202528.2 KiB754529

selinux.hH A D25-Apr-20251.4 KiB4110

service.cppH A D25-Apr-202537 KiB1,027772

service.hH A D25-Apr-20259.9 KiB252183

service_list.cppH A D25-Apr-20252.9 KiB9665

service_list.hH A D25-Apr-20252.9 KiB9963

service_parser.cppH A D25-Apr-202526.7 KiB729588

service_parser.hH A D25-Apr-20254.1 KiB9165

service_test.cppH A D25-Apr-20259.7 KiB285224

service_utils.cppH A D25-Apr-202511.8 KiB346255

service_utils.hH A D25-Apr-20253.1 KiB11369

sigchld_handler.cppH A D25-Apr-20256.6 KiB196150

sigchld_handler.hH A D25-Apr-20251,003 3613

snapuserd_transition.cppH A D25-Apr-202514.3 KiB443316

snapuserd_transition.hH A D25-Apr-20252.8 KiB9236

subcontext.cppH A D25-Apr-202512.9 KiB395308

subcontext.hH A D25-Apr-20252.5 KiB8151

subcontext.protoH A D25-Apr-20251.3 KiB4338

subcontext_benchmark.cppH A D25-Apr-20252.1 KiB7244

subcontext_test.cppH A D25-Apr-20258.4 KiB259193

switch_root.cppH A D25-Apr-20252.9 KiB10161

switch_root.hH A D25-Apr-2025784 287

tokenizer.cppH A D25-Apr-20252.9 KiB133120

tokenizer.hH A D25-Apr-2025954 4118

tokenizer_test.cppH A D25-Apr-20255.5 KiB165102

uevent.hH A D25-Apr-20251.1 KiB4422

uevent_handler.hH A D25-Apr-2025909 3512

uevent_listener.cppH A D25-Apr-20257.7 KiB236172

uevent_listener.hH A D25-Apr-20252.1 KiB6937

ueventd.cppH A D25-Apr-202516.4 KiB415247

ueventd.hH A D25-Apr-2025805 298

ueventd_parser.cppH A D25-Apr-202510.8 KiB304228

ueventd_parser.hH A D25-Apr-20251.4 KiB4522

ueventd_parser_test.cppH A D25-Apr-202514.6 KiB439337

ueventd_test.cppH A D25-Apr-20256.3 KiB200151

util.cppH A D25-Apr-202527.9 KiB846649

util.hH A D25-Apr-20253.9 KiB12774

util_test.cppH A D25-Apr-20256.4 KiB188148

README.md

1Android Init Language
2---------------------
3
4The Android Init Language consists of five broad classes of statements:
5Actions, Commands, Services, Options, and Imports.
6
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
15System properties can be expanded using the syntax
16`${property.name}`. This also works in contexts where concatenation is
17required, such as `import /init.recovery.${ro.hardware}.rc`.
18
19Actions and Services implicitly declare a new section.  All commands
20or options belong to the section most recently declared.  Commands
21or options before the first section are ignored.
22
23Services have unique names.  If a second Service is defined
24with the same name as an existing one, it is ignored and an error
25message is logged.
26
27
28Init .rc Files
29--------------
30The init language is used in plain text files that take the .rc file
31extension.  There are typically multiple of these in multiple
32locations on the system, described below.
33
34`/system/etc/init/hw/init.rc` is the primary .rc file and is loaded by the init executable at the
35beginning of its execution.  It is responsible for the initial set up of the system.
36
37Init loads all of the files contained within the
38`/{system,system_ext,vendor,odm,product}/etc/init/` directories immediately after loading
39the primary `/system/etc/init/hw/init.rc`.  This is explained in more details in the
40[Imports](#imports) section of this file.
41
42Legacy devices without the first stage mount mechanism previously were
43able to import init scripts during mount_all, however that is deprecated
44and not allowed for devices launching after Q.
45
46The intention of these directories is:
47
48   1. /system/etc/init/ is for core system items such as
49      SurfaceFlinger, MediaService, and logd.
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
56All 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 userdebug 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.
79
80Versioned RC files within APEXs
81-------------------------------
82
83With the arrival of mainline on Android Q, the individual mainline
84modules carry their own init.rc files within their boundaries. Init
85processes these files according to the naming pattern `/apex/*/etc/*rc`.
86
87Because APEX modules must run on more than one release of Android,
88they may require different parameters as part of the services they
89define. This is achieved, starting in Android T, by incorporating
90the SDK version information in the name of the init file.  The suffix
91is changed from `.rc` to `.#rc` where # is the first SDK where that
92RC file is accepted. An init file specific to SDK=31 might be named
93`init.31rc`. With this scheme, an APEX may include multiple init files. An
94example is appropriate.
95
96For an APEX module with the following files in /apex/sample-module/apex/etc/:
97
98   1. init.rc
99   2. init.32rc
100   4. init.35rc
101
102The selection rule chooses the highest `.#rc` value that does not
103exceed the SDK of the currently running system. The unadorned `.rc`
104is interpreted as sdk=0.
105
106When this APEX is installed on a device with SDK <=31, the system will
107process init.rc.  When installed on a device running SDK 32, 33, or 34,
108it will use init.32rc.  When installed on a device running SDKs >= 35,
109it will choose init.35rc
110
111This versioning scheme is used only for the init files within APEX
112modules; it does not apply to the init files stored in /system/etc/init,
113/vendor/etc/init, or other directories.
114
115This naming scheme is available after Android S.
116
117Actions
118-------
119Actions are named sequences of commands.  Actions have a trigger which
120is used to determine when the action is executed.  When an event
121occurs which matches an action's trigger, that action is added to
122the tail of a to-be-executed queue (unless it is already on the
123queue).
124
125Each action in the queue is dequeued in sequence and each command in
126that action is executed in sequence.  Init handles other activities
127(device creation/destruction, property setting, process restarting)
128"between" the execution of the commands in activities.
129
130Actions take the form of:
131
132    on <trigger> [&& <trigger>]*
133       <command>
134       <command>
135       <command>
136
137Actions are added to the queue and executed based on the order that
138the file that contains them was parsed (see the Imports section), then
139sequentially within an individual file.
140
141For example if a file contains:
142
143    on boot
144       setprop a 1
145       setprop b 2
146
147    on boot && property:true=true
148       setprop c 1
149       setprop d 2
150
151    on boot
152       setprop e 1
153       setprop f 2
154
155Then when the `boot` trigger occurs and assuming the property `true`
156equals `true`, then the order of the commands executed will be:
157
158    setprop a 1
159    setprop b 2
160    setprop c 1
161    setprop d 2
162    setprop e 1
163    setprop f 2
164
165If the property `true` wasn't `true` when the `boot` was triggered, then the
166order of the commands executed will be:
167
168    setprop a 1
169    setprop b 2
170    setprop e 1
171    setprop f 2
172
173If the property `true` becomes `true` *AFTER* `boot` was triggered, nothing will
174be executed. The condition `boot && property:true=true` will be evaluated to
175false because the `boot` trigger is a past event.
176
177Note that when `ro.property_service.async_persist_writes` is `true`, there is no
178defined ordering between persistent setprops and non-persistent setprops. For
179example:
180
181    on boot
182        setprop a 1
183        setprop persist.b 2
184
185When `ro.property_service.async_persist_writes` is `true`, triggers for these
186two properties may execute in any order.
187
188Services
189--------
190Services are programs which init launches and (optionally) restarts
191when they exit.  Services take the form of:
192
193    service <name> <pathname> [ <argument> ]*
194       <option>
195       <option>
196       ...
197
198
199Options
200-------
201Options are modifiers to services.  They affect how and when init
202runs the service.
203
204`capabilities [ <capability>\* ]`
205> Set capabilities when exec'ing this service. 'capability' should be a Linux
206  capability without the "CAP\_" prefix, like "NET\_ADMIN" or "SETPCAP". See
207  http://man7.org/linux/man-pages/man7/capabilities.7.html for a list of Linux
208  capabilities.
209  If no capabilities are provided, then behaviour depends on the user the service runs under:
210    * if it's root, then the service will run with all the capabitilies (note: whether the
211        service can actually use them is controlled by selinux);
212    * otherwise all capabilities will be dropped.
213
214`class <name> [ <name>\* ]`
215> Specify class names for the service.  All services in a
216  named class may be started or stopped together.  A service
217  is in the class "default" if one is not specified via the
218  class option. Additional classnames beyond the (required) first
219  one are used to group services.
220  The `animation` class should include all services necessary for both
221  boot animation and shutdown animation. As these services can be
222  launched very early during bootup and can run until the last stage
223  of shutdown, access to /data partition is not guaranteed. These
224  services can check files under /data but it should not keep files opened
225  and should work when /data is not available.
226
227`console [<console>]`
228> This service needs a console. The optional second parameter chooses a
229  specific console instead of the default. The default "/dev/console" can
230  be changed by setting the "androidboot.console" kernel parameter. In
231  all cases the leading "/dev/" should be omitted, so "/dev/tty0" would be
232  specified as just "console tty0".
233  This option connects stdin, stdout, and stderr to the console. It is mutually exclusive with the
234  stdio_to_kmsg option, which only connects stdout and stderr to kmsg.
235
236`critical [window=<fatal crash window mins>] [target=<fatal reboot target>]`
237> This is a device-critical service. If it exits more than four times in
238  _fatal crash window mins_ minutes or before boot completes, the device
239  will reboot into _fatal reboot target_.
240  The default value of _fatal crash window mins_ is 4, and default value
241  of _fatal reboot target_ is 'bootloader'.
242  For tests, the fatal reboot can be skipped by setting property
243  `init.svc_debug.no_fatal.<service-name>` to `true` for specified critical service.
244
245`disabled`
246> This service will not automatically start with its class.
247  It must be explicitly started by name or by interface name.
248
249`enter_namespace <type> <path>`
250> Enters the namespace of type _type_ located at _path_. Only network namespaces are supported with
251  _type_ set to "net". Note that only one namespace of a given _type_ may be entered.
252
253`file <path> <type>`
254> Open a file path and pass its fd to the launched process. _type_ must be
255  "r", "w" or "rw".  For native executables see libcutils
256  android\_get\_control\_file().
257
258`gentle_kill`
259> This service will be sent SIGTERM instead of SIGKILL when stopped. After a 200 ms timeout, it will
260  be sent SIGKILL.
261
262`group <groupname> [ <groupname>\* ]`
263> Change to 'groupname' before exec'ing this service.  Additional
264  groupnames beyond the (required) first one are used to set the
265  supplemental groups of the process (via setgroups()).
266  Currently defaults to root.  (??? probably should default to nobody)
267
268`interface <interface name> <instance name>`
269> Associates this service with a list of the AIDL or HIDL services that it provides. The interface
270  name must be a fully-qualified name and not a value name. For instance, this is used to allow
271  servicemanager or hwservicemanager to lazily start services. When multiple interfaces are served,
272  this tag should be used multiple times. An example of an entry for a HIDL
273  interface is `interface [email protected]::IBaz default`. For an AIDL interface, use
274  `interface aidl <instance name>`. The instance name for an AIDL interface is
275  whatever is registered with servicemanager, and these can be listed with `adb
276  shell dumpsys -l`.
277
278`ioprio <class> <priority>`
279> Sets the IO priority and IO priority class for this service via the SYS_ioprio_set syscall.
280  _class_ must be one of "rt", "be", or "idle". _priority_ must be an integer in the range 0 - 7.
281
282`keycodes <keycode> [ <keycode>\* ]`
283> Sets the keycodes that will trigger this service. If all of the keys corresponding to the passed
284  keycodes are pressed at once, the service will start. This is typically used to start the
285  bugreport service.
286
287> This option may take a property instead of a list of keycodes. In this case, only one option is
288  provided: the property name in the typical property expansion format. The property must contain
289  a comma separated list of keycode values or the text 'none' to indicate that
290  this service does not respond to keycodes.
291
292> For example, `keycodes ${some.property.name:-none}` where some.property.name expands
293  to "123,124,125". Since keycodes are handled very early in init,
294  only PRODUCT_DEFAULT_PROPERTY_OVERRIDES properties can be used.
295
296`memcg.limit_in_bytes <value>` and `memcg.limit_percent <value>`
297> Sets the child's memory.limit_in_bytes to the minimum of `limit_in_bytes`
298  bytes and `limit_percent` which is interpreted as a percentage of the size
299  of the device's physical memory (only if memcg is mounted).
300  Values must be equal or greater than 0.
301
302`memcg.limit_property <value>`
303> Sets the child's memory.limit_in_bytes to the value of the specified property
304  (only if memcg is mounted). This property will override the values specified
305  via `memcg.limit_in_bytes` and `memcg.limit_percent`.
306
307`memcg.soft_limit_in_bytes <value>`
308> Sets the child's memory.soft_limit_in_bytes to the specified value (only if memcg is mounted),
309  which must be equal or greater than 0.
310
311`memcg.swappiness <value>`
312> Sets the child's memory.swappiness to the specified value (only if memcg is mounted),
313  which must be equal or greater than 0.
314
315`namespace <pid|mnt>`
316> Enter a new PID or mount namespace when forking the service.
317
318`oneshot`
319> Do not restart the service when it exits.
320
321`onrestart`
322> Execute a Command (see below) when service restarts.
323
324`oom_score_adjust <value>`
325> Sets the child's /proc/self/oom\_score\_adj to the specified value,
326  which must range from -1000 to 1000.
327
328`override`
329> Indicates that this service definition is meant to override a previous definition for a service
330  with the same name. This is typically meant for services on /odm to override those defined on
331  /vendor. The last service definition that init parses with this keyword is the service definition
332  will use for this service. Pay close attention to the order in which init.rc files are parsed,
333  since it has some peculiarities for backwards compatibility reasons. The 'imports' section of
334  this file has more details on the order.
335
336`priority <priority>`
337> Scheduling priority of the service process. This value has to be in range
338  -20 to 19. Default priority is 0. Priority is set via setpriority().
339
340`reboot_on_failure <target>`
341> If this process cannot be started or if the process terminates with an exit code other than
342  CLD_EXITED or an status other than '0', reboot the system with the target specified in
343  _target_. _target_ takes the same format as the parameter to sys.powerctl. This is particularly
344  intended to be used with the `exec_start` builtin for any must-have checks during boot.
345
346`restart_period <seconds>`
347> If a non-oneshot service exits, it will be restarted at its previous start time plus this period.
348  The default value is 5s. This can be used to implement periodic services together with the
349  `timeout_period` command below. For example, it may be set to 3600 to indicate that the service
350  should run every hour or 86400 to indicate that the service should run every day. This can be set
351  to a value shorter than 5s for example 0, but the minimum 5s delay is enforced if the restart was
352  due to a crash. This is to rate limit persistentally crashing services. In other words,
353  `<seconds>` smaller than 5 is respected only when the service exits deliverately and successfully
354  (i.e. by calling exit(0)).
355
356`rlimit <resource> <cur> <max>`
357> This applies the given rlimit to the service. rlimits are inherited by child
358  processes, so this effectively applies the given rlimit to the process tree
359  started by this service.
360  It is parsed similarly to the setrlimit command specified below.
361
362`seclabel <seclabel>`
363> Change to 'seclabel' before exec'ing this service.
364  Primarily for use by services run from the rootfs, e.g. ueventd, adbd.
365  Services on the system partition can instead use policy-defined transitions
366  based on their file security context.
367  If not specified and no transition is defined in policy, defaults to the init context.
368
369`setenv <name> <value>`
370> Set the environment variable _name_ to _value_ in the launched process.
371
372`shutdown <shutdown_behavior>`
373> Set shutdown behavior of the service process. When this is not specified,
374  the service is killed during shutdown process by using SIGTERM and SIGKILL.
375  The service with shutdown_behavior of "critical" is not killed during shutdown
376  until shutdown times out. When shutdown times out, even services tagged with
377  "shutdown critical" will be killed. When the service tagged with "shutdown critical"
378  is not running when shut down starts, it will be started.
379
380`sigstop`
381> Send SIGSTOP to the service immediately before exec is called. This is intended for debugging.
382  See the below section on debugging for how this can be used.
383
384`socket <name> <type> <perm> [ <user> [ <group> [ <seclabel> ] ] ]`
385> Create a UNIX domain socket named /dev/socket/_name_ and pass its fd to the
386  launched process.  The socket is created synchronously when the service starts.
387  _type_ must be "dgram", "stream" or "seqpacket".  _type_ may end with "+passcred"
388  to enable SO_PASSCRED on the socket or "+listen" to synchronously make it a listening socket.
389  User and group default to 0.  'seclabel' is the SELinux security context for the
390  socket.  It defaults to the service security context, as specified by
391  seclabel or computed based on the service executable file security context.
392  For native executables see libcutils android\_get\_control\_socket().
393
394`stdio_to_kmsg`
395> Redirect stdout and stderr to /dev/kmsg_debug. This is useful for services that do not use native
396  Android logging during early boot and whose logs messages we want to capture. This is only enabled
397  when /dev/kmsg_debug is enabled, which is only enabled on userdebug and eng builds.
398  This is mutually exclusive with the console option, which additionally connects stdin to the
399  given console.
400
401`task_profiles <profile> [ <profile>\* ]`
402> Set task profiles. Before Android U, the profiles are applied to the main thread of the service.
403  For Android U and later, the profiles are applied to the entire service process. This is designed
404  to replace the use of writepid option for moving a process into a cgroup.
405
406`timeout_period <seconds>`
407> Provide a timeout after which point the service will be killed. The oneshot keyword is respected
408  here, so oneshot services do not automatically restart, however all other services will.
409  This is particularly useful for creating a periodic service combined with the restart_period
410  option described above.
411
412`updatable`
413> Mark that the service can be overridden (via the 'override' option) later in
414  the boot sequence by APEXes. When a service with updatable option is started
415  before APEXes are all activated, the execution is delayed until the activation
416  is finished. A service that is not marked as updatable cannot be overridden by
417  APEXes.
418
419`user <username>`
420> Change to 'username' before exec'ing this service.
421  Currently defaults to root.  (??? probably should default to nobody)
422  As of Android M, processes should use this option even if they
423  require Linux capabilities.  Previously, to acquire Linux
424  capabilities, a process would need to run as root, request the
425  capabilities, then drop to its desired uid.  There is a new
426  mechanism through fs\_config that allows device manufacturers to add
427  Linux capabilities to specific binaries on a file system that should
428  be used instead. This mechanism is described on
429  <http://source.android.com/devices/tech/config/filesystem.html>.  When
430  using this new mechanism, processes can use the user option to
431  select their desired uid without ever running as root.
432  As of Android O, processes can also request capabilities directly in their .rc
433  files. See the "capabilities" option above.
434
435`writepid <file> [ <file>\* ]`
436> Write the child's pid to the given files when it forks. Meant for
437  cgroup/cpuset usage. If no files under /dev/cpuset/ are specified, but the
438  system property 'ro.cpuset.default' is set to a non-empty cpuset name (e.g.
439  '/foreground'), then the pid is written to file /dev/cpuset/_cpuset\_name_/tasks.
440  The use of this option for moving a process into a cgroup is obsolete. Please
441  use task_profiles option instead.
442
443
444Triggers
445--------
446Triggers are strings which can be used to match certain kinds of
447events and used to cause an action to occur.
448
449Triggers are subdivided into event triggers and property triggers.
450
451Event triggers are strings triggered by the 'trigger' command or by
452the QueueEventTrigger() function within the init executable.  These
453take the form of a simple string such as 'boot' or 'late-init'.
454
455Property triggers are strings triggered when a named property changes
456value to a given new value or when a named property changes value to
457any new value.  These take the form of 'property:<name>=<value>' and
458'property:<name>=\*' respectively.  Property triggers are additionally
459evaluated and triggered accordingly during the initial boot phase of
460init.
461
462An Action can have multiple property triggers but may only have one
463event trigger.
464
465For example:
466`on boot && property:a=b` defines an action that is only executed when
467the 'boot' event trigger happens and the property a equals b at the moment. This
468will NOT be executed when the property a transitions to value b after the `boot`
469event was triggered.
470
471`on property:a=b && property:c=d` defines an action that is executed
472at three times:
473
474   1. During initial boot if property a=b and property c=d.
475   2. Any time that property a transitions to value b, while property c already equals d.
476   3. Any time that property c transitions to value d, while property a already equals b.
477
478
479Trigger Sequence
480----------------
481
482Init uses the following sequence of triggers during early boot. These are the
483built-in triggers defined in init.cpp.
484
485   1. `early-init` - The first in the sequence, triggered after cgroups has been configured
486      but before ueventd's coldboot is complete.
487   2. `init` - Triggered after coldboot is complete.
488   3. `charger` - Triggered if `ro.bootmode == "charger"`.
489   4. `late-init` - Triggered if `ro.bootmode != "charger"`, or via healthd triggering a boot
490      from charging mode.
491
492Remaining triggers are configured in `init.rc` and are not built-in. The default sequence for
493these is specified under the "on late-init" event in `init.rc`. Actions internal to `init.rc`
494have been omitted.
495
496   1. `early-fs` - Start vold.
497   2. `fs` - Vold is up. Mount partitions not marked as first-stage or latemounted.
498   3. `post-fs` - Configure anything dependent on early mounts.
499   4. `late-fs` - Mount partitions marked as latemounted.
500   5. `post-fs-data` - Mount and configure `/data`; set up encryption. `/metadata` is
501      reformatted here if it couldn't mount in first-stage init.
502   6. `post-fs-data-checkpointed` - Triggered when vold has completed committing a checkpoint
503      after an OTA update. Not triggered if checkpointing is not needed or supported.
504   7. `bpf-progs-loaded` - Starts things that want to start ASAP but need eBPF (incl. netd)
505   8. `zygote-start` - Start the zygote.
506   9. `early-boot` - After zygote has started.
507  10. `boot` - After `early-boot` actions have completed.
508
509Commands
510--------
511
512`bootchart [start|stop]`
513> Start/stop bootcharting. These are present in the default init.rc files,
514  but bootcharting is only active if the file /data/bootchart/enabled exists;
515  otherwise bootchart start/stop are no-ops.
516
517`chmod <octal-mode> <path>`
518> Change file access permissions.
519
520`chown <owner> <group> <path>`
521> Change file owner and group.
522
523`class_start <serviceclass>`
524> Start all services of the specified class if they are
525  not already running.  See the start entry for more information on
526  starting services.
527
528`class_stop <serviceclass>`
529> Stop and disable all services of the specified class if they are
530  currently running.
531
532`class_reset <serviceclass>`
533> Stop all services of the specified class if they are
534  currently running, without disabling them. They can be restarted
535  later using `class_start`.
536
537`class_restart [--only-enabled] <serviceclass>`
538> Restarts all services of the specified class. If `--only-enabled` is
539  specified, then disabled services are skipped.
540
541`copy <src> <dst>`
542> Copies a file. Similar to write, but useful for binary/large
543  amounts of data.
544  Regarding to the src file, copying from symbolic link file and world-writable
545  or group-writable files are not allowed.
546  Regarding to the dst file, the default mode created is 0600 if it does not
547  exist. And it will be truncated if dst file is a normal regular file and
548  already exists.
549
550`copy_per_line <src> <dst>`
551> Copies a file line by line. Similar to copy, but useful for dst is a sysfs node
552  that doesn't handle multiple lines of data.
553
554`domainname <name>`
555> Set the domain name.
556
557`enable <servicename>`
558> Turns a disabled service into an enabled one as if the service did not
559  specify disabled.
560  If the service is supposed to be running, it will be started now.
561  Typically used when the bootloader sets a variable that indicates a specific
562  service should be started when needed. E.g.
563
564    on property:ro.boot.myfancyhardware=1
565        enable my_fancy_service_for_my_fancy_hardware
566
567`exec [ <seclabel> [ <user> [ <group>\* ] ] ] -- <command> [ <argument>\* ]`
568> Fork and execute command with the given arguments. The command starts
569  after "--" so that an optional security context, user, and supplementary
570  groups can be provided. No other commands will be run until this one
571  finishes. _seclabel_ can be a - to denote default. Properties are expanded
572  within _argument_.
573  Init halts executing commands until the forked process exits.
574
575`exec_background [ <seclabel> [ <user> [ <group>\* ] ] ] -- <command> [ <argument>\* ]`
576> Fork and execute command with the given arguments. This is handled similarly
577  to the `exec` command. The difference is that init does not halt executing
578  commands until the process exits for `exec_background`.
579
580`exec_start <service>`
581> Start a given service and halt the processing of additional init commands
582  until it returns.  The command functions similarly to the `exec` command,
583  but uses an existing service definition in place of the exec argument vector.
584
585`export <name> <value>`
586> Set the environment variable _name_ equal to _value_ in the
587  global environment (which will be inherited by all processes
588  started after this command is executed)
589
590`hostname <name>`
591> Set the host name.
592
593`ifup <interface>`
594> Bring the network interface _interface_ online.
595
596`insmod [-f] <path> [<options>]`
597> Install the module at _path_ with the specified options.
598  -f: force installation of the module even if the version of the running kernel
599  and the version of the kernel for which the module was compiled do not match.
600
601`interface_start <name>` \
602`interface_restart <name>` \
603`interface_stop <name>`
604> Find the service that provides the interface _name_ if it exists and run the `start`, `restart`,
605or `stop` commands on it respectively.  _name_ may be either a fully qualified HIDL name, in which
606case it is specified as `<interface>/<instance>`, or an AIDL name, in which case it is specified as
607`aidl/<interface>` for example `[email protected]::ISecureElement/eSE1` or
608`aidl/aidl_lazy_test_1`.
609
610> Note that these commands only act on interfaces specified by the `interface` service option, not
611on interfaces registered at runtime.
612
613> Example usage of these commands: \
614`interface_start [email protected]::ISecureElement/eSE1`
615will start the HIDL Service that provides the `[email protected]` and `eSI1`
616instance. \
617`interface_start aidl/aidl_lazy_test_1` will start the AIDL service that
618provides the `aidl_lazy_test_1` interface.
619
620`load_exports <path>`
621> Open the file at _path_ and export global environment variables declared
622  there. Each line must be in the format `export <name> <value>`, as described
623  above.
624
625`load_system_props`
626> (This action is deprecated and no-op.)
627
628`load_persist_props`
629> Loads persistent properties when /data has been decrypted.
630  This is included in the default init.rc.
631
632`loglevel <level>`
633> Sets init's log level to the integer level, from 7 (all logging) to 0
634  (fatal logging only). The numeric values correspond to the kernel log
635  levels, but this command does not affect the kernel log level. Use the
636  `write` command to write to `/proc/sys/kernel/printk` to change that.
637  Properties are expanded within _level_.
638
639`mark_post_data`
640> (This action is deprecated and no-op.)
641
642`mkdir <path> [<mode>] [<owner>] [<group>] [encryption=<action>] [key=<key>]`
643> Create a directory at _path_, optionally with the given mode, owner, and
644  group. If not provided, the directory is created with permissions 755 and
645  owned by the root user and root group. If provided, the mode, owner and group
646  will be updated if the directory exists already.
647  If the directory does not exist, it will receive the security context from
648  the current SELinux policy or its parent if not specified in the policy. If
649  the directory exists, its security context will not be changed (even if
650  different from the policy).
651>
652> _action_ can be one of:
653>  * `None`: take no encryption action; directory will be encrypted if parent is.
654>  * `Require`: encrypt directory, abort boot process if encryption fails
655>  * `Attempt`: try to set an encryption policy, but continue if it fails
656>  * `DeleteIfNecessary`: recursively delete directory if necessary to set
657>  encryption policy.
658>
659> _key_ can be one of:
660>  * `ref`: use the systemwide DE key
661>  * `per_boot_ref`: use the key freshly generated on each boot.
662
663`mount_all [ <fstab> ] [--<option>]`
664> Calls fs\_mgr\_mount\_all on the given fs\_mgr-format fstab with optional
665  options "early" and "late".
666  With "--early" set, the init executable will skip mounting entries with
667  "latemount" flag and triggering fs encryption state event. With "--late" set,
668  init executable will only mount entries with "latemount" flag. By default,
669  no option is set, and mount\_all will process all entries in the given fstab.
670  If the fstab parameter is not specified, fstab.${ro.boot.fstab_suffix},
671  fstab.${ro.hardware} or fstab.${ro.hardware.platform} will be scanned for
672  under /odm/etc, /vendor/etc, or / at runtime, in that order.
673
674`mount <type> <device> <dir> [ <flag>\* ] [<options>]`
675> Attempt to mount the named device at the directory _dir_
676  _flag_s include "ro", "rw", "remount", "noatime", ...
677  _options_ include "barrier=1", "noauto\_da\_alloc", "discard", ... as
678  a comma separated string, e.g. barrier=1,noauto\_da\_alloc
679
680`perform_apex_config [--bootstrap]`
681> Performs tasks after APEXes are mounted. For example, creates data directories
682  for the mounted APEXes, parses config file(s) from them, and updates linker
683  configurations. Intended to be used only once when apexd notifies the mount
684  event by setting `apexd.status` to ready.
685  Use --bootstrap when invoking in the bootstrap mount namespace.
686
687`restart [--only-if-running] <service>`
688> Stops and restarts a running service, does nothing if the service is currently
689  restarting, otherwise, it just starts the service. If "--only-if-running" is
690  specified, the service is only restarted if it is already running.
691
692`restorecon <path> [ <path>\* ]`
693> Restore the file named by _path_ to the security context specified
694  in the file\_contexts configuration.
695  Not required for directories created by the init.rc as these are
696  automatically labeled correctly by init.
697
698`restorecon_recursive <path> [ <path>\* ]`
699> Recursively restore the directory tree named by _path_ to the
700  security contexts specified in the file\_contexts configuration.
701
702`rm <path>`
703> Calls unlink(2) on the given path. You might want to
704  use "exec -- rm ..." instead (provided the system partition is
705  already mounted).
706
707`rmdir <path>`
708> Calls rmdir(2) on the given path.
709
710`readahead <file|dir> [--fully]`
711> Calls readahead(2) on the file or files within given directory.
712  Use option --fully to read the full file content.
713
714`setprop <name> <value>`
715> Set system property _name_ to _value_. Properties are expanded
716  within _value_.
717
718`setrlimit <resource> <cur> <max>`
719> Set the rlimit for a resource. This applies to all processes launched after
720  the limit is set. It is intended to be set early in init and applied globally.
721  _resource_ is best specified using its text representation ('cpu', 'rtio', etc
722  or 'RLIM_CPU', 'RLIM_RTIO', etc). It also may be specified as the int value
723  that the resource enum corresponds to.
724  _cur_ and _max_ can be 'unlimited' or '-1' to indicate an infinite rlimit.
725
726`start <service>`
727> Start a service running if it is not already running.
728  Note that this is _not_ synchronous, and even if it were, there is
729  no guarantee that the operating system's scheduler will execute the
730  service sufficiently to guarantee anything about the service's status.
731  See the `exec_start` command for a synchronous version of `start`.
732
733> This creates an important consequence that if the service offers
734  functionality to other services, such as providing a
735  communication channel, simply starting this service before those
736  services is _not_ sufficient to guarantee that the channel has
737  been set up before those services ask for it.  There must be a
738  separate mechanism to make any such guarantees.
739
740`stop <service>`
741> Stop a service from running if it is currently running.
742
743`swapon_all [ <fstab> ]`
744> Calls fs\_mgr\_swapon\_all on the given fstab file.
745  If the fstab parameter is not specified, fstab.${ro.boot.fstab_suffix},
746  fstab.${ro.hardware} or fstab.${ro.hardware.platform} will be scanned for
747  under /odm/etc, /vendor/etc, or / at runtime, in that order.
748
749`swapoff <path>`
750> Stops swapping to the file or block device specified by path.
751
752`symlink <target> <path>`
753> Create a symbolic link at _path_ with the value _target_
754
755`sysclktz <minutes_west_of_gmt>`
756> Set the system clock base (0 if system clock ticks in GMT)
757
758`trigger <event>`
759> Trigger an event.  Used to queue an action from another
760  action.
761
762`umount <path>`
763> Unmount the filesystem mounted at that path.
764
765`umount_all [ <fstab> ]`
766> Calls fs\_mgr\_umount\_all on the given fstab file.
767  If the fstab parameter is not specified, fstab.${ro.boot.fstab_suffix},
768  fstab.${ro.hardware} or fstab.${ro.hardware.platform} will be scanned for
769  under /odm/etc, /vendor/etc, or / at runtime, in that order.
770
771`verity_update_state`
772> Internal implementation detail used to update dm-verity state and
773  set the partition._mount-point_.verified properties used by adb remount
774  because fs\_mgr can't set them directly itself. This is required since
775  Android 12, because CtsNativeVerifiedBootTestCases will read property
776  "partition.${partition}.verified.hash_alg" to check that sha1 is not used.
777  See https://r.android.com/1546980 for more details.
778
779`wait <path> [ <timeout> ]`
780> Poll for the existence of the given file and return when found,
781  or the timeout has been reached. If timeout is not specified it
782  currently defaults to five seconds. The timeout value can be
783  fractional seconds, specified in floating point notation.
784
785`wait_for_prop <name> <value>`
786> Wait for system property _name_ to be _value_. Properties are expanded
787  within _value_. If property _name_ is already set to _value_, continue
788  immediately.
789
790`write <path> <content>`
791> Open the file at _path_ and write a string to it with write(2).
792  If the file does not exist, it will be created. If it does exist,
793  it will be truncated. Properties are expanded within _content_.
794
795Imports
796-------
797`import <path>`
798> Parse an init config file, extending the current configuration.
799  If _path_ is a directory, each file in the directory is parsed as
800  a config file. It is not recursive, nested directories will
801  not be parsed.
802
803The import keyword is not a command, but rather its own section,
804meaning that it does not happen as part of an Action, but rather,
805imports are handled as a file is being parsed and follow the below logic.
806
807There are only three times where the init executable imports .rc files:
808
809   1. When it imports `/system/etc/init/hw/init.rc` or the script indicated by the property
810      `ro.boot.init_rc` during initial boot.
811   2. When it imports `/{system,system_ext,vendor,odm,product}/etc/init/` immediately after
812      importing `/system/etc/init/hw/init.rc`.
813   3. (Deprecated) When it imports /{system,vendor,odm}/etc/init/ or .rc files
814      at specified paths during mount_all, not allowed for devices launching
815      after Q.
816
817The order that files are imported is a bit complex for legacy reasons.  The below is guaranteed:
818
8191. `/system/etc/init/hw/init.rc` is parsed then recursively each of its imports are
820   parsed.
8212. The contents of `/system/etc/init/` are alphabetized and parsed sequentially, with imports
822   happening recursively after each file is parsed.
8233. Step 2 is repeated for `/system_ext/etc/init`, `/vendor/etc/init`, `/odm/etc/init`,
824   `/product/etc/init`
825
826The below pseudocode may explain this more clearly:
827
828    fn Import(file)
829      Parse(file)
830      for (import : file.imports)
831        Import(import)
832
833    Import(/system/etc/init/hw/init.rc)
834    Directories = [/system/etc/init, /system_ext/etc/init, /vendor/etc/init, /odm/etc/init, /product/etc/init]
835    for (directory : Directories)
836      files = <Alphabetical order of directory's contents>
837      for (file : files)
838        Import(file)
839
840Actions are executed in the order that they are parsed.  For example the `post-fs-data` action(s)
841in `/system/etc/init/hw/init.rc` are always the first `post-fs-data` action(s) to be executed in
842order of how they appear in that file.  Then the `post-fs-data` actions of the imports of
843`/system/etc/init/hw/init.rc` in the order that they're imported, etc.
844
845Properties
846----------
847Init provides state information with the following properties.
848
849`init.svc.<name>`
850> State of a named service ("stopped", "stopping", "running", "restarting")
851
852`dev.mnt.dev.<mount_point>`, `dev.mnt.blk.<mount_point>`, `dev.mnt.rootdisk.<mount_point>`
853> Block device base name associated with a *mount_point*.
854  The *mount_point* has / replaced by . and if referencing the root mount point
855  "/", it will use "/root".
856  `dev.mnt.dev.<mount_point>` indicates a block device attached to filesystems.
857    (e.g., dm-N or sdaN/mmcblk0pN to access `/sys/fs/ext4/${dev.mnt.dev.<mount_point>}/`)
858
859  `dev.mnt.blk.<mount_point>` indicates the disk partition to the above block device.
860    (e.g., sdaN / mmcblk0pN to access `/sys/class/block/${dev.mnt.blk.<mount_point>}/`)
861
862  `dev.mnt.rootdisk.<mount_point>` indicates the root disk to contain the above disk partition.
863    (e.g., sda / mmcblk0 to access `/sys/class/block/${dev.mnt.rootdisk.<mount_point>}/queue`)
864
865Init responds to properties that begin with `ctl.`.  These properties take the format of
866`ctl.[<target>_]<command>` and the _value_ of the system property is used as a parameter.  The
867_target_ is optional and specifies the service option that _value_ is meant to match with.  There is
868only one option for _target_, `interface` which indicates that _value_ will refer to an interface
869that a service provides and not the service name itself.
870
871For example:
872
873`SetProperty("ctl.start", "logd")` will run the `start` command on `logd`.
874
875`SetProperty("ctl.interface_start", "aidl/aidl_lazy_test_1")` will run the `start` command on the
876service that exposes the `aidl aidl_lazy_test_1` interface.
877
878Note that these
879properties are only settable; they will have no value when read.
880
881The _commands_ are listed below.
882
883`start` \
884`restart` \
885`stop` \
886These are equivalent to using the `start`, `restart`, and `stop` commands on the service specified
887by the _value_ of the property.
888
889`oneshot_on` and `oneshot_off` will turn on or off the _oneshot_
890flag for the service specified by the _value_ of the property.  This is
891particularly intended for services that are conditionally lazy HALs.  When
892they are lazy HALs, oneshot must be on, otherwise oneshot should be off.
893
894`sigstop_on` and `sigstop_off` will turn on or off the _sigstop_ feature for the service
895specified by the _value_ of the property.  See the _Debugging init_ section below for more details
896about this feature.
897
898Boot timing
899-----------
900Init records some boot timing information in system properties.
901
902`ro.boottime.init`
903> Time after boot in ns (via the CLOCK\_BOOTTIME clock) at which the first
904  stage of init started.
905
906`ro.boottime.init.first_stage`
907> How long in ns it took to run first stage.
908
909`ro.boottime.init.selinux`
910> How long in ns it took to run SELinux stage.
911
912`ro.boottime.init.modules`
913> How long in ms it took to load kernel modules.
914
915`ro.boottime.init.cold_boot_wait`
916> How long init waited for ueventd's coldboot phase to end.
917
918`ro.boottime.<service-name>`
919> Time after boot in ns (via the CLOCK\_BOOTTIME clock) that the service was
920  first started.
921
922
923Bootcharting
924------------
925This version of init contains code to perform "bootcharting": generating log
926files that can be later processed by the tools provided by <http://www.bootchart.org/>.
927
928On the emulator, use the -bootchart _timeout_ option to boot with bootcharting
929activated for _timeout_ seconds.
930
931On a device:
932
933    adb shell 'touch /data/bootchart/enabled'
934
935Don't forget to delete this file when you're done collecting data!
936
937The log files are written to /data/bootchart/. A script is provided to
938retrieve them and create a bootchart.tgz file that can be used with the
939bootchart command-line utility:
940
941    sudo apt-get install pybootchartgui
942    # grab-bootchart.sh uses $ANDROID_SERIAL.
943    $ANDROID_BUILD_TOP/system/core/init/grab-bootchart.sh
944
945One thing to watch for is that the bootchart will show init as if it started
946running at 0s. You'll have to look at dmesg to work out when the kernel
947actually started init.
948
949
950Comparing two bootcharts
951------------------------
952A handy script named compare-bootcharts.py can be used to compare the
953start/end time of selected processes. The aforementioned grab-bootchart.sh
954will leave a bootchart tarball named bootchart.tgz at /tmp/android-bootchart.
955If two such tarballs are preserved on the host machine under different
956directories, the script can list the timestamps differences. For example:
957
958Usage: system/core/init/compare-bootcharts.py _base-bootchart-dir_ _exp-bootchart-dir_
959
960    process: baseline experiment (delta) - Unit is ms (a jiffy is 10 ms on the system)
961    ------------------------------------
962    /init: 50 40 (-10)
963    /system/bin/surfaceflinger: 4320 4470 (+150)
964    /system/bin/bootanimation: 6980 6990 (+10)
965    zygote64: 10410 10640 (+230)
966    zygote: 10410 10640 (+230)
967    system_server: 15350 15150 (-200)
968    bootanimation ends at: 33790 31230 (-2560)
969
970
971Systrace
972--------
973Systrace (<http://developer.android.com/tools/help/systrace.html>) can be
974used for obtaining performance analysis reports during boot
975time on userdebug or eng builds.
976
977Here is an example of trace events of "wm" and "am" categories:
978
979    $ANDROID_BUILD_TOP/external/chromium-trace/systrace.py \
980          wm am --boot
981
982This command will cause the device to reboot. After the device is rebooted and
983the boot sequence has finished, the trace report is obtained from the device
984and written as trace.html on the host by hitting Ctrl+C.
985
986Limitation: recording trace events is started after persistent properties are loaded, so
987the trace events that are emitted before that are not recorded. Several
988services such as vold, surfaceflinger, and servicemanager are affected by this
989limitation since they are started before persistent properties are loaded.
990Zygote initialization and the processes that are forked from the zygote are not
991affected.
992
993
994Debugging init
995--------------
996When a service starts from init, it may fail to `execv()` the service. This is not typical, and may
997point to an error happening in the linker as the new service is started. The linker in Android
998prints its logs to `logd` and `stderr`, so they are visible in `logcat`. If the error is encountered
999before it is possible to access `logcat`, the `stdio_to_kmsg` service option may be used to direct
1000the logs that the linker prints to `stderr` to `kmsg`, where they can be read via a serial port.
1001
1002Launching init services without init is not recommended as init sets up a significant amount of
1003environment (user, groups, security label, capabilities, etc) that is hard to replicate manually.
1004
1005If it is required to debug a service from its very start, the `sigstop` service option is added.
1006This option will send SIGSTOP to a service immediately before calling exec. This gives a window
1007where developers can attach a debugger, strace, etc before continuing the service with SIGCONT.
1008
1009This flag can also be dynamically controlled via the ctl.sigstop_on and ctl.sigstop_off properties.
1010
1011Below is an example of dynamically debugging logd via the above:
1012
1013    stop logd
1014    setprop ctl.sigstop_on logd
1015    start logd
1016    ps -e | grep logd
1017    > logd          4343     1   18156   1684 do_signal_stop 538280 T init
1018    gdbclient.py -p 4343
1019    b main
1020    c
1021    c
1022    c
1023    > Breakpoint 1, main (argc=1, argv=0x7ff8c9a488) at system/core/logd/main.cpp:427
1024
1025Below is an example of doing the same but with strace
1026
1027    stop logd
1028    setprop ctl.sigstop_on logd
1029    start logd
1030    ps -e | grep logd
1031    > logd          4343     1   18156   1684 do_signal_stop 538280 T init
1032    strace -p 4343
1033
1034    (From a different shell)
1035    kill -SIGCONT 4343
1036
1037    > strace runs
1038
1039Host Init Script Verification
1040-----------------------------
1041
1042Init scripts are checked for correctness during build time. Specifically the below is checked.
1043
10441) Well formatted action, service and import sections, e.g. no actions without a preceding 'on'
1045line, and no extraneous lines after an 'import' statement.
10462) All commands map to a valid keyword and the argument count is within the correct range.
10473) All service options are valid. This is stricter than how commands are checked as the service
1048options' arguments are fully parsed, e.g. UIDs and GIDs must resolve.
1049
1050There are other parts of init scripts that are only parsed at runtime and therefore not checked
1051during build time, among them are the below.
1052
10531) The validity of the arguments of commands, e.g. no checking if file paths actually exist, if
1054SELinux would permit the operation, or if the UIDs and GIDs resolve.
10552) No checking if a service exists or has a valid SELinux domain defined
10563) No checking if a service has not been previously defined in a different init script.
1057
1058Early Init Boot Sequence
1059------------------------
1060The early init boot sequence is broken up into three stages: first stage init, SELinux setup, and
1061second stage init.
1062
1063First stage init is responsible for setting up the bare minimum requirements to load the rest of the
1064system. Specifically this includes mounting /dev, /proc, mounting 'early mount' partitions (which
1065needs to include all partitions that contain system code, for example system and vendor), and moving
1066the system.img mount to / for devices with a ramdisk.
1067
1068Note that in Android Q, system.img always contains TARGET_ROOT_OUT and always is mounted at / by the
1069time first stage init finishes. Android Q will also require dynamic partitions and therefore will
1070require using a ramdisk to boot Android. The recovery ramdisk can be used to boot to Android instead
1071of a dedicated ramdisk as well.
1072
1073First stage init has three variations depending on the device configuration:
10741) For system-as-root devices, first stage init is part of /system/bin/init and a symlink at /init
1075points to /system/bin/init for backwards compatibility. These devices do not need to do anything to
1076mount system.img, since it is by definition already mounted as the rootfs by the kernel.
1077
10782) For devices with a ramdisk, first stage init is a static executable located at /init. These
1079devices mount system.img as /system then perform a switch root operation to move the mount at
1080/system to /. The contents of the ramdisk are freed after mounting has completed.
1081
10823) For devices that use recovery as a ramdisk, first stage init it contained within the shared init
1083located at /init within the recovery ramdisk. These devices first switch root to
1084/first_stage_ramdisk to remove the recovery components from the environment, then proceed the same
1085as 2). Note that the decision to boot normally into Android instead of booting
1086into recovery mode is made if androidboot.force_normal_boot=1 is present in the
1087kernel commandline, or in bootconfig with Android S and later.
1088
1089Once first stage init finishes it execs /system/bin/init with the "selinux_setup" argument. This
1090phase is where SELinux is optionally compiled and loaded onto the system. selinux.cpp contains more
1091information on the specifics of this process.
1092
1093Lastly once that phase finishes, it execs /system/bin/init again with the "second_stage"
1094argument. At this point the main phase of init runs and continues the boot process via the init.rc
1095scripts.
1096

README.ueventd.md

1# Ueventd
2-------
3Ueventd manages `/dev`, sets permissions for `/sys`, and handles firmware uevents. It has default
4behavior described below, along with a scripting language that allows customizing this behavior,
5built on the same parser as init.
6
7Ueventd has one generic customization parameter, the size of rcvbuf_size for the ueventd socket. It
8is customized by the `uevent_socket_rcvbuf_size` parameter, which takes the format of
9
10    uevent_socket_rcvbuf_size <size>
11For example
12
13    uevent_socket_rcvbuf_size 16M
14Sets the uevent socket rcvbuf_size to 16 megabytes.
15
16## Importing configuration files
17--------------------------------
18Ueventd reads /system/etc/ueventd.rc, all other files are imported via the `import` command, which
19takes the format of
20
21    import <path>
22This command parses an ueventd config file, extending the current configuration.  If _path_ is a
23directory, each file in the directory is parsed as a config file. It is not recursive, nested
24directories will not be parsed.  Imported files are parsed after the current file has been parsed.
25
26## /dev
27----
28Ueventd listens to the kernel uevent sockets and creates/deletes nodes in `/dev` based on the
29incoming add/remove uevents. It defaults to using `0600` mode and `root` user/group. It always
30creates the nodes with the SELabel from the current loaded SEPolicy. It has three default behaviors
31for the node path:
32
33  1. Block devices are created as `/dev/block/<basename uevent DEVPATH>`. There are symlinks created
34     to this node at `/dev/block/<type>/<parent device>/<basename uevent DEVPATH>`,
35     `/dev/block/<type>/<parent device>/by-name/<uevent PARTNAME>`, and `/dev/block/by-name/<uevent
36     PARTNAME>` if the device is a boot device.
37  2. USB devices are created as `/dev/<uevent DEVNAME>` if `DEVNAME` was specified for the uevent,
38     otherwise as `/dev/bus/usb/<bus_id>/<device_id>` where `bus_id` is `uevent MINOR / 128 + 1` and
39     `device_id` is `uevent MINOR % 128 + 1`.
40  3. All other devices are created as `/dev/<basename uevent DEVPATH>`
41
42Whether a device is considered a "boot device" is a bit complicated.
43
44 - The recommended way to specify the boot device is to provide the "partition UUID" containing the
45   kernel (or, really, any parition on the boot device) and then boot device is the block device
46   containing that partition. This is passed via `androidboot.boot_part_uuid` which can be provided
47   either via the kernel bootconfig or via the kernel commandline. As an example, you could set
48   `androidboot.boot_part_uuid=12345678-abcd-ef01-0234-6789abcdef01`.
49 - Though using `boot_part_uuid` is preferred, you can also specify the boot device via
50   `androidboot.boot_device` or `androidboot.boot_devices`. These can be passed via the kernel
51   bootconfig or the kernel command line. It is also possible to pass this via device tree by
52   creating a `boot_devices` property in the Android firmware node. In most cases the `boot_device`
53   is the sysfs path (without the `/sys/devices` or `/sys/devices/platform` prefix) to the closest
54   parent of the block device that's on the "platform" bus. As an example, if the block device is
55   `/sys/devices/platform/soc@0/7c4000.mmc/mmc_host/mmc1/mmc1:0001/block/mmcblk1` then the
56   `boot_device` is `soc@0/7c4000.mmc` since we strip off the `/sys/devices/platform` and nothing
57   past the `7c4000.mmc` directory represents a device on the "platform" bus. In the case that none
58   of the parents are on the "platform" bus there are special rules for block devices under PCI
59   and VBD (Virtual Block Device). NOTE: sysfs paths for block devices are not guaranteed to be
60   stable between kernel versions, which is one of the reasons why it is suggested to use
61   `boot_part_uuid` instead of `boot_devices`. ALSO NOTE: If more than one device matches (either
62   because multiple `boot_devices` were listed or because there was more than one block device
63   under the found sysfs directory) and these multiple matching devices provide some of the same
64   named partitions then the behavior is unspecified.
65 - There is a further fallback to determine "boot devices" via the vstab, but providing at least
66   `boot_devices` has been required since Android 12 so this further fallback will not be described
67   here.
68
69The permissions can be modified using a ueventd.rc script and a line that beings with `/dev`. These
70lines take the format of
71
72    devname mode uid gid [options]
73For example
74
75    /dev/null 0666 root root
76When `/dev/null` is created, its mode will be set to `0666`, its user to `root` and its group to
77`root`.
78
79The path can be modified using a ueventd.rc script and a `subsystem` and/or `driver` section.
80There are three options to set for a subsystem or driver: the name, which device name to use,
81and which directory to place the device in. The section takes the below format of
82
83    subsystem <subsystem_name>
84      devname uevent_devname|uevent_devpath
85      [dirname <directory>]
86
87`subsystem_name` is used to match the uevent `SUBSYSTEM` value.
88
89`devname` takes one of three options:
90  1. `uevent_devname` specifies that the name of the node will be the uevent `DEVNAME`
91  2. `uevent_devpath` specifies that the name of the node will be basename uevent `DEVPATH`
92  3. `sys_name` specifies that the name of the node will be the contents of `/sys/DEVPATH/name`
93
94`dirname` is an optional parameter that specifies a directory within `/dev` where the node will be
95created.
96
97For example
98
99    subsystem sound
100      devname uevent_devpath
101      dirname /dev/snd
102indicates that all uevents with `SUBSYSTEM=sound` will create nodes as `/dev/snd/<basename uevent
103DEVPATH>`.
104
105The `driver` section has the exact same structure as a `subsystem` section, but
106will instead match the `DRIVER` value in a `bind`/`unbind` uevent. However, the
107`driver` section will be ignored for block devices.
108
109## /sys
110----
111Ueventd by default takes no action for `/sys`, however it can be instructed to set permissions for
112certain files in `/sys` when matching uevents are generated. This is done using a ueventd.rc script
113and a line that begins with `/sys`. These lines take the format of
114
115    nodename attr mode uid gid [options]
116For example
117
118    /sys/devices/system/cpu/cpu* cpufreq/scaling_max_freq 0664 system system
119When a uevent that matches the pattern `/sys/devices/system/cpu/cpu*` is sent, the matching sysfs
120attribute, `cpufreq/scaling_max_freq`, will have its mode set to `0664`, its user to to `system` and
121its group set to `system`.
122
123## Path matching
124----------------
125The path for a `/dev` or `/sys` entry can contain a `*` anywhere in the path.
1261. If the only `*` appears at the end of the string or if the _options_ parameter is set to
127`no_fnm_pathname`, ueventd matches the entry by `fnmatch(entry_path, incoming_path, 0)`
1282. Otherwise, ueventd matches the entry by `fnmatch(entry_path, incoming_path, FNM_PATHNAME)`
129
130See the [man page for fnmatch](https://www.man7.org/linux/man-pages/man3/fnmatch.3.html) for more
131details.
132
133## Firmware loading
134----------------
135Ueventd by default serves firmware requests by searching through a list of firmware directories
136for a file matching the uevent `FIRMWARE`. It then forks a process to serve this firmware to the
137kernel.
138
139`/apex/*/etc/firmware` is also searched after a list of firmware directories.
140
141The list of firmware directories is customized by a `firmware_directories` line in a ueventd.rc
142file. This line takes the format of
143
144    firmware_directories <firmware_directory> [ <firmware_directory> ]*
145For example
146
147    firmware_directories /etc/firmware/ /odm/firmware/ /vendor/firmware/ /firmware/image/
148Adds those 4 directories, in that order to the list of firmware directories that will be tried by
149ueventd. Note that this option always accumulates to the list; it is not possible to remove previous
150entries.
151
152Ueventd will wait until after `post-fs` in init, to keep retrying before believing the firmwares are
153not present.
154
155The exact firmware file to be served can be customized by running an external program by a
156`external_firmware_handler` line in a ueventd.rc file. This line takes the format of
157
158    external_firmware_handler <devpath> <user [group]> <path to external program>
159
160The handler will be run as the given user, or if a group is provided, as the given user and group.
161
162For example
163
164    external_firmware_handler /devices/leds/red/firmware/coeffs.bin system /vendor/bin/led_coeffs.bin
165Will launch `/vendor/bin/led_coeffs.bin` as the system user instead of serving the default firmware
166for `/devices/leds/red/firmware/coeffs.bin`.
167
168The `devpath` argument may include asterisks (`*`) to match multiple paths. For example, the string
169`/dev/*/red` will match `/dev/leds/red` as well as `/dev/lights/red`. The pattern matching follows
170the rules of the fnmatch() function.
171
172Ueventd will provide the uevent `DEVPATH` and `FIRMWARE` to this external program on the environment
173via environment variables with the same names. Ueventd will use the string written to stdout as the
174new name of the firmware to load. It will still look for the new firmware in the list of firmware
175directories stated above. It will also reject file names with `..` in them, to prevent leaving these
176directories. If stdout cannot be read, or the program returns with any exit code other than
177`EXIT_SUCCESS`, or the program crashes, the default firmware from the uevent will be loaded.
178
179Ueventd will additionally log all messages sent to stderr from the external program to the serial
180console after the external program has exited.
181
182If the kernel command-line argument `firmware_class.path` is set, this path
183will be used first by the kernel to search for the firmware files. If found,
184ueventd will not be called at all. See the
185[kernel documentation](https://www.kernel.org/doc/html/v5.10/driver-api/firmware/fw_search_path.html)
186for more details on this feature.
187
188## Coldboot
189--------
190Ueventd must create devices in `/dev` for all devices that have already sent their uevents before
191ueventd has started. To do so, when ueventd is started it does what it calls a 'coldboot' on `/sys`,
192in which it writes 'add' to every 'uevent' file that it finds in `/sys/class`, `/sys/block`, and
193`/sys/devices`. This causes the kernel to regenerate the uevents for these paths, and thus for
194ueventd to create the nodes.
195
196For boot time purposes, this is done in parallel across a set of child processes. `ueventd.cpp` in
197this directory contains documentation on how the parallelization is done.
198
199There is an option to parallelize the restorecon function during cold boot as well. It is
200recommended that devices use genfscon for labeling sysfs nodes. However, some devices may benefit
201from enabling the parallelization option:
202
203    parallel_restorecon enabled
204
205Do parallel restorecon to speed up boot process, subdirectories under `/sys`
206can be sliced by ueventd.rc, and run on multiple process.
207    parallel_restorecon_dir <directory>
208
209For example
210    parallel_restorecon_dir /sys
211    parallel_restorecon_dir /sys/devices
212    parallel_restorecon_dir /sys/devices/platform
213    parallel_restorecon_dir /sys/devices/platform/soc
214