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进程

Android启动流程相关

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

Android启动流程相关