init.rc_root/init.rc-程序员宅基地

技术标签: Android  

在Android中使用启动脚本init.rc,可以在系统的初始化中进行简单的操作。

init.rc启动脚本路径:system/core/rootdir/init.rc

内容:

  • Commands:命令
  • Actions:动作
  • Triggers:触发条件
  • Services:服务
  • Options:选项
  • Properties:属性

Commands是一些基本操作。如:

    mkdir /system
    mkdir /data 0771 system system
    mkdir /persist 0771 system system
    devwait /dev/block/mmcblk0p12
    mount ext3 /dev/block/mmcblk0p

Action表示一系列命令,通常在Triggers中调用,如:


    on init           //表示一个触发条件

    sysclktz 0

    loglevel 3

    # setup the global environment
    export PATH /sbin:/system/sbin:/system/bin:/system/xbin
    export LD_LIBRARY_PATH /system/lib
    export ANDROID_BOOTLOGO 1

Services通常表示启动一个可执行程序,Options是服务的附加内容,用于配合服务使用。

    service vold /system/bin/vold      //vold是服务名称,/system/bin/vold是所对应的可执行程序。
    socket vold stream 0660 root mount   //socket是配合服务使用的选项
    ioprio be 2

    service netd /system/bin/netd
    socket netd stream 0660 root system

配合服务使用的选项有socket,user,group,oneshot。

oneshot表示该服务只启动一次,而如果没有oneshot选项,这个可执行程序将一直存在——如果可执行程序被杀死,则会重新启动。

Properties是系统中使用的一些值,可以进行设置和读写。

    setprop ro.HIDDEN_APP_MEM 5120         //setprop用于设置属性
    setprop ro.CONTENT_PROVIDER_MEM 5632
    setprop ro.EMPTY_APP_MEM 6144

    ...

    on property:ro.kernel.qemu=1       //on property用于判断属性
    start adbd

这里的属性在整个android系统运行中都是一致的。

init脚本的关键字可以参考init进程中的system/core/init/keyword.h文件。如:

KEYWORD(chroot,      COMMAND, 1, do_chroot)     //chroot是命令,do_chroot()是调用的函数,这个函数在init进程中的system/core/init/builtins.c文件中定义。

 

init.rc使用方法,见说明文件system/core/init/readme.txt 



Android init.rc (Android init language)

Android初始化语言由四大类声明组成:行为类(Actions),命令类(Commands),服务类(Services),选项类(Options).

  * 初始化语言以行为单位,由以空格间隔的语言符号组成。C风格的反斜杠转义符可以用来插入空白到语言符号。双引号也可以用来防止文本被空格分成多个语言符号。当反斜杠在行末时,作为折行符。

  * #开始(前面允许有空格)的行为注释行。

  * ActionsServices隐含声明一个新的段落。所有该段落下CommandsOptions的声明属于该段落。第一段落前的CommandsOptions被忽略。

  * ActionsServices拥有独一无二的命名。在它们之后声明相同命名的类将被当作错误并忽略。

Actions

-------

Actions是一系列命令的命名。Actions拥有一个触发器(trigger)用来决定action何时执行。当一个action在符合触发条件被执行时,如果它还没被加入到待执行队列中的话,则加入到队列最后。

队列中的action依次执行,action中的命令也依次执行。Init在执行命令的中间处理其它活动(设备创建/销毁,property设置,进程重启)

Actions表现形式为:

on <trigger>

   <command>

   <command>

   <command>

 

Services

--------

Services是由init启动,在它们退出时重启(可选)Service表现形式为:

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

   <option>

   <option>

   ...

  

Options

-------

OptionsServices的修饰,它们影响init何时、如何运行service.

 

critical

     这是一个设备关键服务(device-critical service) .如果它在4分钟内退出超过4次,设备将重启并进入恢复模式。

 

disabled

     这个服务的级别将不会自动启动,它必须被依照服务名指定启动才可以启动。

 

setenv <name> <value>

     设置已启动的进程的环境变量<name>的值<value>

 

socket <name> <type> <perm> [ <user> [ <group> ] ]

     创建一个名为/dev/socket/<name>unix domin socket,并传送它的fd到已启动的进程。<type>必须为"dgram""stream".用户和组默认为0.

 

user <username>

     在执行服务前改变用户名。当前默认为root.如果你的进程需要linux能力,你不能使用这个命令。你必须在还是root时请求能力,并下降到你需要的uid.

 

group <groupname> [ <groupname> ]*

     在执行服务前改变组。在第一个组后的组将设为进程附加组(通过setgroups()).当前默认为root.

 

oneshot

     在服务退出后不重启。

 

class <name>

     service指定一个类别名。同样类名的所有的服务可以一起启动或停止。如果没有指定类别的服务默认为"default"类。

 

onrestart

       当服务重启时执行一个命令。

 

Triggers

--------

     Triggers(触发器)是一个字符串,可以用来匹配某种类型的事件并执行一个action

 

boot

     这是当init开始后执行的第一个触发器(/init.conf被加载)

 

<name>=<value>

     property <name>被设为指定的值<value>时触发。

 

device-added-<path>

device-removed-<path>

     当设备节点被添加或移除时触发。

 

service-exited-<name>

     当指定的服务存在时触发

 

 

Commands

--------

 

exec <path> [ <argument> ]*

     Fork并执行一个程序(<path>).这将被block直到程序执行完毕。最好避免执行例如内建命令以外的程序,它可能会导致init被阻塞不动。

 

export <name> <value>

     设定全局环境变量<name>的值<value>,当这个命令执行后所有的进程都可以取得。

 

ifup <interface>

     使网络接口<interface>联机。

 

import <filename>

     解析一个init配置文件,扩展当前配置文件。

 

hostname <name>

     设置主机名

 

chmod <octal-mode> <path>

     改变文件访问权限

 

chown <owner> <group> <path>

     改变文件所属和组

 

class_start <serviceclass>

     当指定类别的服务没有运行,启动该类别所有的服务。

 

class_stop <serviceclass>

     当指定类别的服务正在运行,停止该类别所有的服务。

 

domainname <name>

     设置域名。

 

insmod <path>

     加载该路径<path>的模块

 

mkdir <path> [mode] [owner] [group]

     <path>创建一个目录,可选选项:mod,owner,group.如果没有指定,目录以755权限,ownerroot,grouproot创建.

 

mount <type> <device> <dir> [ <mountoption> ]*

     尝试mount <device>到目录<dir>. <device>可以用mtd@name格式以命名指定一个mtd块设备。<mountoption>包含"ro","rw","remount","noatime".

 

setkey

     暂时没有

 

setprop <name> <value>

     设置系统property <name>的值<value>.

 

setrlimit <resource> <cur> <max>

     设置resourcerlimit.

 

start <service>

     启动一个没有运行的服务。

 

stop <service>

     停止一个正在运行的服务。

 

symlink <target> <path>

     创建一个<path>的符号链接到<target>

 

sysclktz <mins_west_of_gmt>

     设置系统时区(GMT0)

 

trigger <event>

     触发一个事件。用于调用其它action

 

write <path> <string> [ <string> ]*

     打开<path>的文件并写入一个或多个字符串。

 

 

Properties

----------

Init会更新一些系统property以提供查看它正在干嘛。

init.action

     当前正在执行的action,如果没有则为""

 

init.command

     被执行的命令,如果没有则为""

 

init.svc.<name>

     命名为<name>的服务的状态("stopped", "running", "restarting")

 

 

init.rc 示例:

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

 

# 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

 

调试

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

默认情况下,init执行的程序输出的信息和错误到/dev/null.为了debug,你可以通过Android程序logwrapper执行你的程序。这将复位向输出/错误输出到Android logging系统(通过logcat访问)

例如

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



Android初始化脚本语言包含四种类型的语句:

    * 动作(Actions)
    * 指令(Commands)
    * 服务(Services)
    * 选项(Options)
该语言的语法包括下列约定:
    * 所有类型的语句都是基于行(line-oriented)的,一个语句包含若干个tokens,token之间通过空格字符分隔. 如果一个token中需要包含空格字符,则需要通过C语言风格的反斜线('/')来转义,或者使用双引号把整个token引起来。反斜线还可以出现在一行的末尾,表示下一行的内容仍然属于当前语句。
    * 以'#'开始的行是注释行。
    * 动作(Actions)和服务(Services)语句隐含表示一个新的段落(section)的开始。 所有的指令(commands)和选项(options)归属于上方最近的一个段落。在第一个段落之前的指令(commands)和选项(options)是无效的。
    * 动作(Actions)和服务(Services)拥有唯一性的名字。如果出现重名,那么后出现的定义将被作为错误忽略掉。

动作(Actions)
动作(Actions)是一个有名字的指令(commands)序列。每个动作(Actions)都定义一个触发条件(trigger),用于指示什么时候执行这个动作。当与动作的触发器匹配的事件发生时,该动作将被添加到一个即将被执行的队列的队尾(除非它已经在队列中)。
队列中的每一个动作被依次取出执行,动作中的每一个指令也将依次执行。初始化程序(Init)在执行一个动作的各项指令的期间,还需要处理其它操作(比如,设备创建/销毁,属性设置,进程重启)。
一个动作定义的形式如下:

on <trigger>
  <command>
  <command>
  <command>

服务(Services)
服务是初始化程序需要启动的一些程序,初始化程序还有可能会在这些程序退出之后重启它们。Services take 一个服务定义的形式如下:
  service <name> <pathname> [ <argument> ]*
  <option>
  <option>
  ...

选项(Options)
选项将影响控制初始化程序运行服务的时机和方法。可能的选项如下表。
选项     说明
disabled     This service will not automatically start with its class. It must be explicitly started by name.
socket <name> <type>  <perm> [ <user> [ <group> ] ]     Create a unix domain socket named /dev/socket/<name> and pass its fd to the launched process. Valid <type> values include dgram and stream . user and group default to 0.
user <username>     Change to username before exec'ing this service. Currently defaults to root.
group <groupname> [ <groupname> ]*     Change to groupname before exec'ing this service.  Additional  groupnames beyond the first, which is required, are used to set additional groups of the process (with setgroups() ). Currently defaults to root.
capability [ <capability> ]+     Set linux capability before exec'ing this service
oneshot     Do not restart the service when it exits.
class <name>     Specify a class name for the service.  All services in a named class must start and stop together. A service is considered of class "default" if one is not specified via the class option.


触发器(Triggers)
触发器是一个字符串,用于匹配特定的事件,这些事件将触发触发器所属动作(Actions)的执行。
触发器     说明
boot     This is the first trigger that occurs 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)
Command     Description
exec <path> [ <argument> ]*     Fork and execute a program (<path> ). This will block until the program completes execution. Try to avoid exec. Unlike the builtin commands, it runs the risk of getting init "stuck".
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.
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.
insmod <path>     Install the module at <path> .
mkdir <path>     Make a directory at <path> .
mount <type> <device> <dir> [ <mountoption> ]*     Attempt to mount the named device at the directory <dir> <device> . This may be of the form mtd@name to specify a mtd block device by name.
setkey     - currenlty undefined -
setprop <name> <value>     Set system property <name> to <value> .
setrlimit <resource> <cur> <max>     Set the rlimit for a resource.
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> .
write <path> <string> [ <string> ]*     Open the file at <path> and write one or more strings to it with write(2).

属性(Properties)
初始化程序(Init)可以根据需要修改一些系统的属性。
属性     说明
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", or "restarting").

init.rc文件示例
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
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhou8572/article/details/9496229

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法