Android启动流程相关

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

image.png

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

image.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYfqGgqN' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片