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办法