Android的启动流程
1、按下电源键之后,会引导芯片代码从预定义的地方(固化在rom了)开始执行,加载引导程序BootLoader加载到RAM,然后执行。Bootloader是一段小型的程序,主要功能是将内核映像从闪存加载到内存。
2、会生成第一个进程idle(pid=0),会初始化进程管理、内存管理和一些驱动。
3、idle会生成两个进程。pid=1 的init进程,是用户空间的鼻祖,pid=2的kthreadd的内核空间鼻祖,它会创建内核工作线程、软中断等内核守护进程。
4、init进程会创建和挂在文件系统,初始化和启动系统服务,并给子进程创建信号处理函数防止僵尸进程出现。通过(init.rc配置文件)fork java进程的鼻祖,zygote。
5、zygote,会启Java虚拟机,注册jni方法和预加载类和资源。并使用jni方法调用zygoteInit的main方法。
6、ZygoteInit中创建一个 Server端的socket用于客户端发出创建应用的请求。预加载类和资源和启动SystemServer进程,并等待AMS的创建进程请求。
会fork systemServer进程,通过socket进行通信。
5、systemServer通过AMS通过socket与zygote通信,然后创建app进程
init进程的启动
step1 FirstStageMain
初始化crash重启引导加载程
挂载 创建文件
重定向输入输出
初始化内核的日志打印
启动seLinux_setup
step2 SetupSelinux
提高Linux安全,约束访问权限。
step3 SecondStageMain
监听进程终止信号,清除僵尸进程
解析inir.rc(执行zygote 执行重启)
向队列中添加action
循环处理脚本中的事件
总结起来就是
挂载文件
设置之selinux--安全策略
开启属性服务,注册到epoll???
解析init.rc
循环处理 脚本--启动zygote
循环等待
zygote执行流程
1、手机开机后会执行init文件,启动init.rc脚本,在脚本里启动zygote
2、来到app_main.CPP
初始化AndroidRuntime
设置zygote为启动模式,strcmp(arg,"--zygote")
给start函数的参数args赋值
runtime.start()启动Zygoteinit
zygoteinit创建虚拟机、注册JNI然后Zygote的main函数
ZygoteInit .MAIN
预加载
创建socket
创建systemServer
systemserver 的 main方法
无限循环
孵化应用进程为什么不交给SystemServer来做,而是专门设计一个Zygote?
zygote是所有android应用进程的母体,zygote在启动时做了很多耗时操作,比如启动虚拟机,注册jni方法,预加载系统资源。子进程使用fork孵化进程的方式继承了这些资源,并可以直接使用而不需要重新加载,提高了应用启动的速度和性能。
而SystemServer中注册了很多系统服务,而在应用子进程中都是不需要的。
App的启动流程
1、Laucnher也就是桌面图标被点击,转到Instrumentation类的startActivity方法
2、Instrument通过跨进程通信报告AMS要启动应用的需求
3、AMS反馈Launcher,让它进入到Pause状态
4、Launcher进入Paused状态,AMS转到ZygoteProcess类,并通过socket与Zygote通信,告诉Zygote需要新建进程。
5、Zygote fork进程,并调用ActivityThread的main方法,也就是App的入口
6、ActivityThread的main方法新建了ActivityThread的实例,并新建了Looper实例,开始loop循环
7、ActivityThread告诉AMS,进程创建完毕,开始穿件Application,provide,并调用Application的attach和onCreate方法
5、最后就是创建上下文,通过类加载器加载Activity,调用Activity的onCreate方法