Android 系统启动过程简略分析
来源:互联网 发布:矩阵中span 编辑:程序博客网 时间:2024/05/16 12:17
摘要:Android系统启动的过程可概括为init进程启动、Native服务启动、SystemServer,Android服务启动和Home启动4个步骤。各个步骤紧密联系一环紧扣一环,是一个统一的整体。
关键字:init进程;Zygote进程;SystemServer
1
Android
2
init进程是一个用户级进程,init有许多重要任务,比如像启动getty(用于用户登录)、实现运行级别、以及处理孤立进程等。init始终是第一个进程。
启动时,首先通过bootloader(系统加载器),加载Linux内核。在Linux加载启动内核时,与普通的Linux启动过程相同,先初始化内核,然后调用init进程。
由init进程启动图可以看出,init进程是在顺序执行完start_kernel()函数、init_post()函数、run_init_process()函数后,最后执行的。实现init进程启动的代码如下:
Static
{
}
Android
init进程不仅进行子进程的终止处理,当应用程序访问设备驱动时,还会生成设备节点文件,同时提供属性服务,保存系统运行所需的环境变量。此外,它还会分析init.rc启动脚本文件,并根据相关文件中包含的内容,执行相应的功能。
Android启动时,init.rc脚本文件用来设置系统环境,记录待执行的进程;二是action
init.rc文件结构
2.1
2.2
在init.rc脚本文件中,“service”段落用来记录init进程启动的进程。由init进程启动的子进程或是一次性程序,或是运行在后台的与应用程序、系统服务管理相关的ServiceManager进程等。
最后init进程并不退出,而是担当起属性服务(property
3
从字面上看Zygote是“受精卵、结合子、结合体”的意思。在Android系统中运行新的应用,如同卵子受精分裂一样需要跟Zygote进程(拥有应用程序运行时所需的各种元素与条件)结合后才能执行。Zygote是Android系统应用中的一个相当重要的进程,它的主要功能
就是执行Android应用程序。
Zygote进程运行时,会初始化Dalvik虚拟机,并启动它。Android的应用程序时由java编写的,他们不能直接以本地进程的形态运行在Linux上,只能运行在Dalvik虚拟机中。此时我们就可以和Android的架构对应起来了,此时系统已经运行到系统运行库层。Android的服务与应用程序都由Zygote进程启动运行。
由app_process运行ZygoteInit
Zygote由java编写而成,不能直接由init进程启动运行。若想运行Zygote类,必须先生成Dalvik虚拟机,再在Dalvik虚拟机上装载运行ZygoteInit类,执行这一任务的就是app_process进程。app_process进程执行时,首先常见AppRuntime对象。部分源代码如下
int
}
AppRuntime类继承自AndroidRuntime类,AndroidRuntime类运行于初始化并运行Dalvik虚拟机之前,通过AppRuntime对象,分析环境变量以及运行参数,并以此生成虚拟机选项。分析完要传递给虚拟机的参数,并保存到AppRuntime类的对象中,而后加载对象,调用对象的main()方法。
int
}
Dalvik虚拟机由runtime启动并初始化(见上面注释),而后将ZygoteInit类加载至虚拟机中,执行其中的main方法。
ZygoteInit类的主要有四大功能,分别是绑定/dev/socket/zygote套接字、加载应用程序Framework中的类与平台资源、运行SystemServer和运行新的Android应用程序。在这里我们只初步解释其中的部分功能。ZygoteInit::main()方法的主要功能如下图:
下面我们先看一下ZygoteInit类的部分源代码。
public
}
ZygoteInit类会调用preloadClasses()与preloadResources()两个方法,这两个方法分别用于将应用程序Framework中的类,以及图标、图像、字符串等资源加载到内存之中,并对装载的类与资源生成链接信息。新生成的Android应用程序在使用这些已经装载的类或资源时,直接使即可。至此,Dalvik虚拟机已经启动并完成初始化,还绑定了套接字,以便接收应用程序的创建请求。并且,包含应用程序Framework中的类与资源也被加载到内存之中。由此ZygoteInit类做好了接收请求创建应用程序并运行的准备。但ZygoteInit在处理应用程序创建请求之前,还有一项工作就是运行SystemServer。
Zygote进程启动Dalvik虚拟机后,会在生成一个Dalvik虚拟机实例,以便运行名称为SystemServer的java服务,SystemServer用于运行Audio
4
4.1
接下来看一下runSelectLoopMode的部分源代码。
private
}
donr
boolean
}
runOnce()函数分析请求信息中的字符串数组,为运行进程设置好各个选项,具体包括设置应用程序的gid、uid,调试标记处理,设置rlimit,以及检查运行权限等。之后就可以创建新进程了,Zygote.forkAndSpecialize()方法接受上面分析好的参数,调用Zygote类的本地方法forkAndSpecialize()。然后调用本地函数fork(),创建新进程,并根据新创建的进程传递的选项,设置uid、gid、rlimit等。此时,新运行的应用程序就已经启动完成了。新运行的应用程序由ZygoteInit类动态加载,共用装载到父进程生成虚拟机代码。并且,共应用程序FrameWork中的类及资源的链接信息,这大大加快了应用程序创建与启动的速度。
4.2
Activity的启动必然和ActivityManagerService的启动有关,下面是SystemServer执行init2()的相关源代码。
public
//建立线程来处理
}
//看看线程ServerThread里面都做了什么事情?
public
//初始化完成以后加入到
//
//
//
//
//
//系统服务初始化准备就绪,通知各个模块
}
从上面可以看出系统在启动完所有的Android服务后,做了这样一些动作,使用xxx.systemReady()通知各个服务,系统已经就绪。其中也包括ActivityManagerService.system-
Ready(
public
……
//ready
……
}
final
//
ActivityRecord
if
//
//
if
//ActivityManagerService
return
}
}
……
}
从上面分析得出HomeActivity在执行mService.startHomeAct-
ivityLocked后启动。Home界面启动,完成了整个Android启动流程。
5
- Android 系统启动过程简略分析
- Android系统启动过程分析
- Android系统启动过程分析
- android系统启动过程分析
- Android系统启动过程分析代码跟踪。
- android源码4.4.2----系统启动过程分析
- Linux系统启动过程分析
- Linux系统启动过程分析
- Linux系统启动过程分析
- linux 系统启动过程分析
- Linux系统启动过程分析
- Linux系统启动过程分析
- Linux系统启动过程分析
- Linux系统启动过程分析
- Linux系统启动过程分析
- linux系统启动过程分析
- Linux系统启动过程分析
- Linux系统启动过程分析
- C#程序员,想想走过来的路啊
- 输入的年月日是当年的第几天
- 二分图的最大分配(hdu 1045)
- java IntelliJ IDEA 13 注册码 IDEA序列号 License Key Username: JavaDeveloper@sskaje.me License: 282971-
- 第11周项目6(2)-回文、素数
- Android 系统启动过程简略分析
- monitor
- 语音识别原理介绍------组队理解原理
- Problem - 1002_A + B Problem II
- 采用手势的上下左右来实现图像的处理
- 找到数组中第一个不见的正整数(First Missing Positive )
- IPC参数(共享内存/信号量)
- word实现表格编号自动更新,同时实现文档中与表格编号对应引用的同步更新方法
- Apache自定义日志格式