【Android7.1.2源码解析系列】init.rc全流程注释

Android源码之init.rc文件详解 一、引言 .rc文件是 android系统一个十分重要的文件。 其是资源文件,包括比如对话框、菜单、图标、字符串等资源信息。 使用.rc资源文件的目的是为了对程序中用到的大量的资源进行统一的管理。 本文来了解文件的规则。 二、init.rc Android init.rc文件由系统第一个启动的init程序解析。是启动系统服务使用的文件。 三、文件规则 类型 主要包含了四种类型的语句: 1、Acti... 阅读详情
# 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.
#


# 分析开始


# 第一步,导入其他的rc文件,这里先不管这些rc文件的内容,只对init.rc文件进行分析


import /init.environ.rc
import /init.usb.rc
import /init.${ro.hardware}.rc
import /init.${ro.zygote}.rc
import /init.trace.rc


# 第二步,动作片段1,在early-init触发器被触发时运行以下的命令
# 这里说明一下,early-init触发器不是init语法当中原本定义的触发器,但是可以在init.c的代码当中对此触发器进行触发
on early-init
    # Set init and its forked children's oom_adj.
# 直译,设置init进程以及它的子进程的oom_adj(内存清理优先级设置为最低,可以保证init永远不会被内存清理清除掉)
    write /proc/1/oom_score_adj -1000


    # Apply strict SELinux checking of PROT_EXEC on mmap/mprotect calls.
# 直译,在mmap/mprotect调用时对可执行性严格支持SELinux检查
    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.
# 直译,设置init进程的安全上下文
# 这应该在任何程序(比如ueventd)开启前发生。
    setcon u:r:init:s0


    # Set the security context of /adb_keys if present.
# 直译,设置/adb_keys的安全上下文
    restorecon /adb_keys


    start ueventd


    # create mountpoints
# 直译,创建挂载点
    mkdir /mnt 0775 root system


# 第三部分,动作片段2,在init触发器被触发时调用以下命令
on init
# 设置系统时钟
    sysclktz 0

# 设置日志等级
    loglevel 3


    # Backward compatibility
# 直译,增强兼容性
# 将system/etc链接到/etc,将sys/kernel/debug链接到/d
    symlink system/etc /etc
    symlink sys/kernel/debug /d


    # Right now vendor lives on the same filesystem as system,
    # but someday that may change.
# 直译,现在vendor和系统存在于同一个文件系统,不过也许某天会改变
    symlink system/vendor /vendor


    # Create cgroup mount point for cpu accounting
# 直译,为cpu的计算创建挂载点
    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

# 创建system、data、cache、config文件夹
    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/
# 直译,在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.
# 直译,一个只有root用户可见的用来放置文件的目录
    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
# 直译,将fwmark从输入的包中映射到生成的依赖中
    write /proc/sys/net/ipv4/fwmark_reflect 1
    write /proc/sys/net/ipv6/fwmark_reflect 1


    # set fwmark on accepted sockets
# 直译,设置fwmark到可接受的socket
    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
    chmod 0660 /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 %
# 5.0加入
# 重设cpu运行数据
    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.
# 直译,qtaguid会限制基于组成员的特定数据权限。
# net_bw_acct记录了授权给socket拥有者进行模拟
# net_bw_stats记录了给其他app细节化的已标记的socket统计表
    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.
# 直译,允许每个人读取xt_qtaguid资源的崩溃最小硬件指令集。
# 这是被任何使用socekt来标记的进程所需要的。
    chmod 0644 /dev/xt_qtaguid

    # Create location for fs_mgr to store abbreviated output from filesystem
    # checker programs.
# 直译,为fs_mgr创建位置来存储来自文件系统的简略输出
    mkdir /dev/fscklogs 0770 root system


    # pstore/ramoops previous console log
# 直译,pstore/ramoops的有价值的控制台日志
    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.
# 直译,电池管理进程可以通过标记property:sys.boot_from_charger_mode=1来触发一个完整的开机进程
# 第四部分,动作片段3,是否是从充电模式打开
on property:sys.boot_from_charger_mode=1
    class_stop charger
    trigger late-init


# Load properties from /system/ + /factory after fs mount.
# 在文件系统挂载完成之后加载/system/与/factory中的所有属性
# 第五部分,动作片段4,加载/system/与/factory的属性
on load_all_props_action
    load_all_props


# Indicate to fw loaders that the relevant mounts are up.
# 直译,向fw加载器表明相关的挂载已经上传
# 第六部分,动作片段5,挂载完成后移除临时的booting文件
on firmware_mounts_complete
    rm /dev/.booting


# Mount filesystems and start core system services.
# 直译,挂载文件系统并且开启核心系统服务
# 第七部分,动作片段6,init的末尾,触发early-fs、fs、post-fs、post-fs-data
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.
# 直译,在fs挂载完成之后加载/system/和/factory的属性,将这个放到别的动作当中以至于加载动作可以在
# 优先执行的fs触发器完成后执行。
    trigger load_all_props_action


    # Remove a file to wake up anything waiting for firmware.
# 移除掉一个文件来唤醒所有等待firmware的程序
    trigger firmware_mounts_complete

    trigger early-boot
    trigger boot


# 第八部分,动作片段7, 当系统安装基本完成以后进行目录的重新挂载,将目录的权限设置为用户使用时的权限
# 粘贴文件系统
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
# 直译,我们修改了/cache的所有者以及他的权限,因为挂载器是运行在root与default权限下的
    chown system cache /cache
    chmod 0770 /cache
    # We restorecon /cache in case the cache partition has been reset.
# 我们递归的重配置/cache文件夹下的所有文件的权限
    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
# 修改vmallocinfo(内存分配信息)的权限所以我们可以通过bug报告获取它
    chown root log /proc/vmallocinfo
    chmod 0440 /proc/vmallocinfo

# 修改slab内存分配算法的权限以至于我们可以获取bug报告
    chown root log /proc/slabinfo
    chmod 0440 /proc/slabinfo


    # change permissions on kmsg & sysrq-trigger so bugreports can grab kthread stacks
# 直译,改变kmsg(系统内核日志)以及sysrq-trigger(系统响应触发器)的权限所以bug报告可以抓取内核线程的栈状态
    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
# 直译,使得selinux的内核策略全局可读
    chmod 0444 /sys/fs/selinux/policy


    # create the lost+found directories, so as to enforce our permissions
# 创建lost+found的目录,以便于设置我们的权限
    mkdir /cache/lost+found 0770 root root


# 第九部分,动作片段8,文件系统复制完成后,处理文件系统的数据
# 粘贴文件数据
on post-fs-data
    # We chown/chmod /data again so because mount is run as root + defaults
# 直译,我们修改了/data的所有者和权限,因为挂载操作是默认运行在root状态的
    chown system system /data
    chmod 0771 /data
    # We restorecon /data in case the userdata partition has been reset.
# 直译,一旦用户数据的分区被设置好,我们就对/data目录下的文件(夹)进行权限设置
    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.
# 直译,创建回收站目录并且回收垃圾。
# 在我们挂载cache文件夹之前进行这个命令,这样我们就可以使用cache来
# 存储还没有创建一个垃圾分区的平台的垃圾。
    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
# 直译,授予wpa_supplicant系统权限来进行备份和重载
    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
# 直译,为了保证安全,/data/local/tmp应该永远为空。
# 不要将文件(夹)放到/data/local/tmp目录下
# 创建了data目录下app相关文件结构
    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
# 直译,创建dalvik缓存,以便于实行我们的权限
    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
# 直译,创建lost+found目录,以便于实施我们的权限
    mkdir /data/lost+found 0770 root root


    # create directory for DRM plug-ins - give drm the read/write access to
    # the following directory.
# 直译,为DRM(数字权限管理器)插件创建目录
# 给数字权限管理器对于该目录读写的权限
    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
# 直译,链接将bug报告器的存储位置
    symlink data/com.android.shell/files/bugreports /data/bugreports


    # Separate location for storing security policy files on data
# 直译,为存储安全策略文件在/data目录下分出分区
    mkdir /data/security 0711 system system


    # Reload policy from /data/security if present.
# 直译,在当前从/data/security重新加载策略
    setprop selinux.reload_policy 1


    # Set SELinux security contexts on upgrade or policy update.
# 将SELinux的安全上下文进行升级或者策略进行升级
# 即对于/data目录下的文件(夹)进行递归
    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

# 直译,如果在init过程中没有fs-post-data动作,你必须要将此行解除注释,否则
# 加密的文件系统不会工作。设置明确的标志(通过vold来检查)来明确我们已经结束了该动作
# 需要解除注释的目录:setprop vold.post_fs_data_done 1


# 第十部份,动作片段9,init完成后的开机动作
on boot
    # basic network init
# 直译,基本网络初始化
    ifup lo
    hostname localhost
    domainname localdomain


    # set RLIMIT_NICE to allow priorities from 19 to -20
# 直译,设置权限限制来设置优先级由19到-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
# 将标准管理器使用的cpu序列分享策略使用到所有的CPU
    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


# 第十一部分,动作片段10,触发器为未加密,打开main和late_start组
on nonencrypted
    class_start main
    class_start late_start


# 第十二部分,动作片段11,判断vold.decrypt的值来开启默认加密片段
on property:vold.decrypt=trigger_default_encryption
    start defaultcrypto


# 第十三部分,动作片段12,判断vold.decrypt的值来开启surfaceflinger(界面管理器)和encrypt(加密器)
on property:vold.decrypt=trigger_encryption
    start surfaceflinger
    start encrypt


# 第十四部分,动作片段13,传递init程序的日志等级的变化
on property:sys.init_log_level=*
    loglevel ${sys.init_log_level}



# 第十五部分,动作片段14,充电时开启充电组的服务
on charger
    class_start charger


# 第十六部分,动作片段15,依然是判断vold.decrypt的值
on property:vold.decrypt=trigger_reset_main
    class_reset main


# 第十七部分,动作片段16,还是判断vold.decrypt的值来加载存留属性
on property:vold.decrypt=trigger_load_persist_props
    load_persist_props


# 第十八部分,动作片段17,判断是否为复制文件系统数据
on property:vold.decrypt=trigger_post_fs_data
    trigger post-fs-data


# 第十九部分,动作片段18,还是判断设备加密情况
on property:vold.decrypt=trigger_restart_min_framework
    class_start main


# 第二十部分,动作片段19.判断加密情况
on property:vold.decrypt=trigger_restart_framework
    class_start main
    class_start late_start


# 第二十一部分,动作片段20,判断加密情况
on property:vold.decrypt=trigger_shutdown_framework
    class_reset late_start
    class_reset main


# 第二十二部分,动作片段21,当powerctl的值变化时,进行重启动作
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.
# 直译,系统服务不可以写入到/proc/sys文件中,
# 并且chown和chmod不可以在/proc/sys/实体中运行。
# 所以采用代理在初始化过程中写入。


# 第二十三部分,动作片段22,写入系统中的额外数据
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!
# 直译,"tcp_default_init_rwnd"太长了
# 将最新的tcp的初始化值写入到对应文件当中
# 第二十四部分,动作片段23,写入tcp初始值
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.
##
## 直译,被init所启动的守护进程


# 接下来主要是服务的部分,与动作不同,服务是多个条件下运行一个程序,动作是在一个条件下运行多个命令




# 第二十五部分,服务片段1,设置守护进程
service ueventd /sbin/ueventd
    class core
    critical
    seclabel u:r:ueventd:s0


# 第二十六部分,服务片段2,设置日志进程
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


# 第二十七部分,服务片段3,设置电量进程
service healthd /sbin/healthd
    class core
    critical
    seclabel u:r:healthd:s0


# 第二十八部分,服务片段4,设置控制台进程
service console /system/bin/sh
    class core
    console
    disabled
#   user shell
    group shell log
    seclabel u:r:shell:s0


# 第二十九部分,动作片段24,判断debug标志来打开控制台进程
on property:ro.debuggable=1
    start console


# adbd is controlled via property triggers in init.<platform>.usb.rc
# 第三十部分,服务片段5,设置adb进程
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
# 第三十一部分,动作片段25,在仿真器中adb会在开机时启动
on property:ro.kernel.qemu=1
    start adbd


# 第三十二部分,服务片段6,设置lmkd进程(low memory killer)
service lmkd /system/bin/lmkd
    class core
    critical
    socket lmkd seqpacket 0660 system system


# 第三十三部分,服务片段7,设置servicemanager进程,framework层运行的各个服务的管理者
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


# 第三十四部分,服务片段8,设置vold进程(管理外部存储器)
service vold /system/bin/vold
    class core
    socket vold stream 0660 root mount
    ioprio be 2


# 第三十五部分,服务片段9,设置netd进程
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


# 第三十六部分,服务片段10,设置debuggerd进程
service debuggerd /system/bin/debuggerd
    class main


# 第三十七部分,服务片段11,设置debuggerd64进程
service debuggerd64 /system/bin/debuggerd64
    class main


# 第三十八部分,服务片段12,设置ril-daemon进程(ril的守护进程,守护了通话服务)
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


# 第三十九部分,服务片段13,设置surfaceflinger进程(用以控制android手机界面)
service surfaceflinger /system/bin/surfaceflinger
    class core
#   user system
    group graphics drmrpc
    onrestart restart zygote


# 第四十部分,服务片段14,设置drm进程,digital rights manager
service drm /system/bin/drmserver
    class main
    user drm
    group drm system inet drmrpc


# 第四十一部分,服务片段15,设置media进程
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


# 第四十二部分,服务片段16,设置defaultcrypto进程
# One shot invocation to deal with encrypted volume.
# 直译,单次运行处理加密声音
service defaultcrypto /system/bin/vdc --wait cryptfs mountdefaultencrypted
    disabled
    oneshot
# vold会设置vold.decrypt来启动trigger_restart_framework或者trigger_restart_min_framework
    # 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
# 直译,单次运行以解密声音
# 第四十三部分,服务片段17,设置encrypt进程
service encrypt /system/bin/vdc --wait cryptfs enablecrypto inplace default
    disabled
    oneshot
    # vold will set vold.decrypt to trigger_restart_framework (default
    # encryption)


# 第四十四部分,服务片段18,设置bootanim进程
service bootanim /system/bin/bootanimation
    class core
    user graphics
    group graphics audio
    disabled
    oneshot


# 第四十五部分,服务片段19,设置installd进程
service installd /system/bin/installd
    class main
    socket installd stream 600 system system


# 第四十六部分,服务片段20,设置flash_recovery进程
service flash_recovery /system/bin/install-recovery.sh
    class main
    seclabel u:r:install_recovery:s0
    oneshot


# 第四十七部分,服务片段21,设置racoon进程(udp?)
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


# 第四十八部分,服务片段22,设置mtpd进程(媒体传输协议)
service mtpd /system/bin/mtpd
    class main
    socket mtpd stream 600 system system
    user vpn
    group vpn net_admin inet net_raw
    disabled
    oneshot


# 第四十九部分,服务片段23,设置keystore进程
service keystore /system/bin/keystore /data/misc/keystore
    class main
    user keystore
    group keystore drmrpc


# 第五十部分,服务片段24,设置dumpstate进程
service dumpstate /system/bin/dumpstate -s
    class main
    socket dumpstate stream 0660 shell log
    disabled
    oneshot


# 第五十一部分,服务片段25,设置mdnsd进程
service mdnsd /system/bin/mdnsd
    class main
    user mdnsr
    group inet net_raw
    socket mdnsd stream 0660 mdnsr inet
    disabled
    oneshot


# 第五十二部分,服务片段26,设置pre-recovery进程
service pre-recovery /system/bin/uncrypt
    class main
    disabled
    oneshot
Android 进阶——系统启动之Android init.rc脚本解析(四) init.rc 脚本结构、基本语法 阅读详情

相关推荐

android6.0 fuse文件系统的挂载和卸载问题

android4.4 的时候vold,也是利用fuse文件系统达到,将sd卡的目录(storage目录)获取sd实际挂载目录(mnt/media_rw)的权限。但是android4.4的时候vold只是写属性而已,然后init监测这个属性,属性改变时,才会去启动sdcard进程。 然后android6.0直接在vold中,fork一个进程直接开启sdcard进程挂载fuse文件系统。并且在卸载s

kc58236582的博客 1万+

在Android操作系统中设置永久环境变量

最近做的工作中,需要在Android操作系统中设置永久环境变量,是在手机中设置永久变量,而不是PC上。 网上搜了下,大部分都是在PC上设置ADB环境变量什么的,然并卵 在源代码中找了下,发现手机虽然是linux,但并不跟我们平常再服务器上见到的linux那样,没有.profile文件用于设置环境变量。 在手机中查了下,查到了/init.environ.rc这个文件,这个文件中设置的环境变量是

Ls4034的专栏 7920

Android init源代码分析(2)init.rc解析

本文描述init.rc脚本解析以及执行过程,读完本章后,读者应能 (1) 了解init.rc解析过程 (2) 定制init.rc init.rc介绍 init.rc是一个文本文件,可认为它是Android系统启动脚本。init.rc文件中定义了环境变量配置、系统进程启动,分区挂载,属性配置等诸多内容。init.rc具

Prife的专栏 5609

android教程学习 第十讲:

这一期呢我们来学习一下Android的启动脚本,也就是init.rc,那么我们首先来看一下我们的init.rc中都包含有哪些内容 我们来看一下init.rc中都包含了哪些内容,先打开init.rc 首先是录入了一些其他的脚本,有我们的init.environ.rc 、init.usb.rc等,剩下的就是我们脚本真正所做的内容了,首先是有一个on early-init

寒冰 789

RK3588安卓系统开机自启动:从广播到init.rc的四种方案与实战

在嵌入式系统与物联网设备开发中,开机自启动是实现设备自主运行、减少人工干预的核心机制。其原理在于操作系统启动流程中预设的钩子或服务管理机制,允许特定应用或进程在系统引导完成后自动执行。这一技术的价值在于保障关键服务(如数据采集、AI推理或人机界面)的即时可用性,是工控机、边缘计算盒子等产品化设备从“开发板”迈向“可靠产品”的关键一步。应用场景广泛覆盖工业自动化、智能零售终端、AIoT网关等领域。针对瑞芯微高性能AIoT芯片RK3588的安卓系统,实现稳定自启动需深入系统层,本文聚焦于**init.rc脚本*

671

在init.rc中增加开机启动服务

1、修改init.project.rc文件 a、打开device/XXX/产品/init.project.rc文件,在on post-fs-data这个动作下面增加 chmod 0755 /system/bin/hellotest b、在文件内很多service的位置附近增加 servicehellotest/system/bin/hellotest class main ...

hismee的博客 3057

init.rc详解

Android启动过程中的init.rc文件解析

m0_49328056的博客 1万+

Android系统 理解/sys/目录权限和UID和GID?

本文介绍了Android中/sys/目录的生成和权限,以及Android中UID和GID的分配和查看。希望本文对你有所帮助。

我其实什么都不会 3487

【Android7.1.2源码解析系列】实战分析init.rc文件

实战分析init.rc文件   前言:经过上一篇的/system/core/init/readme.txt文件的翻译,对于init.rc的语法也有了一定的了解,这一篇就对/system/core/rootdir/init.rc文件进行一个分析,希望能够借此对android的开机过程有一定的了解。   关联文章:init.rc语法翻译、init.rc全流程分析注释 一、综述 1、rc文件

Don't worry,be happy 1506

机场数据治理系列介绍(1):机场行业数据中台中的数据管理顶层设计方案

民航机场行业的数据中台中,有关数据管理顶层设计方案需要结合机场行业的业务特点和技术需求进行具体的设计,今日我们简要考量设计提供一个参考方案:

机场信息系统研究员的专栏 1604

详解卷积神经网络(CNN)

卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。

qq_25762497的博客 25万+

【Android FrameWork】第五天:init加载RC文件

本文基于Android 12+源码,深入分析Init进程加载RC文件的机制。Init进程作为用户空间首个进程,通过解析RC文件(初始化脚本)控制系统启动流程。文章详细阐述了两个关键阶段:1)初始化解析环境(日志系统、文件系统挂载、解析器配置);2)RC文件解析过程(主文件解析、Import指令处理、Service/Action指令解析)。源码分析表明,Init通过Parser类实现指令映射,ServiceParser和ActionParser分别处理服务定义和动作指令,最终将配置存入全局管理类。该机制为理解

u012739527的博客 1850

24届-Python面经(华为OD)

【摘要】24届非科班生通过栗栗姐指导成功转行华为OD。从4月4日零基础准备,经历机考(4/18)、测评(4/19)、资格面(5/7)、技术面(5/9-11)到5月17日获offer。全程栗栗姐提供题库、面经指导和实时跟进。虽遇压力面和技术短板,但在专业辅导下10天走完全流程。案例证明转行需自身努力+优质HR支持,栗栗姐团队提供多岗位(Java/Python等)、多地域(北上深等)OD机会,含笔试资料和全流程攻略。

2401_86909848的博客 1188

Android源码之init.rc文件详解(SELinux详解)

Android源码之init.rc文件详解(SELinux详解)

Android应用开发工程师 2929

2026年全国青少年信息素养大赛算法应用主题赛C++样题及答案解析

2026年全国青少年信息素养大赛算法应用主题赛C++样题

王老师青少年编程 3717

【深度解析】解决 NVIDIA 显卡“掉卡”与 Xid 79 错误:开启持久化模式 (Persistence Mode)

【深度解析】解决 NVIDIA 显卡“掉卡”与 Xid 79 错误:开启持久化模式 (Persistence Mode)

Edward的博客 860

Android 源码解析:深入理解 init.rc 文件

本文深入解析了Android初始化脚本init.rc的核心语法结构。主要介绍了四大核心语句:动作(Action)、命令(Command)、服务(Service)和选项(Option),阐述了其隐式声明机制和命名唯一性规则。重点分析了服务配置的关键参数和重启策略,并以init.zygote32.rc为例详细解读了服务配置实践。文章还系统梳理了常用命令和触发器类型,为理解Android系统启动流程提供了基础支撑。通过掌握这些核心概念,开发者能更深入地了解Android系统的初始化过程。

weixin_47540149的博客 793

【专栏必读】王道考研408计算机网络+湖科大教书匠计算机网络+网络编程万字笔记使用说明及章节导航

本文档汇总了王道考研408计算机网络和湖科大教书匠计算机网络课程的重点内容,包括计算机网络体系结构、物理层、数据链路层、网络层、传输层和应用层的详细讲解。通过ISO/OSI和TCP/IP模型,深入探讨了通信基础、介质访问控制、IP地址、TCP/UDP协议、流量控制和网络编程等关键概念。此外,还提供了Linux网络编程实践,帮助读者巩固理论知识

快乐江湖的博客 2万+

Android Init 系列专题【篇四:Init RC Language解析】

摘要:Android初始化语言(Android Init Language)是构建Native层的基础,主要包含Actions、Commands、Services等五类语句。Actions通过触发器(Trigger)激活命令序列,Services定义后台运行的服务。RC文件分布在/system、/vendor等分区,通过LOCAL_INIT_RC宏配置。APEX模块支持版本化RC文件(如init.31rc)以适应不同SDK版本。关键命令包括启动服务(class_start)、设置属性(setprop)等

qq_27672101的博客 412

[QMT量化交易小白入门]-九十五、多因子选股和趋势择时股票量化交易策略,年化收益率40.61%

本策略采用“双层过滤”机制:第一层基于多维度财务指标进行股票池筛选(多因子选股),第二层运用均线系统和MACD指标实施动态择时(趋势跟踪)。这种设计既保证了组合的质量下限,又能灵活应对市场波动。因子配置科学性:涵盖估值、成长、盈利、动量四大类因子风险控制精细化:设置动态止损与仓位管理机制信号验证严格性:多重条件交叉验证提升胜率。

木头大左的博客 799

BVH2SMPL 实战笔记

BVH2SMPL 实战笔记

jacke121的专栏 843

Android系统启动之init.rc文件解析过程

image.png 目录 第一篇:Android系统启动之bootloader 第二篇:Android系统启动之Init流程(上) 第三篇:Android系统启动之Init流程(下) 第四篇:Android系统启动之init.rc文件解析过程 第五篇:Android系统启动之zyogte进程 第六篇:Android系统启动之zyogte进程java(上) 第七篇:Android系统启动之...

u012739527的博客 648

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

cm-14.1 Android系统启动过程分析(4)-init进程的启动、rc脚本解析、zygote启动、属性服务

前阶段在项目中涉及到了Android系统定制任务,Android系统定制前提要知道Android系统是如何启动的。

Android系统工程师--小馬佩德罗 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

安卓如何设置开机启动某个程序?init.rc给你搞定

Adnroid系统就像是是运行在linux系统上的一个“服务进程”,并不算是一个完整的操作系统。这些服务进程是维持设备正常运转的关键,而这些进程的鼻祖就是init进程。进程ID为1,源代码位于system/core/init 目录。

一口Linux的专栏 3063

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【Android FrameWork】第三天:init进程对service的解析

Android Init进程解析Service的过程分析 本文分析了Android系统中init进程对service配置的解析过程,主要包括以下关键点: 配置文件加载:init进程读取init.rc等配置文件,预处理注释和换行符。 service块识别:当遇到"service"关键字时,进入专用解析模式。 基本信息解析: 检查服务名称唯一性 创建Service对象并初始化名称、路径和启动参数 切换解析状态处理后续属性 详细属性解析: 通过关键字映射表处理不同属性(user、group等)

u012739527的博客 1816

Android的init过程:init.rc解析流程

这几天打算看下安卓的代码,看优秀的源码也是一种学习过程,看源码的过程就感觉到,安卓确实是深受linux内核的影响,不少数据结构的用法完全一致。花了一中午时间,研究了下init.rc解析过程,做个记录。 init.rc 文件并不是普通的配置文件,而是由一种被称为“Android初始化语言”(Android Init Language,这里简称为AIL)的脚本写成的文件。在了解init如何解

GetnextWindow的专栏 2037
上一篇: java jni 数据转换
下一篇: android选取linux作为内核的原因
class_brick
博客等级 码龄12年 223粉丝 76原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值