文章来源于网络,心得来源于整理。
请尊重作者:http://hi.baidu.com/guoxiaoming/blog/item/24e9e9f8c9628f1fd9f9fd89.html/cmtid/7525d63fb437a6cd7c1e713b
Android 系统启动过程

Android 从系统启动有4个步骤:

1, init进程启动

2. Native服务启动

3.System Server,Android服务启动

4.Home启动

第一步: Initial进程(System\core\init)

init 进程,它是一个由内核启动的用户级进程.内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程.init始终是第一个进程.

init.rc

init.marvell.rc

Init进程运行就根据init.rc和 init.XX.rc脚本建立了几个基本的服务:

servicemanager,zygote....

最后Ini并不退出,而是担当起property service 的功能.

1.1 脚本文件

init@System/core/Init

init.c : parse_config_file(Init.rc)

@parse_config_file(Init.marvel.rc)

解析脚本文件init.rc和init.XXX.rc(硬件平台相关)\

Init.rc是Android自己规定的初始化脚本(Android init language,System/core/init/readme.txt)

该脚本中包含四个类型的声明:

Actions

Commands

Services

Options.

1.2 服务启动机制

我们来看看Init是怎样解析.rc文件 开启服务的/

打开.rc文件,解析内容@system/core/init/init.c将Service信息放置到Service_list中.@system\core\init parser.c

restart_service()@system\core\init\init.c

Service_start

execve(...).建立Service进程.

第二步 Zygote

ServiceManager和Zygote进程奠定了Android的基础.Zygote这个进程运行都会建立真正的Android运行空间,初始化建立的Service都是Native Service. 在.rc脚本中zygote的描述:

service zygote/system/bin/app_process - Xzygote/system/bin --zyote --start - system-server

所以,Zygote从main(...)@frameworks\base\cmds\app_main.cpp开始.

(1) main(…)@frameworks\base\cmds\app_main.cpp

建立Java Runtime
runtime.start("com.android.internal.os.ZygoteInit", startSystemServer);

(2) runtime.start@AndroidRuntime.cpp

建立虚拟机
运行:com.android.internal.os.ZygoteInit:main函数。

(3)main()@com.android.internal.os.ZygoteInit//正真的 Zygote。

registerZygoteSocket();//登记Listen端口
startSystemServer();
进入Zygote服务框架。
经过这几个步骤,Zygote就建立好了,利用Socket通讯,接收ActivityManangerService的请
求,Fork应用程序。

第三步 System Server

startSystemServer@com.android.internal.os.ZygoteInit在Zygote上fork了一个进程:
com.android.server.SystemServer.于是 SystemServer@(SystemServer.java)就建立了。Android的
所有服务循环框架都是建立 SystemServer@(SystemServer.java)上。在 SystemServer.java中看
不到循环结构,只是可以看到建立了init2的实现函数,建立了一大堆服务,并 AddService到
service Manager。

main() @ com/android/server/SystemServer

{
init1();
}

Init1()是在Native空间实现的(com_andoird_server_systemServer.cpp)。我们一看这个函数就
知道了,init1->system_init() @System_init.cpp

在system_init()我们看到了循环闭合管理框架。

{
Call "com/android/server/SystemServer", "init2"

„..
ProcessState::self()->startThreadPool();

IPCThreadState::self()->joinThreadPool();
}

init2()@SystemServer.java中建立了Android中所有要用到的服务。

这个init2()建立了一个线程,来New Service和 AddService来建立服务

第三步 Home启动
在ServerThread@SystemServer.java后半段,我们可以看到系统在启动完所有的 Android服务
后,做了这样一些动作:

(1) 使用xxx.systemReady()通知各个服务,系统已经就绪。

(2) 特别对于ActivityManagerService.systemReady(回调)

Widget.wallpaper,imm(输入法)等ready通知。

Home就是在ActivityManagerService.systemReady()通知的过程中建立的。下面是
ActivityManagerService.systemReady()的伪代码:

systemReady()@ActivityManagerService.java

resumeTopActivityLocked()

startHomeActivityLocked();//如果是第一个则启动HomeActivity。
startActivityLocked(。。。)CATEGORY_HOME

转载于:https://blog.51cto.com/koffuxu/549702

Android 系统启动过程相关推荐

  1. android tcpdump log分析,android 系统启动过程中加入tcpdump和logcat

    一.android 系统启动过程中加入tcpdump ,分析开机启动后,系统与服务器端的消息交互. 1. init.rc 中的修改 1)在init.rc 中加上tcpdump service. ser ...

  2. Android系统启动过程

    Android系统启动过程 首先Android框架架构图:(来自网上,我觉得这张图看起来很清晰) Linux内核启动之后就到Android Init进程,进而启动Android相关的服务和应用. 启动 ...

  3. Android系统启动过程详解

    转自:http://www.cloudchou.com/android/post-361.html 前言 一直想研究Android完整的启动过程,网上看了不少资料,也看了书上的一些说明,对这些观点有些 ...

  4. Android系统启动过程全解析

    Android系统是一款基于Linux的移动操作系统,那么Android是如何启动起来的呢?本文就详细阐述Android系统的启动过程. 从内核之上,我们首先应该从文件系统的init开始,因为 ini ...

  5. Android系统启动流程—— init进程zygote进程SystemServer进程启动流程

    原文地址:https://blog.csdn.net/qq_30993595/article/details/82714409 Android系统启动流程 Android系统启动过程往细了说可以分为5 ...

  6. 从源码解析-Android系统启动流程概述 init进程zygote进程SystemServer进程启动流程

    Android系统启动流程 启动流程 Loader Kernel Native Framework Application init进程 启动 rc文件规则 Actions Commands Serv ...

  7. 转载:一篇文章看明白 Android 系统启动时都干了什么

    最近在看<深入理解Android内核设计思想>,老实说,作为教材,这本书实在写的不好.本来内核的东西就比应用层繁杂,需要有个条绳子牵着,有个框子框着才不好跟丢.这个书老是在章节开头抛出一些 ...

  8. Android系统启动顺序(按下power键后所做的的工作)

    Android是一个基于Linux的开源操作系统.所有的Android设备都是运行在ARM处理器(ARM 源自进阶精简指令集机器,源自ARM架构)上,除了英特尔的Xolo设备(http://xolo. ...

  9. Android开发——Android系统启动以及APK安装、启动过程

    0. 前言   从Android手机打开开关,到我们可以使用其中的app时,这个启动过程到底是怎么样的? 1.  系统上电 当给Android系统上电,在电源接通的瞬间,CPU内的寄存器和各引脚均会被 ...

最新文章

  1. 单链表-删除重复节点(递增链表)
  2. 3D数学基础:图形与游戏开发---随笔一
  3. Spark函数详解系列--RDD基本转换
  4. Oracle9i卸载后再次安装,设置的SID相同出现“指定的SID在本机上已经存在。请指定一个不同的SID。”...
  5. java 通道 双向原理_Java-NIO(四):通道(Channel)的原理与获取
  6. 数据压缩 第二次作业
  7. controller层个人信息查询模块_风险控制平台架构+模块
  8. Android lsof查看已打开文件
  9. 一个简单的WeakList的实现
  10. pythonwin下载中文版_Python官方下载 v3.9.0中文版_Win10镜像官网
  11. iOS通过CIFilter对图像进行滤镜处理
  12. 全屋WiFi方案:Mesh路由器组网和AC+AP
  13. Easy DVD Creator v2.5.7 WinALL Incl Keygen-BLiZZARD
  14. 计算机动画设计论文,计算机动画设计论文.docx
  15. amd cpu 安卓模拟器_Android 模拟器现已支持 AMD 处理器和 Hyper-V
  16. 初步学习CRM的感想
  17. 类似QQ的可隐藏的便签工具SNOTE
  18. 创新Sound Blaster Tactic3D Alpha耳机驱动v1.0官方版
  19. filter hid_如何构造一个简单的USB过滤驱动程序
  20. java使用poi-tl操作word文件

热门文章

  1. docker上传自己的镜像
  2. Python链接MySQL
  3. Citrix通用打印服务器配置
  4. CSS3-多媒体查询
  5. android获取手机通讯录
  6. VirtualBox虚拟机网络连接设置的四种方式
  7. C# 各种进制之间相互转换 [ZT]
  8. java arraylist优点_Java中各种集合的特点总结
  9. 小程序前端性能测试_如何提高前端应用程序的性能
  10. 初级开发人员的缺点_作为一名初级开发人员,我如何努力克服自己的挣扎