江阴青阳道路建设网站,百度推广入口,网站策划编辑的职责,刀具东莞网站建设Android Init Language 安卓初始化语言#xff0c;是一种用于配置和管理 Android 系统服务的专用脚本语言。主要用于编写 .rc 文件#xff08;比如我们熟知的init.rc文件#xff09;#xff0c;这些文件在系统启动时由 init 进程读取和执行#xff0c;从而设置和启动系统服…Android Init Language 安卓初始化语言是一种用于配置和管理 Android 系统服务的专用脚本语言。主要用于编写 .rc 文件比如我们熟知的init.rc文件这些文件在系统启动时由 init 进程读取和执行从而设置和启动系统服务、管理权限、定义设备节点等。
一.基本语法和结构
Android Init Language有五大类组成Actions, Commands, Services, Options, Imports下面分别介绍这几类的语法结构
1、Actions
Actions表示一组Commands命令它具有触发器triggertrigger用于确定何时执行这个Action。当发生与Action触发器匹配的事件时该动作将添加到待执行队列的尾部除非该动作已经在队列中。
Action的格式为
on trigger [ trigger]*commandcommandcommand
Action以on开始接着定义触发器(trigger)然后定义需要执行的命令(Commmand)
当发生与触发器匹配的事件时Action中的命令会被执行。
一个Action例子
on bootsetprop a 1setprop b 2on boot property:truetruesetprop c 1setprop d 2on bootsetprop e 1setprop f 2
当boot trigger 发生并且属性 true 等于 true则执行的命令的顺序将是
setprop a 1
setprop b 2
setprop c 1
setprop d 2
setprop e 1
setprop f 2
在boot trigger 发生但是属性 true 不为 true则执行的命令的顺序将是
setprop a 1
setprop b 2
setprop e 1
setprop f 2 1.1 trigger
触发器用于匹配某些类型的事件并用于引起actions发生。触发器分为事件触发器和属性触发器。
事件触发器是由“trigger”命令或 init 可执行文件中的 QueueEventTrigger() 函数触发的字符串。它们采用简单字符串的形式例如“boot”或“late-init”。
属性触发器是当命名属性的值更改为给定的新值或当命名属性的值更改为任何新值时触发的字符串。它们分别采用“property:namevalue”和“property:name*”的形式。
一个操作可以有多个属性触发器但只能有一个事件触发器。
Android系统常见的事件触发器有
early-init 初始化的第一个阶段在配置 cgroups 之后但在 ueventd 的冷启动完成之前触发。init 在init进程启动后触发。charger 如果 ro.bootmode charger设备处于充电模式则触发。late-init 如果 ro.bootmode ! charger或通过 healthd 从充电模式触发启动则触发。
early-fs 启动 vold。fs Vold 已启动。挂载未标记为第一阶段或 latemounted 的分区。post-fs 配置任何依赖于早期挂载的内容。late-fs 挂载标记为 latemounted 的分区。post-fs-data 挂载并配置 /data设置加密。如果无法在第一阶段初始化中挂载 /metadata则在此重新格式化。zygote-start 启动 zygote。early-boot 在 zygote 启动之后。boot 在早期启动操作完成后。 2、Commands
Commands表示一组命令是在Actions中需要执行的部分Android Init Language里定义了很多种类的命令
命令类型介绍实例bootchart [start|stop]启动/停止 bootcharting。这些命令存在于默认的 init.rc 文件中但只有文件 /data/bootchart/enabled 存在时bootcharting 才会处于活动状态否则 bootchart start/stop 为无操作。 bootchart start启动bootcharting bootchart stop停止bootcharting chmod octal-mode path更改文件访问权限。 chmod 0773 /data/misc/trace 更改trace文件权限为0773 chown owner group path更改文件所有者和组。chown root system /dev/memcg/memory.pressure_level更改memory.pressure_level的所有者为root,所属组为systemclass_start serviceclass指定类的所有服务尚未运行则启动它们class_start early_hal启动early_hal类的所有服务class_stop serviceclass指定类的所有服务当前正在运行则停止并禁用它们。class_stop charger停止并禁用charger的所有服务class_reset serviceclass指定类的所有服务当前正在运行则停止它们但不禁用它们。稍后可以使用 class_start 重新启动它们class_restart [--only-enabled] serviceclass重新启动指定类的所有服务。如果指定了 --only-enabled则跳过已禁用的服务。copy src dst复制文件copy /data/system/entropy.dat /dev/urandom将entropy.dat文件复制到urandom下copy_per_line src dst逐行复制文件。类似于 copydomainname name设置域名domainname localdomain设置localdomain域名enable servicename启用服务exec [ seclabel [ user [ group\* ] ] ] -- command [ argument\* ]用于执行指定命令会启动一个新的进程来运行指定的命令。该命令在“--”之后开始以便可以提供可选的安全上下文、用户和补充组 exec -- /system/bin/log -t TriggerWatchdog Starting trigger_watchdog执行一个日志记录操作/system/bin/log 工具启动一个新的进程来记录日志消息-t TriggerWatchdog 表示设置日志标签为 TriggerWatchdog将消息 Starting trigger_watchdog 写入系统日志。 这个命令表示执行 log 工具将带有标签 TriggerWatchdog 的消息 Starting trigger_watchdog 写入系统日志中 exec_background [ seclabel [ user [ group\* ] ] ] -- command [ argument\* ]与 exec 命令类似。不同之处在于init 不会停止执行命令直到 exec_background 进程退出。exec_start service启动给定服务并停止处理其他 init 命令直到它返回。该命令的功能类似于 exec 命令但使用现有服务定义代替 exec 参数向量exec_start rebooting_service执行名为 rebooting_service 的命令或脚本export name value将环境变量 name 设置为全局环境中的值export DOWNLOAD_CACHE /data/cache将 DOWNLOAD_CACHE 环境变量设置为 /data/cache 目录的路径。这意味着在整个系统或在使用这个环境变量的服务的上下文中DOWNLOAD_CACHE 变量将会指向 /data/cache 目录。hostname name设置主机名。ifup interface使网络接口联机。ifup lo启动本地回环接口 loinsmod [-f] path [options]使用指定选项在路径上安装模块。-f即使正在运行的内核版本与编译模块的内核版本不匹配也强制安装模块。interface_start name \ interface_restart name \ interface_stop name查找提供接口名称的服务如果存在并分别对其运行 start、restart 或 stop 命令load_exports path打开 path 处的文件并导出在那里声明的全局环境变量。每行必须采用上面所述的 export name value 格式。load_persist_props在 /data 解密后加载persist属性loglevel level设置日志级别。从 7所有日志到 0仅致命日志mark_post_data用于标记 /data 分区已被挂载之后的特定点,这个标记对于确保在 /data 分区准备好之后再执行相关操作非常重要mkdir path [mode] [owner] [group] [encryptionaction] [keykey]在 path 处创建一个目录可选地使用给定的模式、所有者和组mount type device dir [ flag\* ] [options]尝试将指定的设备挂载到目录 dirperform_apex_config在 APEX 挂载后执行任务restart [--only-if-running] service停止并重新启动正在运行的服务如果服务当前正在重新启动则不执行任何操作。如果指定了“--only-if-running”则只有在服务已运行时才会重新启动。restorecon path [ path\* ]将路径命名的文件恢复到 file_contexts 配置中指定的安全上下文restorecon --recursive --skip-ce /data恢复 /data 目录及其所有子目录和文件的 SELinux 安全上下文。--recursive这个选项告诉 restorecon 命令递归地处理指定目录及其子目录中的所有文件restorecon_recursive path [ path\* ]将路径指定的目录树递归恢复到 file_contexts 配置中指定的安全上下文。 restorecon_recursive /mnt 恢复 /mnt 目录及其所有子目录的 SELinux 安全上下文的命令rm path删除给定路径的文件rm /dev/.booting删除/dev/.booting文件rmdir path删除给定路径的文件夹readahead file|dir [--fully]在给定目录中的文件上调用 readahead。使用选项 --fully 读取完整文件内容。setprop name value将系统属性名称设置为值setprop bootreceiver.enable 0设置 bootreceiver.enable值为0setrlimit resource cur max设置资源的 rlimit。适用于设置限制后启动的所有进程start service启动该服务start logd启动logd服务stop service停止该服务swapon_all [ fstab ]在给定的 fstab 文件上调用 fs_mgr_swapon_all。如果未指定 fstab 参数则在运行时将按顺序在 /odm/etc、/vendor/etc 或 / 下扫描 fstab.${ro.boot.fstab_suffix}、fstab.${ro.hardware} 或 fstab.${ro.hardware.platform}。symlink target path在 path 处创建一个符号链接值为 targetsysclktz minutes_west_of_gmt设置系统时钟基准trigger event触发事件umount path卸载挂载在该路径上的文件系统umount_all [ fstab ]在给定的 fstab 文件上调用 fs_mgr_umount_all。如果未指定 fstab 参数则在运行时将按顺序在 /odm/etc、/vendor/etc 或 / 下扫描 fstab.${ro.boot.fstab_suffix}、fstab.${ro.hardware} 或 fstab.${ro.hardware.platform}。verity_update_state用于更新或重新配置 dm-verity 的状态wait path [ timeout ]轮询给定文件是否存在并在找到或达到超时时返回。如果未指定超时则当前默认为五秒wait_for_prop name value等待系统属性名称为value。如果属性名称已设置为value则立即继续。write path content打开路径上的文件并使用 write 向其中写入content字符串。如果文件不存在则会创建它
3、Services
表示一些服务
service name pathname [ argument ]*optionoption...service后面的name表示服务名称pathname表示执行程序路径argument表示传递的参数option是服务的修饰符表示这个服务的运行方式。
zygote服务的启动为例
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-namezygote定义了一个名称为zygote的服务init进程通过这个服务名称来创建zygote进程
这个服务的执行路径为system/bin/app_process64
启动zygote的同时传递了几个参数-Xzygote /system/bin --zygote --start-system-server --socket-namezygote
--start-system-server表示启动SystemServer进程 4、Options
Options是服务的修饰符会影响 init 运行服务的方式和时间有以下种类
Options介绍class name [ name\* ]为服务指定类名,相同类别的服务将会同时启动或者停止,默认类名是defaultconsole [console]此服务需要控制台critical [windowfatal crash window mins] [targetfatal reboot target]这是一项设备关键服务。如果它在 fatal crash window mins 分钟内或在启动完成之前退出超过四次设备将重新启动。fatal crash window mins 的默认值为 4disabled服务不会自动启动,必须通过服务名显式启动gentle_kill此服务停止时将发送 SIGTERM 而不是 SIGKILL。200 毫秒超时后将发送 SIGKILL。group groupname [ groupname\* ]在执行此服务之前更改组名为“groupname”interface interface name instance name将此服务与其提供的 AIDL 或 HIDL 服务列表关联ioprio class priority通过 SYS_ioprio_set 系统调用设置此服务的 IO 优先级和 IO 优先级类。class 必须是“rt”、“be”或“idle”之一。priority 必须是 0 - 7 范围内的整数。keycodes keycode [ keycode\* ]设置将触发此服务的键码。如果同时按下与传递的键码相对应的所有键则服务将启动。这通常用于启动 bugreport 服务。oneshot退出时不要重新启动服务。onrestart服务重新启动时执行命令oom_score_adjust value将子进程的 /proc/self/oom_score_adj 设置为指定值该值必须在 -1000 到 1000 之间。override表示此服务定义旨在覆盖同名服务的先前定义priority priority服务进程的调度优先级。此值必须在 -20 到 19 的范围内。默认优先级为 0。优先级通过 setpriority() 设置setenv name value在启动的进程中将环境变量名称设置为值shutdown shutdown_behavior设置服务进程的关闭行为。如果未指定则在关闭过程中使用 SIGTERM 和 SIGKILL 终止服务。shutdown_behavior 为“critical”的服务在关闭过程中不会被终止直到关闭超时。当关机超时时即使标有“shutdown critical”的服务也将被终止。当关机启动时标有“shutdown critical”的服务未运行时它将被启动。timeout_period seconds提供一个超时时间超过该时间后服务将被终止user username在执行此服务之前更改用户名为“username”
5、Imports
import用于拓展配置文件可以通过import引入其他的rc文件,它的格式为
import path
path表示其他配置文件的路径如果path是一个目录则该目录下的每个.rc文件都会被引入。 二、Boot timing
Init 在系统属性中记录一些启动时间信息。
ro.boottime.init init 第一阶段启动后的时间以 ns 为单位通过 CLOCK_BOOTTIME 时钟。
ro.boottime.init.first_stage运行第一阶段所需的时间以 ns 为单位。
ro.boottime.init.selinux运行 SELinux 阶段所需的时间以 ns 为单位。
ro.boottime.init.modules加载内核模块所需的时间以 ms 为单位。
ro.boottime.init.cold_boot_waitinit 等待 ueventd 的冷启动阶段结束的时间。
ro.boottime.service-name服务首次启动后的时间以 ns 为单位通过 CLOCK_BOOTTIME 时钟。