Init

我们可以在源码/system/core/init/init.c查看init进程的实现

init.rc是什么

他是一个文本文件,他是一个启动脚本,Init进程会根据他定义的变量,系统进程启动,分区挂载,属性等多项配置来进行启动。下面先来看看一个完整的启动脚本:

nexus 5 5.1.1启动脚本文件

init.rc

# Copyright (C) 2012 The Android Open Source Project

#

# IMPORTANT: Do not create world writable files or directories.

# This is a common source of Android security bugs.

#

import /init.environ.rc

import /init.usb.rc

import /init.${ro.hardware}.rc

import /init.${ro.zygote}.rc

import /init.trace.rc

on early-init

# Set init and its forked children's oom_adj.

write /proc/1/oom_score_adj -1000

# Apply strict SELinux checking of PROT_EXEC on mmap/mprotect calls.

write /sys/fs/selinux/checkreqprot 0

# Set the security context for the init process.

# This should occur before anything else (e.g. ueventd) is started.

setcon u:r:init:s0

# Set the security context of /adb_keys if present.

restorecon /adb_keys

start ueventd

# create mountpoints

mkdir /mnt 0775 root system

on init

sysclktz 0

loglevel 3

# Backward compatibility

symlink /system/etc /etc

symlink /sys/kernel/debug /d

# Right now vendor lives on the same filesystem as system,

# but someday that may change.

symlink /system/vendor /vendor

# Create cgroup mount point for cpu accounting

mkdir /acct

mount cgroup none /acct cpuacct

mkdir /acct/uid

# Create cgroup mount point for memory

mount tmpfs none /sys/fs/cgroup mode=0750,uid=0,gid=1000

mkdir /sys/fs/cgroup/memory 0750 root system

mount cgroup none /sys/fs/cgroup/memory memory

write /sys/fs/cgroup/memory/memory.move_charge_at_immigrate 1

chown root system /sys/fs/cgroup/memory/tasks

chmod 0660 /sys/fs/cgroup/memory/tasks

mkdir /sys/fs/cgroup/memory/sw 0750 root system

write /sys/fs/cgroup/memory/sw/memory.swappiness 100

write /sys/fs/cgroup/memory/sw/memory.move_charge_at_immigrate 1

chown root system /sys/fs/cgroup/memory/sw/tasks

chmod 0660 /sys/fs/cgroup/memory/sw/tasks

mkdir /system

mkdir /data 0771 system system

mkdir /cache 0770 system cache

mkdir /config 0500 root root

# See storage config details at http://source.android.com/tech/storage/

mkdir /mnt/shell 0700 shell shell

mkdir /mnt/media_rw 0700 media_rw media_rw

mkdir /storage 0751 root sdcard_r

# Directory for putting things only root should see.

mkdir /mnt/secure 0700 root root

# Directory for staging bindmounts

mkdir /mnt/secure/staging 0700 root root

# Directory-target for where the secure container

# imagefile directory will be bind-mounted

mkdir /mnt/secure/asec 0700 root root

# Secure container public mount points.

mkdir /mnt/asec 0700 root system

mount tmpfs tmpfs /mnt/asec mode=0755,gid=1000

# Filesystem image public mount points.

mkdir /mnt/obb 0700 root system

mount tmpfs tmpfs /mnt/obb mode=0755,gid=1000

# memory control cgroup

mkdir /dev/memcg 0700 root system

mount cgroup none /dev/memcg memory

write /proc/sys/kernel/panic_on_oops 1

write /proc/sys/kernel/hung_task_timeout_secs 0

write /proc/cpu/alignment 4

write /proc/sys/kernel/sched_latency_ns 10000000

write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000

write /proc/sys/kernel/sched_compat_yield 1

write /proc/sys/kernel/sched_child_runs_first 0

write /proc/sys/kernel/randomize_va_space 2

write /proc/sys/kernel/kptr_restrict 2

write /proc/sys/vm/mmap_min_addr 32768

write /proc/sys/net/ipv4/ping_group_range "0 2147483647"

write /proc/sys/net/unix/max_dgram_qlen 300

write /proc/sys/kernel/sched_rt_runtime_us 950000

write /proc/sys/kernel/sched_rt_period_us 1000000

# reflect fwmark from incoming packets onto generated replies

write /proc/sys/net/ipv4/fwmark_reflect 1

write /proc/sys/net/ipv6/fwmark_reflect 1

# set fwmark on accepted sockets

write /proc/sys/net/ipv4/tcp_fwmark_accept 1

# Create cgroup mount points for process groups

mkdir /dev/cpuctl

mount cgroup none /dev/cpuctl cpu

chown system system /dev/cpuctl

chown system system /dev/cpuctl/tasks

chmod 0666 /dev/cpuctl/tasks

write /dev/cpuctl/cpu.shares 1024

write /dev/cpuctl/cpu.rt_runtime_us 800000

write /dev/cpuctl/cpu.rt_period_us 1000000

mkdir /dev/cpuctl/bg_non_interactive

chown system system /dev/cpuctl/bg_non_interactive/tasks

chmod 0666 /dev/cpuctl/bg_non_interactive/tasks

# 5.0 %

write /dev/cpuctl/bg_non_interactive/cpu.shares 52

write /dev/cpuctl/bg_non_interactive/cpu.rt_runtime_us 700000

write /dev/cpuctl/bg_non_interactive/cpu.rt_period_us 1000000

# qtaguid will limit access to specific data based on group memberships.

# net_bw_acct grants impersonation of socket owners.

# net_bw_stats grants access to other apps' detailed tagged-socket stats.

chown root net_bw_acct /proc/net/xt_qtaguid/ctrl

chown root net_bw_stats /proc/net/xt_qtaguid/stats

# Allow everybody to read the xt_qtaguid resource tracking misc dev.

# This is needed by any process that uses socket tagging.

chmod 0644 /dev/xt_qtaguid

# Create location for fs_mgr to store abbreviated output from filesystem

# checker programs.

mkdir /dev/fscklogs 0770 root system

# pstore/ramoops previous console log

mount pstore pstore /sys/fs/pstore

chown system log /sys/fs/pstore/console-ramoops

chmod 0440 /sys/fs/pstore/console-ramoops

# Healthd can trigger a full boot from charger mode by signaling this

# property when the power button is held.

on property:sys.boot_from_charger_mode=1

class_stop charger

trigger late-init

# Load properties from /system/ + /factory after fs mount.

on load_all_props_action

load_all_props

# Indicate to fw loaders that the relevant mounts are up.

on firmware_mounts_complete

rm /dev/.booting

# Mount filesystems and start core system services.

on late-init

trigger early-fs

trigger fs

trigger post-fs

trigger post-fs-data

# Load properties from /system/ + /factory after fs mount. Place

# this in another action so that the load will be scheduled after the prior

# issued fs triggers have completed.

trigger load_all_props_action

# Remove a file to wake up anything waiting for firmware.

trigger firmware_mounts_complete

trigger early-boot

trigger boot

on post-fs

# once everything is setup, no need to modify /

mount rootfs rootfs / ro remount

# mount shared so changes propagate into child namespaces

mount rootfs rootfs / shared rec

# We chown/chmod /cache again so because mount is run as root + defaults

chown system cache /cache

chmod 0770 /cache

# We restorecon /cache in case the cache partition has been reset.

restorecon_recursive /cache

# This may have been created by the recovery system with odd permissions

chown system cache /cache/recovery

chmod 0770 /cache/recovery

#change permissions on vmallocinfo so we can grab it from bugreports

chown root log /proc/vmallocinfo

chmod 0440 /proc/vmallocinfo

chown root log /proc/slabinfo

chmod 0440 /proc/slabinfo

#change permissions on kmsg & sysrq-trigger so bugreports can grab kthread stacks

chown root system /proc/kmsg

chmod 0440 /proc/kmsg

chown root system /proc/sysrq-trigger

chmod 0220 /proc/sysrq-trigger

chown system log /proc/last_kmsg

chmod 0440 /proc/last_kmsg

# make the selinux kernel policy world-readable

chmod 0444 /sys/fs/selinux/policy

# create the lost+found directories, so as to enforce our permissions

mkdir /cache/lost+found 0770 root root

on post-fs-data

# We chown/chmod /data again so because mount is run as root + defaults

chown system system /data

chmod 0771 /data

# We restorecon /data in case the userdata partition has been reset.

restorecon /data

# Avoid predictable entropy pool. Carry over entropy from previous boot.

copy /data/system/entropy.dat /dev/urandom

# Create dump dir and collect dumps.

# Do this before we mount cache so eventually we can use cache for

# storing dumps on platforms which do not have a dedicated dump partition.

mkdir /data/dontpanic 0750 root log

# Collect apanic data, free resources and re-arm trigger

copy /proc/apanic_console /data/dontpanic/apanic_console

chown root log /data/dontpanic/apanic_console

chmod 0640 /data/dontpanic/apanic_console

copy /proc/apanic_threads /data/dontpanic/apanic_threads

chown root log /data/dontpanic/apanic_threads

chmod 0640 /data/dontpanic/apanic_threads

write /proc/apanic_console 1

# create basic filesystem structure

mkdir /data/misc 01771 system misc

mkdir /data/misc/adb 02750 system shell

mkdir /data/misc/bluedroid 0770 bluetooth net_bt_stack

mkdir /data/misc/bluetooth 0770 system system

mkdir /data/misc/keystore 0700 keystore keystore

mkdir /data/misc/keychain 0771 system system

mkdir /data/misc/net 0750 root shell

mkdir /data/misc/radio 0770 system radio

mkdir /data/misc/sms 0770 system radio

mkdir /data/misc/zoneinfo 0775 system system

mkdir /data/misc/vpn 0770 system vpn

mkdir /data/misc/shared_relro 0771 shared_relro shared_relro

mkdir /data/misc/systemkeys 0700 system system

mkdir /data/misc/wifi 0770 wifi wifi

mkdir /data/misc/wifi/sockets 0770 wifi wifi

mkdir /data/misc/wifi/wpa_supplicant 0770 wifi wifi

mkdir /data/misc/ethernet 0770 system system

mkdir /data/misc/dhcp 0770 dhcp dhcp

mkdir /data/misc/user 0771 root root

# give system access to wpa_supplicant.conf for backup and restore

chmod 0660 /data/misc/wifi/wpa_supplicant.conf

mkdir /data/local 0751 root root

mkdir /data/misc/media 0700 media media

# For security reasons, /data/local/tmp should always be empty.

# Do not place files or directories in /data/local/tmp

mkdir /data/local/tmp 0771 shell shell

mkdir /data/data 0771 system system

mkdir /data/app-private 0771 system system

mkdir /data/app-asec 0700 root root

mkdir /data/app-lib 0771 system system

mkdir /data/app 0771 system system

mkdir /data/property 0700 root root

# create dalvik-cache, so as to enforce our permissions

mkdir /data/dalvik-cache 0771 root root

mkdir /data/dalvik-cache/profiles 0711 system system

# create resource-cache and double-check the perms

mkdir /data/resource-cache 0771 system system

chown system system /data/resource-cache

chmod 0771 /data/resource-cache

# create the lost+found directories, so as to enforce our permissions

mkdir /data/lost+found 0770 root root

# create directory for DRM plug-ins - give drm the read/write access to

# the following directory.

mkdir /data/drm 0770 drm drm

# create directory for MediaDrm plug-ins - give drm the read/write access to

# the following directory.

mkdir /data/mediadrm 0770 mediadrm mediadrm

mkdir /data/adb 0700 root root

# symlink to bugreport storage location

symlink /data/data/com.android.shell/files/bugreports /data/bugreports

# Separate location for storing security policy files on data

mkdir /data/security 0711 system system

# Reload policy from /data/security if present.

setprop selinux.reload_policy 1

# Set SELinux security contexts on upgrade or policy update.

restorecon_recursive /data

# If there is no fs-post-data action in the init..rc file, you

# must uncomment this line, otherwise encrypted filesystems

# won't work.

# Set indication (checked by vold) that we have finished this action

#setprop vold.post_fs_data_done 1

on boot

# basic network init

ifup lo

hostname localhost

domainname localdomain

# set RLIMIT_NICE to allow priorities from 19 to -20

setrlimit 13 40 40

# Memory management. Basic kernel parameters, and allow the high

# level system server to be able to adjust the kernel OOM driver

# parameters to match how it is managing things.

write /proc/sys/vm/overcommit_memory 1

write /proc/sys/vm/min_free_order_shift 4

chown root system /sys/module/lowmemorykiller/parameters/adj

chmod 0220 /sys/module/lowmemorykiller/parameters/adj

chown root system /sys/module/lowmemorykiller/parameters/minfree

chmod 0220 /sys/module/lowmemorykiller/parameters/minfree

# Tweak background writeout

write /proc/sys/vm/dirty_expire_centisecs 200

write /proc/sys/vm/dirty_background_ratio 5

# Permissions for System Server and daemons.

chown radio system /sys/android_power/state

chown radio system /sys/android_power/request_state

chown radio system /sys/android_power/acquire_full_wake_lock

chown radio system /sys/android_power/acquire_partial_wake_lock

chown radio system /sys/android_power/release_wake_lock

chown system system /sys/power/autosleep

chown system system /sys/power/state

chown system system /sys/power/wakeup_count

chown radio system /sys/power/wake_lock

chown radio system /sys/power/wake_unlock

chmod 0660 /sys/power/state

chmod 0660 /sys/power/wake_lock

chmod 0660 /sys/power/wake_unlock

chown system system /sys/devices/system/cpu/cpufreq/interactive/timer_rate

chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/timer_rate

chown system system /sys/devices/system/cpu/cpufreq/interactive/timer_slack

chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/timer_slack

chown system system /sys/devices/system/cpu/cpufreq/interactive/min_sample_time

chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/min_sample_time

chown system system /sys/devices/system/cpu/cpufreq/interactive/hispeed_freq

chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/hispeed_freq

chown system system /sys/devices/system/cpu/cpufreq/interactive/target_loads

chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/target_loads

chown system system /sys/devices/system/cpu/cpufreq/interactive/go_hispeed_load

chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/go_hispeed_load

chown system system /sys/devices/system/cpu/cpufreq/interactive/above_hispeed_delay

chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/above_hispeed_delay

chown system system /sys/devices/system/cpu/cpufreq/interactive/boost

chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/boost

chown system system /sys/devices/system/cpu/cpufreq/interactive/boostpulse

chown system system /sys/devices/system/cpu/cpufreq/interactive/input_boost

chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/input_boost

chown system system /sys/devices/system/cpu/cpufreq/interactive/boostpulse_duration

chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/boostpulse_duration

chown system system /sys/devices/system/cpu/cpufreq/interactive/io_is_busy

chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/io_is_busy

# Assume SMP uses shared cpufreq policy for all CPUs

chown system system /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq

chmod 0660 /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq

chown system system /sys/class/timed_output/vibrator/enable

chown system system /sys/class/leds/keyboard-backlight/brightness

chown system system /sys/class/leds/lcd-backlight/brightness

chown system system /sys/class/leds/button-backlight/brightness

chown system system /sys/class/leds/jogball-backlight/brightness

chown system system /sys/class/leds/red/brightness

chown system system /sys/class/leds/green/brightness

chown system system /sys/class/leds/blue/brightness

chown system system /sys/class/leds/red/device/grpfreq

chown system system /sys/class/leds/red/device/grppwm

chown system system /sys/class/leds/red/device/blink

chown system system /sys/class/timed_output/vibrator/enable

chown system system /sys/module/sco/parameters/disable_esco

chown system system /sys/kernel/ipv4/tcp_wmem_min

chown system system /sys/kernel/ipv4/tcp_wmem_def

chown system system /sys/kernel/ipv4/tcp_wmem_max

chown system system /sys/kernel/ipv4/tcp_rmem_min

chown system system /sys/kernel/ipv4/tcp_rmem_def

chown system system /sys/kernel/ipv4/tcp_rmem_max

chown root radio /proc/cmdline

# Define default initial receive window size in segments.

setprop net.tcp.default_init_rwnd 60

class_start core

on nonencrypted

class_start main

class_start late_start

on property:vold.decrypt=trigger_default_encryption

start defaultcrypto

on property:vold.decrypt=trigger_encryption

start surfaceflinger

start encrypt

on property:sys.init_log_level=*

loglevel ${sys.init_log_level}

on charger

class_start charger

on property:vold.decrypt=trigger_reset_main

class_reset main

on property:vold.decrypt=trigger_load_persist_props

load_persist_props

on property:vold.decrypt=trigger_post_fs_data

trigger post-fs-data

on property:vold.decrypt=trigger_restart_min_framework

class_start main

on property:vold.decrypt=trigger_restart_framework

class_start main

class_start late_start

on property:vold.decrypt=trigger_shutdown_framework

class_reset late_start

class_reset main

on property:sys.powerctl=*

powerctl ${sys.powerctl}

# system server cannot write to /proc/sys files,

# and chown/chmod does not work for /proc/sys/ entries.

# So proxy writes through init.

on property:sys.sysctl.extra_free_kbytes=*

write /proc/sys/vm/extra_free_kbytes ${sys.sysctl.extra_free_kbytes}

# "tcp_default_init_rwnd" Is too long!

on property:sys.sysctl.tcp_def_init_rwnd=*

write /proc/sys/net/ipv4/tcp_default_init_rwnd ${sys.sysctl.tcp_def_init_rwnd}

## Daemon processes to be run by init.

##

service ueventd /sbin/ueventd

class core

critical

seclabel u:r:ueventd:s0

service logd /system/bin/logd

class core

socket logd stream 0666 logd logd

socket logdr seqpacket 0666 logd logd

socket logdw dgram 0222 logd logd

seclabel u:r:logd:s0

service healthd /sbin/healthd

class core

critical

seclabel u:r:healthd:s0

service console /system/bin/sh

class core

console

disabled

user shell

group shell log

seclabel u:r:shell:s0

on property:ro.debuggable=1

start console

# adbd is controlled via property triggers in init..usb.rc

service adbd /sbin/adbd --root_seclabel=u:r:su:s0

class core

socket adbd stream 660 system system

disabled

seclabel u:r:adbd:s0

# adbd on at boot in emulator

on property:ro.kernel.qemu=1

start adbd

service lmkd /system/bin/lmkd

class core

critical

socket lmkd seqpacket 0660 system system

service servicemanager /system/bin/servicemanager

class core

user system

group system

critical

onrestart restart healthd

onrestart restart zygote

onrestart restart media

onrestart restart surfaceflinger

onrestart restart drm

service vold /system/bin/vold

class core

socket vold stream 0660 root mount

ioprio be 2

service netd /system/bin/netd

class main

socket netd stream 0660 root system

socket dnsproxyd stream 0660 root inet

socket mdns stream 0660 root system

socket fwmarkd stream 0660 root inet

service debuggerd /system/bin/debuggerd

class main

service debuggerd64 /system/bin/debuggerd64

class main

service ril-daemon /system/bin/rild

class main

socket rild stream 660 root radio

socket rild-debug stream 660 radio system

user root

group radio cache inet misc audio log

service surfaceflinger /system/bin/surfaceflinger

class core

user system

group graphics drmrpc

onrestart restart zygote

service drm /system/bin/drmserver

class main

user drm

group drm system inet drmrpc

service media /system/bin/mediaserver

class main

user media

group audio camera inet net_bt net_bt_admin net_bw_acct drmrpc mediadrm

ioprio rt 4

# One shot invocation to deal with encrypted volume.

service defaultcrypto /system/bin/vdc --wait cryptfs mountdefaultencrypted

disabled

oneshot

# vold will set vold.decrypt to trigger_restart_framework (default

# encryption) or trigger_restart_min_framework (other encryption)

# One shot invocation to encrypt unencrypted volumes

service encrypt /system/bin/vdc --wait cryptfs enablecrypto inplace default

disabled

oneshot

# vold will set vold.decrypt to trigger_restart_framework (default

# encryption)

service bootanim /system/bin/bootanimation

class core

user graphics

group graphics audio

disabled

oneshot

service installd /system/bin/installd

class main

socket installd stream 600 system system

service flash_recovery /system/bin/install-recovery.sh

class main

seclabel u:r:install_recovery:s0

oneshot

service racoon /system/bin/racoon

class main

socket racoon stream 600 system system

# IKE uses UDP port 500. Racoon will setuid to vpn after binding the port.

group vpn net_admin inet

disabled

oneshot

service mtpd /system/bin/mtpd

class main

socket mtpd stream 600 system system

user vpn

group vpn net_admin inet net_raw

disabled

oneshot

service keystore /system/bin/keystore /data/misc/keystore

class main

user keystore

group keystore drmrpc

service dumpstate /system/bin/dumpstate -s

class main

socket dumpstate stream 0660 shell log

disabled

oneshot

service mdnsd /system/bin/mdnsd

class main

user mdnsr

group inet net_raw

socket mdnsd stream 0660 mdnsr inet

disabled

oneshot

service pre-recovery /system/bin/uncrypt

class main

disabled

oneshot

初略的查看了下上面的脚本,可能会发现在源码开头用import导入了其他的配置文件

import /init.environ.rc

import /init.usb.rc

import /init.${ro.hardware}.rc

import /init.${ro.zygote}.rc

import /init.trace.rc

这些文件都在手机的根目录

Paste_Image.png

对应到源码路径为system/core/rootdir和device/{vendor}/{hardware}/

对于以上语法详细介绍可以参考下面这个文件(/system/core/init/readme.txt)

readme.txt

Android Init Language

---------------------

The Android Init Language consists of four broad classes of statements,

which are Actions, Commands, Services, and Options.

All of these are line-oriented, consisting of tokens separated by

whitespace. The c-style backslash escapes may be used to insert

whitespace into a token. Double quotes may also be used to prevent

whitespace from breaking text into multiple tokens. The backslash,

when it is the last character on a line, may be used for line-folding.

Lines which start with a # (leading whitespace allowed) are comments.

Actions and Services implicitly declare a new section. All commands

or options belong to the section most recently declared. Commands

or options before the first section are ignored.

Actions and Services have unique names. If a second Action or Service

is declared with the same name as an existing one, it is ignored as

an error. (??? should we override instead)

Actions

-------

Actions are named sequences of commands. Actions have a trigger which

is used to determine when the action should occur. When an event

occurs which matches an action's trigger, that action is added to

the tail of a to-be-executed queue (unless it is already on the

queue).

Each action in the queue is dequeued in sequence and each command in

that action is executed in sequence. Init handles other activities

(device creation/destruction, property setting, process restarting)

"between" the execution of the commands in activities.

Actions take the form of:

on

Services

--------

Services are programs which init launches and (optionally) restarts

when they exit. Services take the form of:

service [ ]*

...

Options

-------

Options are modifiers to services. They affect how and when init

runs the service.

critical

This is a device-critical service. If it exits more than four times in

four minutes, the device will reboot into recovery mode.

disabled

This service will not automatically start with its class.

It must be explicitly started by name.

setenv

Set the environment variable to in the launched process.

socket [ [ [ ] ] ]

Create a unix domain socket named /dev/socket/ and pass

its fd to the launched process. must be "dgram", "stream" or "seqpacket".

User and group default to 0.

Context is the SELinux security context for the socket.

It defaults to the service security context, as specified by seclabel or

computed based on the service executable file security context.

user

Change to username before exec'ing this service.

Currently defaults to root. (??? probably should default to nobody)

Currently, if your process requires linux capabilities then you cannot use

this command. You must instead request the capabilities in-process while

still root, and then drop to your desired uid.

group [ ]*

Change to groupname before exec'ing this service. Additional

groupnames beyond the (required) first one are used to set the

supplemental groups of the process (via setgroups()).

Currently defaults to root. (??? probably should default to nobody)

seclabel

Change to securitycontext before exec'ing this service.

Primarily for use by services run from the rootfs, e.g. ueventd, adbd.

Services on the system partition can instead use policy-defined transitions

based on their file security context.

If not specified and no transition is defined in policy, defaults to the init context.

oneshot

Do not restart the service when it exits.

class

Specify a class name for the service. All services in a

named class may be started or stopped together. A service

is in the class "default" if one is not specified via the

class option.

onrestart

Execute a Command (see below) when service restarts.

Triggers

--------

Triggers are strings which can be used to match certain kinds

of events and used to cause an action to occur.

boot

This is the first trigger that will occur when init starts

(after /init.conf is loaded)

=

Triggers of this form occur when the property is set

to the specific value .

device-added-

device-removed-

Triggers of these forms occur when a device node is added

or removed.

service-exited-

Triggers of this form occur when the specified service exits.

Commands

--------

exec [ ]*

Fork and execute a program (). This will block until

the program completes execution. It is best to avoid exec

as unlike the builtin commands, it runs the risk of getting

init "stuck". (??? maybe there should be a timeout?)

export

Set the environment variable equal to in the

global environment (which will be inherited by all processes

started after this command is executed)

ifup

Bring the network interface online.

import

Parse an init config file, extending the current configuration.

hostname

Set the host name.

chdir

Change working directory.

chmod

Change file access permissions.

chown

Change file owner and group.

chroot

Change process root directory.

class_start

Start all services of the specified class if they are

not already running.

class_stop

Stop all services of the specified class if they are

currently running.

domainname

Set the domain name.

enable

Turns a disabled service into an enabled one as if the service did not

specify disabled.

If the service is supposed to be running, it will be started now.

Typically used when the bootloader sets a variable that indicates a specific

service should be started when needed. E.g.

on property:ro.boot.myfancyhardware=1

enable my_fancy_service_for_my_fancy_hardware

insmod

Install the module at

mkdir [mode] [owner] [group]

Create a directory at , optionally with the given mode, owner, and

group. If not provided, the directory is created with permissions 755 and

owned by the root user and root group.

mount

Attempt to mount the named device at the directory

may be of the form mtd@name to specify a mtd block

device by name.

s include "ro", "rw", "remount", "noatime", ...

restorecon [ ]*

Restore the file named by to the security context specified

in the file_contexts configuration.

Not required for directories created by the init.rc as these are

automatically labeled correctly by init.

restorecon_recursive [ ]*

Recursively restore the directory tree named by to the

security contexts specified in the file_contexts configuration.

Do NOT use this with paths leading to shell-writable or app-writable

directories, e.g. /data/local/tmp, /data/data or any prefix thereof.

setcon

Set the current process security context to the specified string.

This is typically only used from early-init to set the init context

before any other process is started.

setenforce 0|1

Set the SELinux system-wide enforcing status.

0 is permissive (i.e. log but do not deny), 1 is enforcing.

setkey

TBD

setprop

Set system property to .

setrlimit

Set the rlimit for a resource.

setsebool

Set SELinux boolean to .

may be 1|true|on or 0|false|off

start

Start a service running if it is not already running.

stop

Stop a service from running if it is currently running.

symlink

Create a symbolic link at with the value

sysclktz

Set the system clock base (0 if system clock ticks in GMT)

trigger

Trigger an event. Used to queue an action from another

action.

wait [ ]

Poll for the existence of the given file and return when found,

or the timeout has been reached. If timeout is not specified it

currently defaults to five seconds.

write

Open the file at and write a string to it with write(2)

without appending.

Properties

----------

Init updates some system properties to provide some insight into

what it's doing:

init.action

Equal to the name of the action currently being executed or "" if none

init.command

Equal to the command being executed or "" if none.

init.svc.

State of a named service ("stopped", "running", "restarting")

Example init.conf

-----------------

# not complete -- just providing some examples of usage

#

on boot

export PATH /sbin:/system/sbin:/system/bin

export LD_LIBRARY_PATH /system/lib

mkdir /dev

mkdir /proc

mkdir /sys

mount tmpfs tmpfs /dev

mkdir /dev/pts

mkdir /dev/socket

mount devpts devpts /dev/pts

mount proc proc /proc

mount sysfs sysfs /sys

write /proc/cpu/alignment 4

ifup lo

hostname localhost

domainname localhost

mount yaffs2 mtd@system /system

mount yaffs2 mtd@userdata /data

import /system/etc/init.conf

class_start default

service adbd /sbin/adbd

user adb

group adb

service usbd /system/bin/usbd -r

user usbd

group usbd

socket usbd 666

service zygote /system/bin/app_process -Xzygote /system/bin --zygote

socket zygote 666

service runtime /system/bin/runtime

user system

group system

on device-added-/dev/compass

start akmd

on device-removed-/dev/compass

stop akmd

service akmd /sbin/akmd

disabled

user akmd

group akmd

Debugging notes

---------------

By default, programs executed by init will drop stdout and stderr into

/dev/null. To help with debugging, you can execute your program via the

Andoird program logwrapper. This will redirect stdout/stderr into the

Android logging system (accessed via logcat).

For example

service akmd /system/bin/logwrapper /sbin/akmd

init.rc通常可以定义为以下几种结构:

1. Actioins

他是一组命令的集合,每个Actions都可以定义一个触发器,格式如下:

on

启动类似于shell命令,对应一个函数,通常执行一条操作,比如启动akmd

2. Services

可以看到上面启动了zygote进程其他他就是app_process进程(system/bin/app_process,源码frameworks/base/cmds/app_process/app_main.cpp)

service zygote /system/bin/app_process -Xzygote /system/bin --zygote socket zygote 666

linux init进程源码,Android启动Init进程源码分析相关推荐

  1. Android: 启动init.rc 中service的权限问题【转】

    转自:http://www.linuxidc.com/Linux/2011-04/35014.htm 通过property_set("ctl.start", service_xx) ...

  2. android_Xposed框架/init.rc语音/jni/android启动

    Xposed框架:   RootAccess:因为Xposed工作原理是在/system/bin目录下替换文件,在install的时候需要root权限,但是运行时不需要root权限.   Xposed ...

  3. linux 音频播放器源码,Android音乐播放器源码

    相当完整的Android音乐播放器,直接上效果图及源代码,自己欣赏,具体不再解释了,可以说是一个很给力的Android音乐播放器. 示例代码: /* * Copyright (C) 2009 Tele ...

  4. android intent 源码,Android 基础之 IntentService 源码

    Android 基础之 IntentService 源码 Android,IntentService,源码 IntentService 位于 android.app 包下面,是 Service 的一个 ...

  5. android 手机壁纸源码,Android设置手机壁纸-源码(WallPaper)

    Android设置手机壁纸-源码(WallPaper) /** * Andorid设置手机屏幕的壁纸 * * @description: * @author ldm * @date 2016-5-4 ...

  6. android简单记账源码,Android+个人记账程序源码.rar(入门级)

    [实例简介]Android 个人记账程序源码,入门级源码,适合新手... [实例截图] [核心代码] package com.cola.ui; import java.util.Calendar; i ...

  7. android面试 源码,Android面试题-onCreate源码都没看过,怎好意思说自己做android-Go语言中文社区...

    自定义控件 联网 工具 数据库 源码分析相关面试题 Activity相关面试题 Service相关面试题 与XMPP相关面试题 与性能优化相关面试题 与登录相关面试题 与开发相关面试题 与人事相关面试 ...

  8. android studio im源码,Android Studio 导入 AOSP 源码

    有了 AOSP 源码,接下来就是如何看了,可以直接文本看,可以用 Source Insight,我当然选择 Android Studio,Android Studio 是我熟悉且十分强大的工具.问题来 ...

  9. 项目源码--Android美图秀秀源码

    下载源码   技术要点:   1. 多种分类分享高清图片 2. 图片缓存技术 3. 图片缩图显示 4. 图片实时加载技术 5. 多点触控技术 6.  HTTP网络数据搜索技术 7.  精美UI图片显示 ...

  10. 大型智慧校园系统源码 智慧校园源码 Android电子班牌源码

    一款针对中小学研发的智慧校园系统源码,智慧学校源码带电子班牌.人脸识别系统.系统有演示,可正常上线运营+正版授权. 私信了解更多! 技术架构: 后端:Java 框架:springboot 前端页面:v ...

最新文章

  1. 疯狂python讲义视频 百度云-疯狂Python讲义 PDF 含源码工具版
  2. asp.net 中chartlet 统计图表的的使用
  3. 快速获取青年大学习完成截图
  4. C#字符串的基本操作
  5. .NET Core开发实战(第32课:集成事件:解决跨微服务的最终一致性)--学习笔记...
  6. 使用 CefSharp 在 C# App 中嵌入 Chrome 浏览器
  7. android 系统ui修改器,分享两个效果 - Android 系统 UI 管理
  8. word中一直提示校对错误,如何关闭当前文档校对功能
  9. MYSQL AB复制原理
  10. Android自定义View构造函数详解
  11. ubuntu 重装 nvidia_时隔三个月 NVIDIA为何再次打破AI推理性能记录
  12. 2019南昌网络赛H The Nth Item(二阶线性数列递推 + 广义斐波那契循环节 + 分段打表)题解...
  13. 【JavaScript 封装库】BETA 1.0 测试版发布!
  14. WebRTC服务器——Licode 环境搭建
  15. Sourcetree 看不了文件内容 Diff was suppressed because of file size or pattern
  16. C语言连连看秒杀辅助
  17. DGUS组态软件中图标旋转显示如何使用
  18. 怎么做超链接html,HTML怎么做超链接
  19. 组合测试法是什么 软件测试,组合测试模型方法
  20. Unity 3D官方教程——2D Roguelike学习记录

热门文章

  1. 异常点检测算法分析与选择
  2. 多Excel合并成一个Excel的多sheet
  3. 《Mostly Harmless Econometrics 》第二章:选择性偏误与随机实验
  4. 2021-04-11
  5. 用Python生成Hilbert矩阵
  6. vue 或 js 实现 excel表格的导出(笔记)
  7. meanshift算法图解
  8. Android移动应用基础教程知识整理
  9. Parasoft c++test安装使用导引
  10. ABB ACS 510 1.5-5.5kw驱动板图纸 PDF格式