美文网首页
Android启动Init进程源码分析

Android启动Init进程源码分析

作者: SmileUsers | 来源:发表于2016-02-21 16:52 被阅读1234次

    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.<device>.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.<platform>.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 <trigger>
       <command>
       <command>
       <command>
    
    
    Services
    --------
    Services are programs which init launches and (optionally) restarts
    when they exit.  Services take the form of:
    
    service <name> <pathname> [ <argument> ]*
       <option>
       <option>
       ...
    
    
    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 <name> <value>
       Set the environment variable <name> to <value> in the launched process.
    
    socket <name> <type> <perm> [ <user> [ <group> [ <context> ] ] ]
       Create a unix domain socket named /dev/socket/<name> and pass
       its fd to the launched process.  <type> 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 <username>
       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 <groupname> [ <groupname> ]*
       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 <securitycontext>
      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 <name>
       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)
    
    <name>=<value>
       Triggers of this form occur when the property <name> is set
       to the specific value <value>.
    
    device-added-<path>
    device-removed-<path>
       Triggers of these forms occur when a device node is added
       or removed.
    
    service-exited-<name>
       Triggers of this form occur when the specified service exits.
    
    
    Commands
    --------
    
    exec <path> [ <argument> ]*
       Fork and execute a program (<path>).  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 <name> <value>
       Set the environment variable <name> equal to <value> in the
       global environment (which will be inherited by all processes
       started after this command is executed)
    
    ifup <interface>
       Bring the network interface <interface> online.
    
    import <filename>
       Parse an init config file, extending the current configuration.
    
    hostname <name>
       Set the host name.
    
    chdir <directory>
       Change working directory.
    
    chmod <octal-mode> <path>
       Change file access permissions.
    
    chown <owner> <group> <path>
       Change file owner and group.
    
    chroot <directory>
      Change process root directory.
    
    class_start <serviceclass>
       Start all services of the specified class if they are
       not already running.
    
    class_stop <serviceclass>
       Stop all services of the specified class if they are
       currently running.
    
    domainname <name>
       Set the domain name.
    
    enable <servicename>
       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 <path>
       Install the module at <path>
    
    mkdir <path> [mode] [owner] [group]
       Create a directory at <path>, 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 <type> <device> <dir> [ <mountoption> ]*
       Attempt to mount the named device at the directory <dir>
       <device> may be of the form mtd@name to specify a mtd block
       device by name.
       <mountoption>s include "ro", "rw", "remount", "noatime", ...
    
    restorecon <path> [ <path> ]*
       Restore the file named by <path> 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 <path> [ <path> ]*
       Recursively restore the directory tree named by <path> 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 <securitycontext>
       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 <name> <value>
       Set system property <name> to <value>.
    
    setrlimit <resource> <cur> <max>
       Set the rlimit for a resource.
    
    setsebool <name> <value>
       Set SELinux boolean <name> to <value>.
       <value> may be 1|true|on or 0|false|off
    
    start <service>
       Start a service running if it is not already running.
    
    stop <service>
       Stop a service from running if it is currently running.
    
    symlink <target> <path>
       Create a symbolic link at <path> with the value <target>
    
    sysclktz <mins_west_of_gmt>
       Set the system clock base (0 if system clock ticks in GMT)
    
    trigger <event>
       Trigger an event.  Used to queue an action from another
       action.
    
    wait <path> [ <timeout> ]
      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 <path> <string>
       Open the file at <path> 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.<name>
       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   <trigger> 
          <command> 
          <command> 
          <command>
    

    启动<command>类似于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
    

    参考:
    Android的init过程详解(一)

    [初始化语言(init.rc)解析]

    相关文章

      网友评论

          本文标题:Android启动Init进程源码分析

          本文链接:https://www.haomeiwen.com/subject/igavkttx.html