zoukankan      html  css  js  c++  java
  • Android 4.4 Init进程分析二 :Android初始化语言

    ****************************************************************************

    Android 4.4 init进程分析文章链接

      Android 4.4 Init进程分析一 :Android init进程概述

      Android 4.4 Init进程分析二 :Android初始化语言

      Android 4.4 Init进程分析三:init.rc脚本文件的解析

      Android 4.4 Init进程分析四 :init.rc脚本文件的执行

      Android 4.4 Init进程分析五 :进程的终止与再启动

      Android 4.4 Init进程分析六 :属性服务

    ***************************************************************************

    1 前言

      在Init进程中会去解析init.rc脚本文件来设置系统环境。

      init.rc初始化脚本文件使用Android初始化语言(AIL, Android Init Language)编写而成。关于AIL的语法介绍可以参考源码中的readme.txt,这里面给出了详细的语法说明。

      http://androidxref.com/4.4_r1/xref/system/core/init/readme.txt

      

      本篇文章中,我们也做一些讲解。

    2 Android初始化语言

      Android初始化语言包含四个广泛的陈述类,为Actions(行为),Commands(命令),
    Services(服务)和Options(选项)。

      所有的这些都是基于行的,包括空格分隔符。C风格的反斜杠可以用来插入空格到一个
    命令中。双引号可以被用来阻止空格将文本分割成多个标记。当反斜杠为一行中的最后
    一个字符的时候,可以被用于换行。

      以#开始的行为注释。

      Actions和Services声明一个新的部分。所有的commands和options属于最近声明
    的那个部分。位于第一个部分之前的Commands和Actions是被忽略的。

      Actions和Services用于独一无二的名称。如果有一个Action或Service被声明了一个
    和之前相同名称,则他被忽略为一个错误。

    2.1 行为

      Actions是被命名的命令序列。Actions有一个触发器用来决定什么时候这个action应该发生。
    当一个时间触发了符合一个action的触发器,那么这个action将被添加到要处理队列的
    尾部(除非他已经在队列中了)。

      在队列中的每一个action都是按照顺序出列的,位于那个action中的每一个command
    也是按照顺序执行的。在活动中,初始化处理其他活动(设备创建和销毁,属性设置,
    进程重启)介于commands的运行之间。

      Actions组织形式为:

    1     on <trigger>
    2        <command>
    3        <command>
    4        <command>

    2.2 服务

      服务是,当他们退出的时候,init进程启动和重新启动(可选)的程序。Services的形式为:

    1     service <name> <pathname> [ <argument> ]*
    2        <option>
    3        <option>
    4        ...

    2.3 选项

      选项是服务的调节器。他们影响init进程如何并且何时运行这个服务。

      

     1 critical
     2   这是一个设备关键服务。如果他在四分钟内存在超过四次,设备将会重启进入恢复模式。
     3 
     4 disabled
     5   这个服务将不能与他的类自动启动。他必须通过名称被显示启动。
     6 
     7 setenv <名称> <值>
     8   在启动进程中设置环境变量<名称>到<数值>
     9 
    10 socket <name> <type> <perm> [ <user> [ <group> [ <seclabel> ] ] ]
    11   创建一个unix域套接字,命名为 /dev/socket/<name>,并且传递他的文件描述符fd到启动进程中。
    12   <type>必须是"dgram","stream"或者是"seqpacket"13   User和group默认为0。
    14   'seclabel'是这个套接字的SELinux安全上下文。
    15   他默认为服务安全上下文,由seclabel指定或者是基于服务可执行文件安全上下文计算得来。
    16 
    17 user <username>
    18   在运行这个服务之前改为username(用户名称)。
    19   当前默认为root.目前,如果你的进程需要linux功能,那么你不能使用这个命令。你必须在进程中
    20   请求功能但依然root,然后降级到你期望的uid。
    21 
    22 group <groupname> [ <groupname> ]*
    23   在运行这个服务之前修改为groupname。在第一个之前的组名称被用来设置进程的追加的组(通过setgrooups())
    24   。目前默认为root。
    25 
    26 seclabel <seclabel>
    27   在执行这个服务之前改为seclabel。主要是从rootfs等中被services使用。
    28   位于系统分区的services可以基于他们的文件安全上下文使用策略定义的转换。
    29   如果未被指定或者是在策略中没有转换被定义,默认为初始化上下文。
    30 
    31 oneshot
    32   当他退出的时候不要重启服务。
    33 
    34 class <name>
    35   为服务指定一个类名称。位于一个命名的类中的所有服务一起被启动或停止。
    36   如果服务未被class选项指定,则该服务位于类'default'中。
    37 
    38 onrestart
    39   当services重启的时候运行一个命令。
    40 
    41 writepid <file...>
    42   当子进程被创建的时候,将子进程的pid写入到给定的文件中。意味着cgroup/cpuset
    43   用法。

    2.4 触发器

      触发器是一系列字符串,被用于匹配确定种类的事件,并且被用于出发一个行为。

      

     1 boot
     2    这是第一个触发器,当init进程启动的时候被触发(在/init.conf被加载之后)。
     3 
     4 <name>=<value>
     5    当属性<name>被设置为指定的值<value>的时候,这种形式的触发器被触发。
     6    这个可以测试多个属性去运行一组命令。例如:
     7 
     8    on property:test.a=1 && property:test.b=1
     9        setprop test.c 1
    10 
    11    上面的一小段只有当test.a=1和test.b=1都被设置的时候,才会设置test.1为1。

    2.5 命令

      1 bootchart_init
      2    如果被配置的话,开启bootcharting。他被默认包含在init.rc中。
      3 
      4 chmod <octal-mode> <path>
      5    修改文件访问权限。
      6 
      7 chown <owner> <group> <path>
      8    修改文件拥有者和组。
      9 
     10 class_start <serviceclass>
     11    如果他们没有运行的话,启动所有指定类的服务。
     12 
     13 class_stop <serviceclas
     14    如果他们当前正在运行的话,停止并且禁用所有指定类的服务。
     15 
     16 class_reset <serviceclass>
     17    如果他们正在运行的话,停止所有指定类的服务,并不禁用他们。后期他们使用
     18    class_start被重新启动。
     19 
     20 copy <src> <dst>
     21    复制一个文件。类似于写,但是对二进制/大数量数据是有用的。
     22 
     23 domainname <name>
     24    设置域名称。
     25 
     26 enable <servicename>
     27    将一个禁用的服务转换为可用,好像这个服务并没有被指定禁用过。
     28    如果服务期望去运行,他将会现在被启动。特别是当bootloader设置了一个变量来指示一个指定
     29    的服务应该在被需要的时候启动。
     30       on property:ro.boot.myfancyhardware=1
     31         enable my_fancy_service_for_my_fancy_hardware
     32 
     33 exec [ <seclabel> [ <user> [ <group> ]* ] ] -- <command> [ <argument> ]*
     34    使用给定的参数创建并且执行命令。这个命令在"--"之后运行,所以一个可选的安全上下文,用户,
     35    和追加的组可以被提供。在这个结束之前没有其他的命令可以被运行。<seclabel>可以被一个- 36    指定为默认。
     37 
     38 export <name> <value> 
     39    在全局环境中设置环境变量<name>等于<value>。(这个命令执行之后启动的所有
     40    进程都将继承他。)
     41 
     42 hostname <name>
     43    设置主机名
     44 
     45 ifup <interface>
     46    将网络接口<interface>联机。
     47 
     48 import <filename>
     49    解析一个初始化配置文件,扩展当前的配置。
     50 
     51 insmod <path>
     52    在<path>中安装模块
     53 
     54 load_all_props
     55    从/system,/vendor等中加载属性。这个被包含在默认的init.rc中。
     56 
     57 load_persist_props
     58    当/data被加密之后,加载持久化的属性。
     59    这个被包含在默认的init.rc中。
     60 
     61 loglevel <level>
     62    一层一层的设置内核日志。属性被扩展到<level>中。
     63 
     64 mkdir <path> [mode] [owner] [group]
     65    在路径<path>中创建一个目录,可选的使用给定的模式,所有者和组。如果没有提供,该目录则
     66    以权限755被创建并且以root用户为拥有者和以root为组。如果提供了,模式,所有者和组将会被
     67    更新,如果该目录已经存在的话。
     68 
     69 mount_all <fstab>
     70    在给定的fs_mgr-format fstab中调用fs_mgr_mount_all。
     71 
     72 mount <type> <device> <dir> [ <flag> ]* [<options>]
     73    尝试在目录<dir>中挂载命名的设备。<device>可以是mtd@name的形式来通过名称
     74    指定一个mtd块设备。
     75    <flag>s包含"ro","rw","remount","noatime"等。
     76    <options>包含"barrier=1", "noauto_da_alloc", "discard"等作为一个逗号分离的字符串。例如,
     77     barrier=1,noauto_da_alloc
     78 
     79 powerctl
     80    内部实现系统用来响应改变"sys.powerctl"属性,用于实现重启。
     81 
     82 restart <service>
     83    类似于stop,但是并不禁用服务。
     84 
     85 restorecon <path> [ <path> ]*
     86    重新以file_contexts配置中指定的安全上下文来将文件重新以<path>存储。
     87    不需要被init.rc创建的目录,因为这些都是被init初始化进程自动正确标记的。
     88 
     89 restorecon_recursive <path> [ <path> ]*
     90    递归的重新以名称<path>将目录树保存到安全上下文中,这个安全上下文由
     91    file_contexts配置指定。
     92 
     93 rm <path>
     94    在指定的路径调用unlink(2)。你可能想要使用"exec -- rm ..."(提供的系统
     95    分区已经被挂载了)。
     96 
     97 rmdir <path>
     98    对给定的目录调用rmdir(2)
     99 
    100 setprop <name> <value>
    101    这是系统属性<name>到<value>。属性被扩展到<value>102 
    103 setrlimit <resource> <cur> <max>
    104    为一个资源设置rlimit。
    105 
    106 start <service>
    107    开启一个服务运行,如果这个服务没有运行的话。
    108 
    109 stop <service>
    110    从运行的服务中停止一个服务,如果这个服务正在运行的话。
    111 
    112 swapon_all <fstab>
    113    对给定的fstab文件执行fs_mgr_swapon_all
    114 
    115 symlink <target> <path>
    116    使用值<target>在<path>中创建一个符号链接。
    117 
    118 sysclktz <mins_west_of_gmt>
    119    设置系统时钟基础(如果系统时钟在格林尼治时间为0)
    120 
    121 trigger <event>
    122     触发一个事件。用于从另一个动作中排队一个动作。
    123 
    124 verity_load_state
    125    内部实现细节用于加载dm-verity状态。
    126 
    127 verity_update_state <mount_point>
    128   内部实现细节用于更新dm-verity状态并且设置分区。<mount_point>被adb remount
    129    使用来验证属性,因为fm_mgr不能直接自己设置他们。
    130 
    131 wait <path> [ <timeout> ]
    132    轮询给定文件的存在性,并且当找到的时候返回,或者是到达超时状态。
    133    如果超时未被指定,则默认为5秒。
    134 
    135 write <path> <content>
    136    在路径<path>中打开文件,并且使用write(2)写一个字符串进去。
    137    如果文件不存在,他将被创建。如果文件存在,他将被覆盖。属性在<content>
    138     被扩展。

    2.6 属性

      init进程更新一些系统属性,并且提供一些他要干什么的信息:

      

    1 init.action
    2    相当于当前被执行的action的名称,如果不存在则为""3 
    4 init.command
    5    相当于当前被运行的command,如果没有则为""6 
    7 init.svc.<name>
    8    一个被命名的服务的状态("停止","运行","重启")。

    2.7 Example

     1 Example init.conf
     2 -----------------
     3 
     4 # not complete -- just providing some examples of usage
     5 #
     6 on boot
     7    export PATH /sbin:/system/sbin:/system/bin
     8    export LD_LIBRARY_PATH /system/lib
     9 
    10    mkdir /dev
    11    mkdir /proc
    12    mkdir /sys
    13 
    14    mount tmpfs tmpfs /dev
    15    mkdir /dev/pts
    16    mkdir /dev/socket
    17    mount devpts devpts /dev/pts
    18    mount proc proc /proc
    19    mount sysfs sysfs /sys
    20 
    21    write /proc/cpu/alignment 4
    22 
    23    ifup lo
    24 
    25    hostname localhost
    26    domainname localhost
    27 
    28    mount yaffs2 mtd@system /system
    29    mount yaffs2 mtd@userdata /data
    30 
    31    import /system/etc/init.conf
    32 
    33    class_start default
    34 
    35 service adbd /sbin/adbd
    36    user adb
    37    group adb
    38 
    39 service usbd /system/bin/usbd -r
    40    user usbd
    41    group usbd
    42    socket usbd 666
    43 
    44 service zygote /system/bin/app_process -Xzygote /system/bin --zygote
    45    socket zygote 666
    46 
    47 service runtime /system/bin/runtime
    48    user system
    49    group system
    50 
    51 on device-added-/dev/compass
    52    start akmd
    53 
    54 on device-removed-/dev/compass
    55    stop akmd
    56 
    57 service akmd /sbin/akmd
    58    disabled
    59    user akmd
    60    group akmd

    2.8 Debugging init

      ---------------
      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

    =========

    888888888

    =========

  • 相关阅读:
    How Many Tables 并查集(求有几个集合)
    Spell checker 字典树&&普通查找(加计数)
    昂贵的聘礼 dijstra算法(要枚举源点)
    All in All 找子串 水题
    Ultra-QuickSort 求逆序对 归并排序
    Snowflake Snow Snowflakes 根据相似度排序,有点暴力
    Gold Balanced Lineup hash函数,第一次接触,借鉴了大神的博客思想,看了很久才看懂,弱菜啦
    Stockbroker Grapevine 裸的floyd算法,求最大中的最小
    Check the difficulty of problems 概率dp,概率知识很重要
    [leetcode] Valid Anagram 、 Find All Anagrams in a String
  • 原文地址:https://www.cnblogs.com/roger-yu/p/12199011.html
Copyright © 2011-2022 走看看