init.rc深入学习

来源:互联网 发布:学案例 明底线 知敬畏 编辑:程序博客网 时间:2024/06/06 09:51

    • 语法部分
      • actions
      • service
      • options
      • commandscommands
    • initrc的变化
      • initcpp
      • LOCAL_INIT_RC

语法部分

init.rc是一个可配置的初始化文件,在init.rc文件中一条语句通常是占据一行.单词之间是通过空格符来相隔的.如果需要在单词内使用空格,那么得使用转义字符”\”,如果在一行的末尾有一个反斜杠,那么是换行折叠符号,应该和下一行合并成一起来处理,这样做主要是为了避免一行的字符太长,与C语言中的含义是一致的。注释是以#号开头。

包含4种状态类别:Actions/Commands/Services/Options

Action和services显式声明了一个语句块,而commands和options属于最近声明的语句块。在第一个语句块之前 的commands和options会被忽略.当声明一个service或者action的时候,它将隐式声明一个section,它之后跟随的command或者option都将属于这个section,action和service不能重名,否则忽略为error。

1. actions

actions就是在某种条件下触发一系列的命令commands,通常有一个trigger,形式如:

 on <trigger>     <command>     <command>
触发器 描述 boot 当init程序执行,并载入/init.conf文件时触发. name=value 当属性名对应的值设置为指定值时触发. device-added- 当添加设备时触发. device-removed- 当设备移除时触发. service-exited- 当指定的服务退出时触发.


例如:

on init    sysclktz 0    # Mix device-specific information into the entropy pool    copy /proc/cmdline /dev/urandom    copy /default.prop /dev/urandom    # Backward compatibility.    symlink /system/etc /etc    symlink /sys/kernel/debug /d    # Link /vendor to /system/vendor for devices without a vendor partition.    symlink /system/vendor /vendor    # Mount cgroup mount point for cpu accounting    mount cgroup none /acct cpuacct    mkdir /acct/uid    # Create energy-aware scheduler tuning nodes    mkdir /dev/stune    mount cgroup none /dev/stune schedtune    mkdir /dev/stune/foreground    mkdir /dev/stune/background    mkdir /dev/stune/top-app    chown system system /dev/stune    chown system system /dev/stune/foreground

2. service

service结构如下:

service <name> <pathname> [ <argument> ]*     <option>     <option>

例如:

service drm /system/bin/drmserver    class main    user drm    # Add drmserver access sdcard and internal storage permission    group drm system inet drmrpc readproc sdcard_rw media_rw    writepid /dev/cpuset/foreground/tasks

3. options

选项是用来修改服务的。它们影响如何及何时运行这个服务.

选项 描述 critical 据设备相关的关键服务,如果在4分钟内,此服务重复启动了4次,那么设备将会重启进入还原模式。 disabled 服务不会自动运行,必须显式地通过服务器来启动。 setenv 设置环境变量 socket [ [ ] ] 在/dev/socket/下创建一个unix domain的socket,并传递创建的文件描述符fd给服务进程.其中type必须为dgram或stream,seqpacket.用户名和组名默认为0 user 在执行此服务之前先切换用户名。当前默认为root. group [ ]* 类似于user,切换组名 oneshot 当此服务退出时不会自动重启. class 给服务指定一个类属,这样方便操作多个服务同时启动或停止.默认情况下为default. onrestart 当服务重启时执行一条指令,
service bootanim /system/bin/bootanimation    class core  //给服务指定一个类属,这样方便操作多个服务同时启动或停止    user graphics //在执行此服务之前先切换用户名    group graphics audio    disabled  //服务不会自动运行    oneshot  //当此服务退出时不会自动重启

4. commandscommands

命令 描述 exec [ ]* 执行指定路径下的程序,并传递参数. export 设置全局环境参数,此参数被设置后对所有进程都有效. ifup 使指定的网络接口”上线”,相当激活指定的网络接口 import 导入一个额外的init配置文件. hostname 设置主机名 chdir 改变工作目录. chmod 改变指定文件的读取权限. chown 改变指定文件的拥有都和组名的属性. chroot 改变进行的根目录. class_start 启动指定类属的所有服务,如果服务已经启动,则不再重复启动. class_stop 停止指定类属的所胡服务. domainname 设置域名 insmod 安装模块到指定路径. mkdir [mode] [owner] [group] 用指定参数创建一个目录,在默认情况下,创建的目录读取权限为755.用户名为root,组名为root. mount [ ]* 类似于linux的mount指令 setkey TBD(To Be Determined), 待定. setprop 设置属性及对应的值. setrlimit 设置资源的rlimit(资源限制),不懂就百度一下rlimit start 如果指定的服务未启动,则启动它. stop 如果指定的服务当前正在运行,则停止它. symlink 创建一个符号链接. sysclktz 设置系统基准时间. trigger Trigger an event. Used to queue an action from another action.这名话没有理解,望高手指点. write [ ]* 往指定的文件写字符串.

属性(Properties)
init程序在运行时会更新属性系统的一些属性,提供程序内部正在执行的信息.

属性名 描述 init.action 当前正在执行的动作,如果没有则为空字符串”“ init.command 当前正在执行的命令.没有则为空字符串. init.svc. 当前某个服务的状态,可为”stopped”, “running”, “restarting”

init.rc的变化

在Android 7之前的版本中,系统Native服务,不管它们的可执行文件位于系统什么位置都定义在根分区的init.*.rc文件中。这造成init*.rc文件臃肿庞大,给维护带来了一些不便,而且其中定义的一些服务的二进制文件根本不存在。

但在Android 7.0以后,对该机制做了一些改变 。

init.cpp

/system/core/init/init.cpp中解析rc文件

int main(int argc, char** argv){...  Parser& parser = Parser::GetInstance();    parser.AddSectionParser("service",std::make_unique<ServiceParser>());    parser.AddSectionParser("on", std::make_unique<ActionParser>());    parser.AddSectionParser("import", std::make_unique<ImportParser>());    std::string bootscript = GetProperty("ro.boot.init_rc", "");    if (bootscript.empty()) {        parser.ParseConfig("/init.rc");        parser.set_is_system_etc_init_loaded(                parser.ParseConfig("/system/etc/init"));        parser.set_is_vendor_etc_init_loaded(                parser.ParseConfig("/vendor/etc/init"));        parser.set_is_odm_etc_init_loaded(parser.ParseConfig("/odm/etc/init"));    } else {        parser.ParseConfig(bootscript);        parser.set_is_system_etc_init_loaded(true);        parser.set_is_vendor_etc_init_loaded(true);        parser.set_is_odm_etc_init_loaded(true);    }}

可见单一的init*.rc,被拆分,服务根据其二进制文件的位置(/system,/vendor,/odm)定义到对应分区的etc/init目录中,每个服务一个rc文件。

/system/etc/init 包含系统核心服务的定义,如SurfaceFlinger、MediaServer、Logcatd等。 /vendor/etc/init SOC厂商针对SOC核心功能定义的一些服务。比如高通、MTK某一款SOC的相关的服务。 /odm/etc/init OEM/ODM厂商如小米、华为、TCL其产品所使用的外设以及差异化功能相关的服务。

下图为AndroidO 手机/system/etc/init目录下定义的服务

这里写图片描述

LOCAL_INIT_RC

提供一个编译宏LOCAL_INIT_RC用于将服务相关的RC文件编译到相应位置。
例如drmserver的Android.mk中,通过LOCAL_INIT_RC将drmserver对应的drmserver.rc编译到/system/etc/init目录中。
frameworks/av/drm/drmserver/Android.mk

LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES:= \    main_drmserver.cpp \    DrmManager.cpp \    DrmManagerService.cppLOCAL_SHARED_LIBRARIES := \    libmedia \    libutils \    liblog \    libbinder \    libdl \    libselinuxLOCAL_STATIC_LIBRARIES := libdrmframeworkcommonLOCAL_C_INCLUDES := \    $(TOP)/frameworks/av/include \    $(TOP)/frameworks/av/drm/libdrmframework/include \    $(TOP)/frameworks/av/drm/libdrmframework/plugins/common/include# Add for OMA DRM v1.0 implementation, call whitelist check api in DrmMtkUtil {@ifeq ($(strip $(MTK_DRM_APP)),yes)  ifeq ($(strip $(MTK_OMADRM_SUPPORT)),yes)    LOCAL_CFLAGS += -DMTK_OMA_DRM_SUPPORT    LOCAL_SHARED_LIBRARIES += \        libdrmmtkutil    LOCAL_C_INCLUDES += \        $(MTK_PATH_SOURCE)/frameworks/av/drm/include  else ifeq ($(strip $(MTK_CTA_SET)),yes)    LOCAL_CFLAGS += -DMTK_CTA_DRM_SUPPORT    LOCAL_SHARED_LIBRARIES += \        libdrmmtkutil    LOCAL_C_INCLUDES += \        $(MTK_PATH_SOURCE)/frameworks/av/drm/include  endifelse ifeq ($(strip $(MTK_WVDRM_SUPPORT)),yes)    LOCAL_CFLAGS += -DMTK_WV_DRM_SUPPORT    LOCAL_SHARED_LIBRARIES += \        libdrmmtkutil    LOCAL_C_INCLUDES += \        $(MTK_PATH_SOURCE)/frameworks/av/drm/includeendif# @}LOCAL_CFLAGS += -Wall -Wextra -WerrorLOCAL_MODULE:= drmserverLOCAL_MODULE_TAGS := optionalLOCAL_32_BIT_ONLY := trueLOCAL_INIT_RC := drmserver.rcinclude $(BUILD_EXECUTABLE)
原创粉丝点击