Android init.rc詳解3

關于Android Init的詳解,關于Action,Service,Trigger的請參考Android init.rc詳解1,關于Options的請參考Android init.rc詳解2,本章將介紹常見的Commands。

1 Commands

  • bootchart [start|stop]

  1. 啟動或停止bootcharting(系統啟動性能分析),bootcharting只有在文件/data/bootchart/enabled 存在時才會激活,斗則將不執行任何操作。
  2. bootchart是一個收集和分析Android系統啟動過程性能數據的工具,通過采樣CPU、I/O、進程活動等信息,生成可視化的啟動時序圖(.png.svg),幫助開發者優化開機時間。
  3. bootchart start:在啟動早期(如?on init?階段)調用,啟動數據采集。
  4. bootchart stop:在啟動后期(如?on property:sys.boot_completed=1)調用,停止采集并生成日志。
  5. init.rc中使用該command的舉例:
    on post-fs-data# Start bootcharting as soon as possible after the data partition is# mounted to collect more data.mkdir /data/bootchart 0755 shell shell encryption=Requirebootchart starton property:sys.boot_completed=1bootchart stop# Setup per_boot directory so other .rc could start to use it on boot_completedexec - system system -- /bin/rm -rf /data/per_bootmkdir /data/per_boot 0700 system system encryption=Require key=per_boot_refsetprop ro.vendor.qti.per_boot_created 1

Android 系統的關鍵啟動時間指標(如 bootanimation 顯示、sys.boot_completed=1)主要取決于:

  • class_start main
  • class_start late_start
  • 關鍵服務(如?zygotesystem_server)的啟動速度。
  • chmod <octal-mode> <path>

  1. 更改指定文件或者目錄的訪問權限(讀/寫/執行),使用8進制表示法。
  2. 使用舉例:
# set system-background to 0775 so SurfaceFlinger can touch it
chmod 0775 /dev/cpuset/system-backgroundchmod 0664 /dev/cpuset/foreground/tasks
chmod 0664 /dev/cpuset/background/tasks
chmod 0664 /dev/cpuset/system-background/tasks
chmod 0664 /dev/cpuset/top-app/tasks
  • chown <owner> <group> <path>

  1. 改變文件的所有者和用戶組。
  2. 使用舉例
 # change permissions for all cpusets we'll touch at runtime
chown system system /dev/cpuset
chown system system /dev/cpuset/foreground
chown system system /dev/cpuset/background
chown system system /dev/cpuset/system-background

? 總結

指令作用典型用途注意事項
bootchart [start|stop]控制啟動性能分析優化開機時間需手動創建?/data/bootchart/enabled?啟用
chmod <mode> <path>修改文件權限設置可執行、保護敏感文件使用八進制權限,最小權限原則
chown <owner> <group> <path>修改文件所有者和組確保服務能訪問資源與?chmod?配合使用
  • class _start <serviceclass>

  1. 啟動指定類別(service class)的所有服務,前提是這些服務尚未運行。將同一類別的service集中管理,便于延遲啟動或者統一控制。
  2. 他是一個批量啟動服務的指令,常見的service class由
service class 值含義
main

系統運行所必需的核心服務:zygote, bluetoothbd, storaged,?

core核心服務,servicemanager, console,ueventd, bootanim
late_start非關鍵、耗時或可延遲的服務(優化啟動時間的關鍵,可以縮短sys.boot_completed時間)
early_hal需要在main之前啟動的服務
hal指Android HAL層的服務,用于與底層通信。
charger和充電有關的service,例如charger,hw-health-service,在on charger觸發的services
  • class_stop <serviceclass>

  1. 關閉指定類型的services。
  2. 使用舉例
# Healthd can trigger a full boot from charger mode by signaling this
# property when the power button is held.
on property:sys.boot_from_charger_mode=1class_stop chargertrigger late-init
  • class_restart [ --only--enabled ] <serviceclass>

  1. 重啟指定類別的所有services。
  2. 如果指定了--only--enabled,則跳過被禁用的服務(即disabled修飾的service)。
  3. 如果沒有指定該選項,則會嘗試重啟該類別下的所有服務(包括disabled和oneshort修飾的service),如果服務正在運行,則先stop,然后再start;如果服務沒運行,直接start。

? 總結

指令作用是否阻塞典型觸發時機
class_start <class>啟動指定類別中尚未運行的服務否(異步)on booton property:
class_stop <class>停止指定類別中正在運行的所有服務否(異步)用戶切換、省電模式、調試
class_restart [--only-enabled] <class>先停止,再重新啟動該類所有服務否(異步)錯誤恢復、配置重載、調試
  • start <service>

如果指定的服務尚未運行,則啟動該服務。如果該服務已運行,start不會重復啟動。

  • stop <service>

停止運行指定的service。

  • restart [ --only-if-running ] <service>

  1. 停止并重啟一個正在運行的service。
  2. 如果該service處于重啟過程中,則不執行任何操作
  3. 如果該服務未運行,則直接啟動該服務(相當于start <service>);
  4. 如果指定了--only-if-running選項,則僅當服務正在運行時才執行重啟。如果服務未運行,則不做任何操作。

exec_start <service>

  1. 啟動指定的服務,并暫停后續init指令,知道該service執行完成并返回。
  2. 他是惟一能阻塞init進程的同步指令,允許在關鍵啟動中精確控制執行順序,確保某些service必須啟動完成。
  3. 使用舉例:
on zygote-start && property:ro.crypto.state=unencrypted# wait OTA signature verifcation wait_for_prop odsign.verification.done 1# A/B update verifier that marks a successful boot.exec_start update_verifier_nonencryptedstart statsdstart netdstart zygotestart zygote_secondary
  • A/B update:又稱無縫更新,設備上由兩套系統分區:A和B,當前系統允許在分區A,分區B可以后臺靜默更新,更新完成后,下次重啟就切換到B分區。?
  • 首次啟動B系統,則必須標記本次啟動成功,如果啟動成功,則B被永久標注為“新系統”,如果啟動失敗,下次自動切換A分區。
  • A/B update verifier:檢查當前系統是否時首次從新系統啟動,如果是則將successful標志置為1
  • enable <servicename>

  1. 將一個disabled的service轉化成enable,即激活service。
  2. enable本身不啟動服務,他只是激活service,當service的啟動條件滿足時才會被啟動,即使他是disabled。

? 總結

指令作用是否阻塞?init典型使用場景注意事項
start <servic>啟動一個已定義的服務

?否

(異步)

正常啟動服務,如?start zygote若服務已在運行,不會重復啟動
stop <servic>停止一個正在運行的服務

(異步)

關機、切換模式時停止服務服務進程退出后不再自動重啟(除非有 respawning)
restart <servic>先?stop,再?start?服務

(異步)

配置變更后重載服務,如?restart adbd等價于?stop + start,服務會短暫中斷
exec_start <servic>同步執行一個?oneshot?服務,并等待其完成

(同步)

關鍵初始化任務,如標記 OTA 成功、運行配置腳本僅適用于?oneshot?服務;init?會等待其退出后再執行后續命令
enable <service>激活一個被?disabled?的服務,使其可被?start?或自動啟動

(異步)

根據屬性動態啟用服務,如?enable watchdogd?when?ro.boot.quiescent=1服務必須先定義為?disabledenable?后若滿足條件(如屬于?main?class 且已?class_start),會立即啟動
  • exec [ <seclabel> [ <user> [ <group> *] ] ] -- <command> [ <argument> *]

fork一個子進程并在指定的上下文(SELinux權限以及user/group)下執行。

該指令是一個同步的,會阻塞init進程。在該指令執行完成前,init將暫停后續所有指令。

參數解釋說明
<seclabel>

SELinux 安全上下文,如?u:r:init:s0

用?-?表示默認

<user>執行用戶,如?rootsystemshell
<group>*零個或多個補充組,如?inetlogsystem
--分隔符,表示前面是執行上下文,后面是命令
<command>要執行的可執行文件路徑
[argument]*命令參數,支持屬性展開?${prop}
  • exec_backgroud?[ <seclabel> [ <user> [ <group> *] ] ] -- <command> [ <argument> *]

  1. 與exec類似,fork一個子進程并在指定的上下文(SELinux權限以及user/group)下執行。
  2. 該指令是異步的,不會阻塞init,會繼續執行后續指令。

? 總結

指令是否阻塞?init用途
exec? 是(同步)執行關鍵初始化任務,必須完成才能繼續
exec_background? 否(異步)執行非關鍵、后臺任務,不阻塞啟動流程
  • setprop <name> <value>

  1. 給指定的系統屬性賦值。

  2. 它是觸發屬性值為條件(on property:)的event,eg:
    on property:sys.boot_completed=1bootchart stop# Setup per_boot directory so other .rc could start to use it on boot_completedexec - system system -- /bin/rm -rf /data/per_bootmkdir /data/per_boot 0700 system system encryption=Require key=per_boot_refsetprop ro.vendor.qti.per_boot_created 1
  3. 常見的系統屬性分類:
    前綴說明是否可寫
    ro.*只讀屬性(Read-Only)? 僅在?init?階段可設,之后不可改
    sys.*系統屬性,可被?init?和系統服務修改? 可修改
    persist.*持久化屬性,寫入?/data/property/? 可修改,重啟后保留
    ctl.*控制屬性(如?ctl.start,?ctl.stop? 觸發服務控制
    debug.*調試屬性? 開發者可設symlink <target> <path>
  • trigger <event>

觸發一個事件,用于從一個Action執行完成后,主動觸發另一個Action。

  • symlink <target> <path>

在指定path創建一個指向target的符號鏈接(相當于軟連接,即ln -s <target> <path>)。

  • wait_for_prop <name> <value>

  1. 等待指定系統屬性的值變成指定value,如果該屬性值等于value,則立即執行后續命令。

  2. 他是init中用于同步控制的關鍵指令,setprop會觸發該指令往后執行。

2 Imports?

  • import <path>

  1. 導入一個init配置文件(或者目錄下所有文件)。如果path是文件,則解析該文件;如果path是目錄,則解析該目錄下所有文件(不遞歸子目錄)。
  2. import是Android init系統實現模塊化、分層話配置管理的核心機制。它允許:
    將龐大的初始化配置拆分為多個?.rc?文件;
    按硬件、供應商、產品維度組織配置;
    實現系統組件的解耦與可維護性;
    支持動態加載?/vendor/odm?等分區的配置。

  3. 使用舉例,init.rc中
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

    3 Properties

    • init.svc.<name>

    1. 查詢指定Service name的狀態。name是.rc文件中定義的Service名稱。
    2. 當每個Service的狀態發生便后時,init都會更新對應的init.svc.<name>的屬性值。
      eg: 查詢某個Service的狀態:adb shell getprop init.svc.zygote
    3. 服務的狀態值類型有:
    狀態值說明
    running服務正在運行(主進程已啟動且未崩潰)
    stopped服務已停止(未運行,且不是因為崩潰)
    restarting服務正在重啟(通常因崩潰后由?init?重啟)
    stopping服務正在停止過程中(收到?SIGTERM,但進程尚未退出)
    disabled服務被禁用(通過?setprop init.svc.<name> disabled
    invalid服務未定義或路徑無效(如可執行文件不存在)
    • ctl. [ <target>_ ] <command> <value>

    1. 該類屬性是Android init用于遠程控制Service生命周期和行為的“控制通道”。它允許系統其他組件通過設置屬性來間接執行start/stop等。
    2. <target>是可選的,指定匹配的Service(當前只支持target取值Interface),注意“_”不要缺失;
    3. <command>是要執行的指令,前邊1 Command部分介紹的指令集,常見的有start/stop?
    4. <value>可以是Servicename,如果是Interface,對于AIDL,則value是aidl/instance;對于HIDL,則value是package::Interface/instance。
    5. 使用舉例:
    setprop ctl.restart vendor.power-hal-aidl
    setprop ctl.interface_restart android.hardware.power@1.0::IPower/default

    4 Boot Timing

    init進程在啟動過程中會精確記錄關鍵結算的時間戳和耗時,并將其寫入只讀屬性ro.boottime.*中。

    屬性含義單位說明
    ro.boottime.init第一階段?init?啟動的時間點ns從?CLOCK_BOOTTIME?開始到?init?進程開始執行的時間
    ro.boottime.init.first_stage第一階段?init?執行耗時ns通常指?ramdisk?中的?init?執行時間(如設備樹解析、掛載?/dev?等)
    ro.boottime.init.selinuxSELinux 策略加載與轉換耗時ns包括?load_policyrestorecon?等操作
    ro.boottime.init.modules內核模塊加載耗時msinit?執行?insmod?或?modprobe?加載?.ko?文件的總時間
    ro.boottime.init.cold_boot_wait等待?ueventd?完成冷啟動設備發現的耗時nsinit?等待?ueventd?發出?coldboot_done?事件的時間

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

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

    相關文章

    Sentinel原理之規則管理

    文章目錄1. 基礎知識2. 數據源使用2.1 RedisDatasource2.2 ZookeeperDatasource1. 基礎知識 流量控制規則&#xff08;FlowRule&#xff09;&#xff1a; 閾值類型grade&#xff1a; 0&#xff08;并發線程數&#xff09;&#xff1a;限制同時處理請求的線程1&#xff08;QPS…

    系統時鐘配置

    STM32F103C8T6的系統時鐘配置成72MHZ1. 什么是 STM32 系統時鐘系統時鐘&#xff08;System Clock&#xff09;是整個 MCU&#xff08;微控制器&#xff09;運行的“節拍信號”&#xff0c;所有 CPU 指令執行、外設操作、定時器計時、總線數據傳輸等&#xff0c;都依賴這個時鐘頻…

    Al大模型-本地私有化部署大模型-大模型微調

    魔塔社區 魔塔社區平臺介紹 https://www.modelscope.cn/models/Qwen/Qwen2.5-0.5B-Instruct 申請免費的試用機器 如果自己沒有機器 &#xff0c;從這里申請機器 。 下載大模型 pip install modelscope 下載到當前目錄 mkdir -p /root/autodl-tmp/demo/Qwen/Qwen2.5-0.5B-Ins…

    國內著名AI搜索優化專家孟慶濤發表《AI搜索內容可信度評估綜合指南》

    近日&#xff0c;國內著名AI搜索優化專家、中國GEO生成式引擎優化領域的開拓者與實踐專家孟慶濤正式發布《AI搜索內容可信度評估綜合指南》&#xff0c;針對當前AI生成內容&#xff08;AIGC&#xff09;在搜索場景中可信度參差不齊的痛點&#xff0c;首次提出覆蓋"技術-內…

    ruoyi-flowable系統防xss攻擊配置(使用富文本的方式)

    背景。開發小程序過程中。用戶使用富文本的方式比較多。但在傳輸后發現如上傳到系統中的圖片鏈接地址被清空了。問題&#xff1a;想要使用富文本。還需要開啟xss過濾。有什么好的解決方案嗎&#xff1f;解決方案&#xff08;我比較傾向的&#xff09;&#xff1a;通過對富文本內…

    【opencv-Python學習筆記(2): 圖像表示;圖像通道分割;圖像通道合并;圖像屬性】

    目標&#xff1a;1.學會圖像的通道分割與合并2.學會圖像的的常規操作##一些概念&#xff1a;二值圖像&#xff1a;只包含黑色和白色兩種顏色的圖像&#xff0c;1為白色&#xff0c;0為黑色灰度圖像&#xff1a;計算機會將灰度處理為256個灰度級&#xff0c;用區間[0,255]來表示…

    Qt——常用Widget(控件)

    常用控件 Widget 需要說明&#xff0c;此處說明的控件都繼承于QWiget&#xff0c;因此之前所說的控件屬性&#xff0c;和相關API&#xff0c;在這里的控件都適用 文章目錄常用控件 Widget按鈕類控件QPushButtonQRadioButtonQCheckBox顯示類控件QLabel初識事件LCD NumberProgre…

    Cursor/VSCode/VS2017 搭建Cocos2d-x環境,并進行正常的調試和運行(簡單明了)

    作者&#xff1a;求一個demo 版權聲明&#xff1a;著作權歸作者所有&#xff0c;商業轉載請聯系作者獲得授權&#xff0c;非商業轉載請注明出處 內容通俗易懂&#xff0c;沒有廢話 廢話不多說&#xff0c;我們直接開始------>>>>>> &#xff01;&#xff…

    從 LLM 到自主 Agent:OpenCSG 打造開源 AgenticOps 生態

    從 LLM 到自主 Agent&#xff1a;OpenCSG 打造開源 AgenticOps 生態在產業拐點上&#xff0c;交付可持續、可落地的智能體未來在生成式 AI 的時代洪流中&#xff0c;大語言模型&#xff08;LLM&#xff09;已成為行業標配&#xff0c;但如何突破“會說不會做”的局限&#xff0…

    黑馬程序員mysql課程中在Linux系統中安裝mysql出現問題

    問題描述在安裝linux的最后一步的指令的時候報錯警告&#xff1a;mysql-community-server-8.0.26-1.el7.x86_64.rpm: 頭V3 DSA/SHA256 Signature, 密鑰 ID 5072e1f5: NOKEY 錯誤&#xff1a;依賴檢測失敗&#xff1a;net-tools 被 mysql-community-server-8.0.26-1.el7.x86_64 …

    「iOS」————APP啟動優化

    iOS學習APP的啟動流程啟動流程缺頁錯誤主要階段pre-main階段main階段啟動優化pre-mainmain階段啟動優化總結流程總結APP的啟動流程 啟動 首先我們來了解啟動的概念&#xff1a; 廣義上的啟動是點擊圖標到首頁數據加載完畢狹義上的啟動是點擊圖標到啟動圖完全消失的第一幀 啟…

    知名車企門戶漏洞或致攻擊者遠程解鎖汽車并竊取數據

    漏洞概況一家大型汽車制造商的在線系統存在安全漏洞&#xff0c;可能導致客戶數據泄露&#xff0c;并允許攻擊者遠程訪問車輛。該漏洞由安全研究員Eaton Zveare發現&#xff0c;他已于2025年2月向涉事車企報告并促使漏洞修復。Zveare雖未公開車企名稱&#xff0c;但透露這是在美…

    Elasticsearch JS 自定義 ConnectionPool / Connection / Serializer、敏感信息脫敏與 v8 平滑遷移

    0. 什么時候該用“高階配置”&#xff1f; 復雜網絡/路由需求&#xff1a;自定義“健康節點”判定、權重路由、多租戶隔離。替換 HTTP 棧&#xff1a;接入企業內網網關、打通自研代理/審計、細化超時/連接細節。序列化治理&#xff1a;為超大 JSON、Bulk、查詢串做定制編碼/壓縮…

    希爾排序專欄

    在排序算法的大家庭中&#xff0c;希爾排序&#xff08;Shell Sort&#xff09;以其獨特的 "分組插入" 思想占據著重要地位。它是對插入排序的創造性改進&#xff0c;通過引入 "增量分組" 策略&#xff0c;大幅提升了排序效率。本文將帶你深入理解希爾排序…

    Android 歐盟網絡安全EN18031 要求對應的基本表格填寫

    Android 歐盟網絡安全EN18031 要求對應的基本表格填寫 文章目錄Android 歐盟網絡安全EN18031 要求對應的基本表格填寫一、背景二、18031認證預填表格三、其他1、Android EN 18031 要求對應的基本表格小結2、EN 18031的要求表格內容填寫3、一定要做三方認證&#xff1f;4、歐盟網…

    《Attention-driven GUI Grounding》論文精讀筆記

    論文鏈接&#xff1a;[2412.10840] Attention-driven GUI Grounding: Leveraging Pretrained Multimodal Large Language Models without Fine-Tuning 摘要 近年來&#xff0c;多模態大型語言模型&#xff08;Multimodal Large Language Models&#xff0c;MLLMs&#xff09;的…

    PIDGenRc函數中lpstrRpc的由來和InitializePidVariables函數的關系

    第一部分&#xff1a;./base/ntsetup/syssetup/setupp.h:404:#define MAX_PID30_RPC 5BOOL InitializePidVariables() {//// Get the Pid from HKEY_LOCAL_MACHINE\SYSTEM\Setup\Pid//Error RegOpenKeyEx( HKEY_LOCAL_MACHINE,((MiniSetup || OobeSetup) ? szFinalPidKeyNa…

    Nginx學習筆記(七)——Nginx負載均衡

    ?? Nginx學習筆記&#xff08;七&#xff09;——Nginx負載均衡 &#x1f4cc; 一、負載均衡核心概念 架構定位&#xff1a; #mermaid-svg-00aCvwmJ40DHNd66 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-00aC…

    MQ積壓如何處理

    處理消息隊列&#xff08;MQ&#xff09;積壓是一個需要系統化分析的運維挑戰。下面我將結合常見原因&#xff0c;分步驟說明處理方案&#xff0c;并區分應急措施和根本解決方案&#xff1a;?一、快速診斷積壓原因&#xff08;核心&#xff01;&#xff09;???監控告警分析…

    Unity與OpenGL中的材質系統詳解

    引言 在現代3D圖形開發中&#xff0c;材質是定義物體外觀的核心元素。Unity引擎提供了強大且直觀的材質系統&#xff0c;使得開發者能夠輕松實現復雜的視覺效果。然而&#xff0c;對于熟悉OpenGL的開發者來說&#xff0c;理解Unity材質系統的工作原理以及如何在OpenGL中實現類…