Android Init.rc: 启动过程中的初始化工作

Android系统启动时,第一个要执行的程序就是/system/core/init/init.rc脚本。这个脚本被称为“init脚本”,是Android启动过程中最重要的一部分。它负责初始化各种系统组件、启动系统服务,以及处理开机自启动的应用程序等。

一、init.rc脚本的结构

init.rc脚本的结构非常简单,它由一系列的Action和Command组成,如下所示:

# This file is read once by the init process to set up the system environment
# variables and services.
…
on early-init
…
on init
…
on post-fs
…
on boot
…
on property:sys.boot_completed=1
…
on property:dev.bootcomplete=1
…
on property:selinux.restorecon_recursive=1
…

这些Action和Command分别代表不同的执行环节,在系统启动过程中按照一定的顺序执行。具体来说,它们的含义如下:

  • on early-init:系统从内核启动后马上执行的内容
  • on init:文件系统被挂载后、Zygote启动之前的内容
  • on post-fs:Zygote启动之后的内容
  • on boot:启动所有应用程序之前的内容
  • on property:sys.boot_completed=1:启动后等待系统初始化完成时执行的内容
  • on property:dev.bootcomplete=1:启动后等待设备初始化完成时执行的内容
  • on property:selinux.restorecon_recursive=1:在SELinux恢复标签之后执行的内容

这些环节依次执行,保证了系统各个组件的正确初始化和启动顺序。

二、Action和Command

2.1 Action

Action是Init语言中最基本的控制结构,它支持if语句、while语句、switch语句等语法。Action的语法如下:

action_name {
    command
    command
    command
}

其中,action_name是一个标志符,用来标识一个Action,在后面的Trigger中可以进行引用;command则表示Action要执行的命令。

一个Action可以包含多个Command,它们按照从上到下的顺序逐个执行。每个Command都可以是一个Shell命令,也可以是系统服务管理命令(如start、stop、restart等)。

2.2 Command

Command是Action的组成部分,它指定了Init进程要执行的命令。Command语法如下:

command [args]

其中,command可以是Shell命令,也可以是系统服务管理命令。

在Init脚本中,常见的命令包括:

  • start service_name:启动一个系统服务
  • stop service_name:停止一个系统服务
  • restart service_name:重启一个系统服务
  • write filename string:将一个字符串写入文件
  • setprop property_name property_value:设置一个系统属性

三、实例代码片段

下面是一个Init脚本中的代码片段,它通过一个Action来启动Zygote进程:

on init
    # Set up some memory management
    write /proc/sys/vm/overcommit_memory "1"

    # Create some mountpoints and tmpfs filesystems
    mkdir /dev/socket 0775 system system
    mkdir /dev/log 0777 root log
    mkdir /dev/cpuctl
    mount tmpfs tmpfs /dev/cpuctl mode=0770,gid=1000
    mkdir /dev/cpuctl/bg_non_interactive
    mkdir /dev/cpuctl/fg_boost
    mkdir /dev/cpuctl/fg_non_interactive
    mount cgroup none /sys/fs/cgroup/cpuacct,cpu mode=0755
    mount cgroup none /sys/fs/cgroup/memory mode=0755

    # ...省略其他内容...

    # Start up the system
    start ueventd
    class_start default
    start servicemanager
    start vold
    start zygote
    start media

以上代码片段,先创建了一些挂载点和临时文件系统,然后使用start命令启动了一些系统服务,最终启动了Zygote进程。

四、总结

Android Init.rc脚本是Android系统启动过程中最重要的一部分。它通过一系列的Action和Command来负责系统初始化、系统服务启动和应用程序管理等任务。了解Init.rc的语法和结构对于深入理解Android系统启动过程和进行系统定制具有重要意义。

原创文章,作者:RBMC,如若转载,请注明出处:https://www.506064.com/n/142166.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
RBMCRBMC
上一篇 2024-10-10 09:28
下一篇 2024-10-10 09:28

相关推荐

  • PHP和Python哪个好找工作?

    PHP和Python都是非常流行的编程语言,它们被广泛应用于不同领域的开发中。但是,在考虑择业方向的时候,很多人都会有一个问题:PHP和Python哪个好找工作?这篇文章将从多个方…

    编程 2025-04-29
  • Git config命令用法介绍:用正确的邮箱保障开发工作

    本文将详细介绍如何使用git config命令配置Git的全局和本地用户信息,特别是如何正确使用用户邮箱,保障Git操作的正常进行。 一、git config命令介绍 Git中的每…

    编程 2025-04-29
  • 自学Python能否找到工作

    自学Python的人越来越多,大家都知道Python是一门很受欢迎的语言,但是很多人还是会担心自学Python后能否找到工作。那么,从以下几个方面来分析一下自学Python能否找到…

    编程 2025-04-28
  • 学Python可以应聘哪些工作?

    Python是近年来最热门的编程语言之一,它具有简洁易学、高效灵活等特点,广泛应用于数据分析、人工智能、爬虫、Web开发等领域。下面将从不同方面介绍,学Python后可以应聘哪些工…

    编程 2025-04-28
  • Go中struct的初始化

    本文将从多个方面详细阐述Go中struct的初始化方式,包括使用字面量初始化、使用new函数初始化以及使用构造函数等。通过本文的介绍,读者能够更深入的了解Go中struct的初始化…

    编程 2025-04-28
  • 类加载的过程中,准备的工作

    类加载是Java中非常重要和复杂的一个过程。在类加载的过程中,准备阶段是其中一个非常重要的步骤。准备阶段是在类加载的连接阶段中的一个子阶段,它的主要任务是为类的静态变量分配内存,并…

    编程 2025-04-28
  • Android ViewPager和ScrollView滑动冲突问题

    Android开发中,ViewPager和ScrollView是两个常用的控件。但是当它们同时使用时,可能会发生滑动冲突的问题。本文将从多个方面介绍解决Android ViewPa…

    编程 2025-04-28
  • Android如何点击其他区域收起软键盘

    在Android应用中,当输入框获取焦点弹出软键盘后,我们希望能够点击其他区域使软键盘消失,以提升用户体验。本篇文章将说明如何实现这一功能。 一、获取焦点并显示软键盘 在Andro…

    编程 2025-04-28
  • Python工作需要掌握什么技术

    Python是一种高级编程语言,它因其简单易学、高效可靠、可扩展性强而成为最流行的编程语言之一。在Python开发中,需要掌握许多技术才能让开发工作更加高效、准确。本文将从多个方面…

    编程 2025-04-28
  • Android Studio HUD 实现指南

    本文将会以实例来详细阐述如何在 Android Studio 中使用 HUD 功能实现菊花等待指示器的效果。 一、引入依赖库 首先,我们需要在 build.gradle 文件中引入…

    编程 2025-04-27

发表回复

登录后才能评论