Android Init Language自學筆記

Android Init Language由五個元素組成:Acttions、Commands、Services、Options和Imports。

Actions和Services隱式聲明了一個新的section。所以的Commands和Options都屬于最近聲明的section。

Services具有唯一的名稱,如果重名會報錯。

Actions

Actions被視為Commands的序列。

Actions有一個trigger指明什么時候action被執行。當有和trigger事件匹配的事件發生時,這個action會被添加到待執行隊列的尾部(除非它已經存在于隊列中)。

Actions形如:

on <trigger> [&& <trigger>]*<command><command><command>...

Services

Services是init啟動或重啟時執行的程序。形如:

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

Options

Options是Services的修飾符,表示如何或何時運行service。

具體有哪些Options,詳見:init/README.md (googlesource.com)

Commands

具體有哪些Commands,詳見:init/README.md (googlesource.com)
在代碼中(/system/core/init/builtins.cpp)中,有Commands與函數的映射

// Builtin-function-map start
const BuiltinFunctionMap& GetBuiltinFunctionMap() {constexpr std::size_t kMax = std::numeric_limits<std::size_t>::max();// clang-format offstatic const BuiltinFunctionMap builtin_functions = {{"bootchart",               {1,     1,    {false,  do_bootchart}}},{"chmod",                   {2,     2,    {true,   do_chmod}}},{"chown",                   {2,     3,    {true,   do_chown}}},{"class_reset",             {1,     1,    {false,  do_class_reset}}},{"class_restart",           {1,     2,    {false,  do_class_restart}}},{"class_start",             {1,     1,    {false,  do_class_start}}},{"class_stop",              {1,     1,    {false,  do_class_stop}}},{"copy",                    {2,     2,    {true,   do_copy}}},{"copy_per_line",           {2,     2,    {true,   do_copy_per_line}}},{"domainname",              {1,     1,    {true,   do_domainname}}},{"enable",                  {1,     1,    {false,  do_enable}}},{"exec",                    {1,     kMax, {false,  do_exec}}},{"exec_background",         {1,     kMax, {false,  do_exec_background}}},{"exec_start",              {1,     1,    {false,  do_exec_start}}},{"export",                  {2,     2,    {false,  do_export}}},{"hostname",                {1,     1,    {true,   do_hostname}}},{"ifup",                    {1,     1,    {true,   do_ifup}}},{"init_user0",              {0,     0,    {false,  do_init_user0}}},{"insmod",                  {1,     kMax, {true,   do_insmod}}},{"installkey",              {1,     1,    {false,  do_installkey}}},{"interface_restart",       {1,     1,    {false,  do_interface_restart}}},{"interface_start",         {1,     1,    {false,  do_interface_start}}},{"interface_stop",          {1,     1,    {false,  do_interface_stop}}},{"load_exports",            {1,     1,    {false,  do_load_exports}}},{"load_persist_props",      {0,     0,    {false,  do_load_persist_props}}},{"load_system_props",       {0,     0,    {false,  do_load_system_props}}},{"loglevel",                {1,     1,    {false,  do_loglevel}}},{"mark_post_data",          {0,     0,    {false,  do_mark_post_data}}},{"mkdir",                   {1,     6,    {true,   do_mkdir}}},// TODO: Do mount operations in vendor_init.// mount_all is currently too complex to run in vendor_init as it queues action triggers,// imports rc scripts, etc.  It should be simplified and run in vendor_init context.// mount and umount are run in the same context as mount_all for symmetry.{"mount_all",               {0,     kMax, {false,  do_mount_all}}},{"mount",                   {3,     kMax, {false,  do_mount}}},{"perform_apex_config",     {0,     0,    {false,  do_perform_apex_config}}},{"umount",                  {1,     1,    {false,  do_umount}}},{"umount_all",              {0,     1,    {false,  do_umount_all}}},{"update_linker_config",    {0,     0,    {false,  do_update_linker_config}}},{"readahead",               {1,     2,    {true,   do_readahead}}},{"remount_userdata",        {0,     0,    {false,  do_remount_userdata}}},{"restart",                 {1,     2,    {false,  do_restart}}},{"restorecon",              {1,     kMax, {true,   do_restorecon}}},{"restorecon_recursive",    {1,     kMax, {true,   do_restorecon_recursive}}},{"rm",                      {1,     1,    {true,   do_rm}}},{"rmdir",                   {1,     1,    {true,   do_rmdir}}},{"setprop",                 {2,     2,    {true,   do_setprop}}},{"setrlimit",               {3,     3,    {false,  do_setrlimit}}},{"start",                   {1,     1,    {false,  do_start}}},{"stop",                    {1,     1,    {false,  do_stop}}},{"swapon_all",              {0,     1,    {false,  do_swapon_all}}},{"enter_default_mount_ns",  {0,     0,    {false,  do_enter_default_mount_ns}}},{"symlink",                 {2,     2,    {true,   do_symlink}}},{"sysclktz",                {1,     1,    {false,  do_sysclktz}}},{"trigger",                 {1,     1,    {false,  do_trigger}}},{"verity_update_state",     {0,     0,    {false,  do_verity_update_state}}},{"wait",                    {1,     2,    {true,   do_wait}}},{"wait_for_prop",           {2,     2,    {false,  do_wait_for_prop}}},{"write",                   {2,     2,    {true,   do_write}}},};// clang-format onreturn builtin_functions;
}

Imports

形如:

import <path>

Import有它自己的section,不是Actions的一部分。

Import用來解析init配置文件、擴展當前配置。如果 是一個目錄,則其中所有文件會被當作配置文件解析,但不是解析子目錄中的文件。

Triggers(觸發器)

觸發器用來匹配某類事件并觸發aciton發生。

觸發器分為事件觸發器和屬性觸發器。

事件觸發器由“trigger” Command或init程序的QueueEventTrigger()函數觸發。

屬性觸發器是在屬性改變時觸發。

一個Action可以有多個屬性觸發器,但只能有一個事件觸發器。

具體有哪些觸發器,詳見:init/README.md (googlesource.com)

init.rc舉例

下面節選一下init.rc文件中怎么寫的,先感受一下

# 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.
#import /init.environ.rc
import /system/etc/init/hw/init.usb.rc
import /init.${ro.hardware}.rc
import /vendor/etc/init/hw/init.${ro.hardware}.rc
import /system/etc/init/hw/init.usb.configfs.rc
import /system/etc/init/hw/init.${ro.zygote}.rc......# Mount filesystems and start core system services.
on late-inittrigger early-fs# Mount fstab in init.{$device}.rc by mount_all command. Optional parameter# '--early' can be specified to skip entries with 'latemount'.# /system and /vendor must be mounted by the end of the fs stage,# while /data is optional.trigger fstrigger post-fs# Mount fstab in init.{$device}.rc by mount_all with '--late' parameter# to only mount entries with 'latemount'. This is needed if '--early' is# specified in the previous mount_all command on the fs stage.# With /system mounted and properties form /system + /factory available,# some services can be started.trigger late-fs# Now we can mount /data. File encryption requires keymaster to decrypt# /data, which in turn can only be loaded when system properties are present.trigger post-fs-data# Should be before netd, but after apex, properties and logging is available.trigger load_bpf_programs# Now we can start zygote for devices with file based encryptiontrigger zygote-start# Remove a file to wake up anything waiting for firmware.trigger firmware_mounts_completetrigger early-boottrigger boot......service boringssl_self_test32 /system/bin/boringssl_self_test32reboot_on_failure reboot,boringssl-self-check-failedstdio_to_kmsg# Explicitly specify that boringssl_self_test32 doesn't require any capabilitiescapabilitiesuser nobody

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42176.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42176.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42176.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解決Spring Boot中的高可用性設計

解決Spring Boot中的高可用性設計 大家好&#xff0c;我是微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 1. 高可用性設計概述 1.1 什么是高可用性&#xff1f; 高可用性指系統在面對各種故障和異常情況時&#xff0c;仍…

獨立開發者系列(22)——API調試工具apifox的使用

接口的邏輯已經實現&#xff0c;需要對外發布接口&#xff0c;而發布接口的時候&#xff0c;我們需要能自己簡單調試接口。當然&#xff0c;其實自己也可以寫簡單的代碼調試自己的接口&#xff0c;因為其實就是簡單的request請求或者curl庫讀取&#xff0c;調整請求方式get或者…

如果MySQL出現 “Too many connections“ 錯誤,該如何解決?

當你想要連接MySQL時出現"Too many connections" 報錯的情況下&#xff0c;該如何解決才能如愿以償呢&#xff1f;都是哥們兒&#xff0c;就教你兩招吧&#xff01; 1.不想重啟數據庫的情況下 你可以嘗試采取以下方法來解決&#xff1a; 增加連接數限制&#xff1a…

RxJava學習記錄

文章目錄 1. 總覽1.1 基本原理1.2 導入包和依賴 2. 操作符2.1 創建操作符2.2 轉換操作符2.3 組合操作符2.4 功能操作符 1. 總覽 1.1 基本原理 參考文獻 構建流&#xff1a;每一步操作都會生成一個新的Observable節點(沒錯&#xff0c;包括ObserveOn和SubscribeOn線程變換操作…

asp.netWebForm(.netFramework) CSRF漏洞

asp.netWebForm(.netFramework) CSRF漏洞 CSRF&#xff08;Cross-Site Request Forgery&#xff09;跨站請求偽造是一種常見的 Web 應用程序安全漏 洞&#xff0c;攻擊者通過誘使已認證用戶在受信任的網站上執行惡意操作&#xff0c;從而利用用戶的身份 執行未經授權的操作。攻…

echarts實現3D餅圖

先看下最終效果 實現思路 使用echarts-gl的曲面圖&#xff08;surface&#xff09;類型 通過parametric繪制曲面參數實現3D效果 代碼實現 <template><div id"surfacePie"></div> </template> <script setup>import {onMounted} fro…

簡單的找到自己需要的flutter ui 模板

簡單的找到自己需要的flutter ui 模板 網站 https://flutterawesome.com/ 簡介 我原本以為會很難用 實際上不錯 很簡單 打開后界面類似于,右上角可以搜索 點擊view github 相當簡單 很oks

RabbitMq,通過prefetchCount限制消費并發數

1.問題:項目瓶頸,通過rabbitMq來異步上傳圖片,由于并發上傳的圖片過多導致阿里OSS異常, 解決方法:通過prefetchCount限制圖片上傳OSS的并發數量 2.定義消費者 Component AllArgsConstructor Slf4j public class ReceiveFaceImageEvent {private final UPloadService uploadSe…

【見刊通知】MVIPIT 2023機器視覺、圖像處理與影像技術國際會議

MVIPIT 2023&#xff1a;https://ieeexplore.ieee.org/xpl/conhome/10578343/proceeding 入庫Ei數據庫需等20-50天左右 第二屆會議征稿啟動&#xff08;MVIPIT 2024&#xff09; The 2nd International Conference on Machine Vision, Image Processing & Imaging Techn…

MacOS和Windows中怎么安裝Redis

希望文章能給到你啟發和靈感&#xff5e; 如果覺得文章對你有幫助的話&#xff0c;點贊 關注 收藏 支持一下博主吧&#xff5e; 閱讀指南 開篇說明一、基礎環境說明1.1 硬件環境1.2 軟件環境 二、MacOS中Redis的安裝2.1 HomeBrew 安裝&#xff08;推薦&#xff09;2.2 通過官方…

70.WEB滲透測試-信息收集- WAF、框架組件識別(10)

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 內容參考于&#xff1a; 易錦網校會員專享課 上一個內容&#xff1a;69.WEB滲透測試-信息收集- WAF、框架組件識別&#xff08;9&#xff09; 關于waf相應的識…

arcgis js 4.x實現類似openalayers加載tilewms圖層效果

一、普通wms與tilewms區別 相同點&#xff1a;都是加載WMS服務。 不同點&#xff1a;TitleWMS會把當前可視窗口根據網格&#xff08;開發者可以在調用OpenLayers api的時候自定義&#xff09;切分&#xff0c;一片一片地返回回來&#xff0c;在前端進行整合。而ImageWMS則不會…

Springboot 配置 log4j 時的注意事項

感謝博主 https://www.cnblogs.com/fishlittle/p/17950944 依賴 SpringBoot 的 starter 自帶的是 logback 日志&#xff0c;若要使用 log4j2 日志&#xff0c;需要引入對應依賴。logback 日志和 log4j2 日志都是對 slf4j 門面的實現&#xff0c;只能存在一個&#xff0c;且必…

江協科技51單片機學習- p25 無源蜂鳴器

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黃桃罐頭&#xff0c;希望你看完之后&#xff0c;能對你有所幫助&#xff0c;不足請指正&#xff01;共同學習交流 &#x1f381;歡迎各位→點贊&#x1f44d; 收藏?? 留言&#x1f4dd;?…

環信IM實現小米、oppo推送詳細步驟

本文教大家集成環信IM后如何實現小米、oppo推送。 一、小米推送 步驟一、在小米開放平臺創建應用。 在 小米開放平臺 創建應用&#xff0c;開啟推送服務。詳見小米官方網站的 推送服務接入指南。 步驟二、上傳推送證書。 注冊完成后&#xff0c;需要在環信即時通訊云控制臺…

WebSocket 雙向通信

WebSocket 是一種在前端開發中用于實現雙向通信的網絡技術。它與傳統的 HTTP 請求-響應模式不同&#xff0c;允許客戶端和服務器之間實時、雙向的數據傳輸。 1. 實時性 能夠實現數據的即時推送和接收&#xff0c;無需輪詢服務器&#xff0c;大大降低了延遲。 2. 雙向通信 客…

LeetCode-刷題記錄-前綴和合集(本篇blog會持續更新哦~)

一、前綴和&#xff08;Prefix Sum&#xff09;算法概述 前綴和算法通過預先計算數組的累加和&#xff0c;可以在常數時間內回答多個區間和相關的查詢問題&#xff0c;是解決子數組和問題中的重要工具。 它的基本思想是通過預先計算和存儲數組的前綴和&#xff0c;可以在 O(1)…

初步理解六__《面向互聯網大數據的威脅情報 并行挖掘技術研究 》

初步理解 六 STIX 提出了一種標準化的網絡威脅情報格式(Structured Threat Information eXpression, STIX) gtp STIX&#xff08;Structured Threat Information eXpression&#xff09;是一種用于標準化描述和共享網絡威脅情報的格式和語言。它的設計目標是提供一個通用的…

7.8作業

一、思維導圖 二、 1】按值修改 2】按值查找&#xff0c;返回當前節點的地址 &#xff08;先不考慮重復&#xff0c;如果有重復&#xff0c;返回第一個&#xff09; 3】反轉 4】銷毀鏈表 //按值修改 int value_change(linklistptr H,datatype e,int value) {if(HNULL||empty(H…

Greenplum(二)【SQL】

前言 Greenplum 的剩余部分主要其實主要就是 DDL 和之前學的 MySQL 不大一樣&#xff0c;畢竟 Greenplum 是基于 PostgreSQL 數據庫的&#xff0c;不過那些 DML 和 MySQL、Hive 基本上大差不差&#xff0c;所以就沒有必要浪費時間了。 1、DDL 1.1、庫操作 1.1.1、創建數據庫…