第 2 章 Android 系统启动

init 进程启动过程
init 进程是 Android 系统中用户空间的第一个进程,进程号为 1 ,是 Android 系统启动 流程中一个关键的步骤,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创 建 Zygote (孵化器)和属性服务等。 init 进程是由多个源文件共同组成的,这些文件位于 源码目录 system/core/init 中。

it 进程
为了讲解 init 进程,首先要了解 Android 系统启动流程的前几步,以引入 init 进程。

  1. 启动电源以及系统启动
    当电源按下时引导芯片代码从预定义的地方(固化在 ROM)开始执行。加载引导程序 BootLoader 到队M 中,然后执行。
  2. 引导程序 Bootloader
    引导程序 BootLoader 是在 Android 操作系统开始运行前的一个小程序,它的主要作用 是把系统 OS 拉起来并运行。
  3. Linux 内核启动
    当内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。在内核完成系统设 置后,它首先在系统文件中寻找 init.rc 文件,井启动 init 进程。
  4. init 进程启动
    init 进程做的工作比较多 ,主要用来初始化和启动属性服务,也用来启动 Zygote 进程。
    从上面的步骤可以看出, 当我们按下启动电源时,系统启动后会加载引导程序, 引导 程序又启动 Linux 内核,在 Linux 内核加载完成后,第一件事就是要启动 init 进程。关于 Android 系统启动的完整流程会在本章的 2.5 节进行讲解,这一节的任务就是先了解 init 进 程的启动过程。

init 进程的λ口函数
init 的 main 函数做了很多事情,比较复杂,我们只需关注主要的几点就可以了。在开 始的时候创建和挂载启动所需的文件目录,其中挂载了 tmpfs、 devpts、 proc、 sysfs 和 selinuxfs 共 5 种文件系统,这些都是系统运行时目录,顾名思义,只在系统运行时才会存在,系统 停止时会消失。

僵尸进程与危害
在 UNIX几inux 中,父进程使用 fork 创建子进程,在子进程终止之后,如果父进程并 不知道子进程已经终止了,这时子进程虽然已经退出了,但是在系统进程表中还为它保留了 一定的信息(比如进程号、退出状态、运行时间等),这个子进程就被称作僵尸进程。系统 进程表是一项有限资惊,如果系统进程表被僵尸进程耗尽的话,系统就可能无怯创建新的进 程了。

解析 init.re
init.rc 是一个非常重要的配置文件,它是由 Android~)]始化语言(Android Init Language)

解析 Service 类型语句
in it.re 中的 Action 类型语句和 Service 类型语句都有相应的类来进行解析, Action 类 型语句采用 ActionParser 来进行解析, Service 类型语句采用 ServiceParser 来进行解析, 这里因为主要分析 Zygote ,所以只介绍 ServiceParser。 Servic巳Parser 的实现代码在 syst巳m/core/ir Service 类型语句的,会用到两个函数: 一个是 ParseSection,它会解析 Service 的 re 文件, 比如上文讲到的 init.zygote64.rc, ParseSection 函数主要用来搭建 Service 的架子; 另一个是 ParseLineSection,用于解析子项。

init 启动 Zygote
讲完了解析 Service,接下来该讲 init是如何启动 Service 的,在这里主要讲解启动 Zygote 这个 Service。在 Zygote 的启动脚本中,我们可知 Zygote 的 classname 为 main

属性服务
Windows 平台上有一个注册表管理器 , 注册表的内容采用键值对的形式来记录用户、 软件的一些使用信息。即使系统或者软件重启,其还是能够根据之前注册表中的记录,进 行相应的初始化工作。 Android 也提供了一个类似的机制,叫作属性服务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值