BootLoader引导:
当按开机键的时候,引导芯片开始从固化在ROM的预设代码开始执行,然后加载引导程序到RAM
BootLoader,又称为引导程序。它是在操作系统运行之前运行的一段程序
BootLoader负责初始化软件运行所需要的最小硬件环境,最后加载内核到内存
启动Kernel:
这个入口的函数是start_kernel函数
start_kernel函数执行到最后调用了reset_init函数进行后续的初始化
start_kernel最终启动用户空间的init程序
启动Android:
当初始化内核之后,init进程负责解析init.rc配置文件, 就会启动一个相当重要的祖先进程,也就是init进程,在Linux中所有的进程都是由init进程直接或间接fork出来的
* /system/bin/app_process_Zygote服务启动的进程名
* --start-system-server 表明Zygote启动完成后,需要启动System_Server进程
* socket zygote stream 666在Zygote启动时,创建一个权限为666的socket。此socket用来请求zygote创建新进程
* socket的fd保存在名称为"ANDROID_SOCKET_zygote"的环境变量中
init进程负责创建系统中最关键的几个核心daemon(守护)进程,尤其是zygote和System_Server进程
1. zygote进程 android启动的第一个Dalvik 虚拟机,它将负责启动Java世界的进程
2. zygote虚拟机启动子进程system_server,同时也可以看出zygote中定义了一个Socket,绑定666端口,用于接收ActivityManagerService启动应用程序的请求
3. System_Server进程 Binder通信的基础,它还提供了property service(属性服务),类似于windows系统的注册表服务
4. 系统里面重要的服务都是在这个进程里面开启的,例如AMS, WindowsManager, PackageManagerService等等都是由这个System_Server fork出来的
5. 在System_Server进程开启的时候,就会初始化ActivityManagerService 。同时,会加载本地系统的服务库,调用createSystemContext()创建系统上下文,创建ActivityThread及开启各种服务等等
6. system_server中开启了核心系统服务,并将系统服务添加到ServiceManager中,然后系统进入SystemReady状态
概况
1. 系统加电,执行bootloader。Bootloader负责初始化软件运行的最小硬件环境,最后加载内核到内存
2. 内核加载到内存后,进入内核引导阶段,在内核引导的最后,调用start_kernel进入内核启动阶段。start_kernel最终启动用户空间的init程序
3. init负责解析init.rc配置文件,开启系统守护进程。2个最重要的守护进程是zygote进程和serverManager进程。zygote是android启动的第一个Dalvik虚拟机,ServiceManager服务是Binder通信的基础
4. zygote虚拟机启动子进程system_server,在system_server中启动了核心系统服务,并将系统服务添加到ServiceManager中,然后系统进入SystemReady状态
5. 在SystemReady状态,ActivityManagerService与zygote中的socket通信,通过zygote启动home应用,进入系统界面
* 从步骤3开始, init启动后,上层的实现
1. init启动的核心Daemon服务包括Android的第一个Dalvik虚拟机Zygote
2. zygote定义一个socket,用于接受ActivityManangerService启动应用的请求
3. zygote通过fork系统调用创建system_server进程
4. 在system_server进程中,将会启动系统核心服务以及其他服务
5. 系统服务启动后会注册到ServiceManager中,用于Binder通信
6. ActivityManagerService进入systemReady状态
7. 在systemReady状态,ActivityManangerService会与zygote的Socket通信,请求启动Home
8. zygote收到AMS的连接请求后,执行runSelectLoopMode处理请求
9. zygote处理请求会通过forkAndSpecialize启动新的应用进程,并最终启动Home
Android是基于Linux系统的,而在Linux中,所有的进程都是由init进程直接或者是间接fork出来的,zygote进程也不例外。
我们都知道,每一个App其实都是
Dalvik虚拟机:
系统里面的第一个zygote进程运行之后,在这之后再开启App,就相当于开启一个新的进程。而为了实现资源共用和更快的启动速度,Android系统开启新进程的方式,是通过fork第一个zygote进程实现的。
所以说,除了第一个zygote进程,其他应用所在的进程都是zygote的子进程
Android系统里面的服务器和客户端
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = new ComponentName(packageName, className);
intent.setComponent(cn);
startActivity(intent);
但是,我们的App通过调用startActivity()并不能直接打开另外一个App,这个方法会通过一系列的调用,最后还是告诉AMS说:“我要打开这个App,我知道他的住址和名字,你帮我打开吧!
所以是AMS来通知zygote进程来fork一个新进程,来开启我们的目标App的。这就像是浏览器想要打开一个超链接一样,浏览器把网页地址发送给服务器,然后还是服务器把需要的资源文件发送给客户端的。
App,AMS(SystemServer进程)还有zygote进程如何通信:
AMS有什么用?
当我们点击手机桌面上的图标的时候,App就由Launcher开始启动了。但是,你有没有思考过Launcher到底是一个什么东西?
前面我们已经知道了App的启动以及Activity的显示都需要AMS的控制,那么我们便需要和服务端的沟通,而这个沟通是双向的。
客户端–>服务端:
由于继承了同样的公共接口类,ActivityManagerProxy提供了与ActivityManagerService一样的函数原型,使用户感觉不出Server是运行在本地还是远端,从而可以更加方便的调用这些重要的系统服务。
服务端–>客户端:
还是通过Binder通信,不过是换了另外一对,换成了ApplicationThread和ApplicationThreadProxy。
他们也都实现了相同的接口IApplicationThread
private class ApplicationThread extends ApplicationThreadNative
{}
public abstract class ApplicationThreadNative extends Binder implements IApplicationThread{}
class ApplicationThreadProxy implements IApplicationThread {}
经过前两个步骤之后, 系统已经拥有了该application的进程。 后面的调用顺序就是普通的从一个已经存在的进程中启动一个新进程的activity了。
简称:
-ATP: ApplicationThreadProxy