andorid启动流程学习

一个Android手机从按下开机键开机

在这里插入图片描述

Boot rom(开机键) --》Boot loader(引导程序) – 》kernel(拉起linux内核) --》init(调起应用用户态第一个进程,主要是解析init.rc,根据不同的文件类型创建不同的解析器。)(pid == 1,c++framework、native)–》Zygote(上一个init会调起一系列的进程服务,包括Zygote)(android runtime)–》system service(Zygote会调SystemService进程)–》apps

init阶段就是进行一些初始化,主要记住的一些概念大概从zygote开始。

zygote概述:Zygote中文翻译为“受精卵”,正如其名,它主要用于孵化子进程。在Android系统中有以下两种程序:
java应用程序,主要基于ART虚拟机,所有的应用程序apk都属于这类native程序,也就是利用C或C++语言开发的程序,如bootanimation。所有的Java应用程序进程及系统服务SystemServer进程都由Zygote进程通过Linux的fork()函数孵化出来的,这也就是为什么把它称为Zygote的原因,因为他就像一个受精卵,孵化出无数子进程,而native程序则由Init程序创建启动。
Zygote进程最初的名字不是“zygote”而是“app_process”,这个名字是在Android.mk文件中定义的
Zgyote是Android中的第一个art虚拟机,他通过socket的方式与其他进程进行通信。这里的“其他进程”
其实主要是系统进程——SystemServer

fork函数,复制一个新的进程出来,会有两次返回,因为复制了两个,根据pid来判断,小于0则失败,大于0创建成功,继续执行父进程代码,等于0创建成功,接下来执行子进程的代码。

如果父进程有两个线程a和b。
在b中fork了一个进程出来,这个时候是没有a的,只是复制了b。
如果刚好b中有个lock,需要依靠a来唤醒,那么就会变成死锁了。

还有一些孤儿进程、僵死进程,子线程的退出必须等到父进程捕捉到你的退出状态才真正结束,如果父进程先退出的话就有可能出现。内存泄漏

Zygote进程 start()之后执行fork()一个新的进程pid == 0,会调用app_mian.cpp 进行mian()方法
在这里插入图片描述
通过读取目标文件,解析出对应的字符来判断应该启动哪一个进程。

调用了app_mian.cpp的main方法之后
main()–》AndroidRuntime.start()–>startVm(启动虚拟机) --》startReg(一些jni、注册表注册)–》Zygoteinit.main()–》registerZygoteSocket(等待其他进程的通信accept)–》preload(加载一些列的资源)–》startSystemService()–》runSelectLoop(接收其他进程的socket通信之后的处理)

我们android的进程通信机制binder为什么不用,而是用socket?
并没有找到很完美的答案,从上面的流程可以看出是先有socket才有SystemService,这也是一个解释。
我们知道binder的跨进程通信,一开始初始化驱动的时候只划分了4KB的内存,等到真正存储数据的时候才会再次扩容。
serviceManager初始128k,驱动的通信在传输时候划分是4m大小,但是应用层限定了serviceManager的传输大小是1m-8k,并且还会存储跨进程传输的各种服务列表,等等,从内存的角度考虑也是可以解释一下的。反正谷歌就是用了socket了,哈哈哈。

preload会加载一系列的资源,开机加载慢差不多就是这里和后面的启动系统服务,所以等它走完了上述几个流程之后,后面我们启动app直接fork一个子进程速度就会快很多。
preload加载主要是classes,后面的SystemService加载资源创建context更多是显示launcher所需要的图片布局等资源。

startSystemService会调用netiveSystemService–》底层linux的fork函数,这里fork的是Zygote开启调动的系统服务各种服务,它也是一个进程。

看完资料完全一脸懵逼,都是底层代码,我不习惯完全不懂的东西去强行记忆,暂时启动流程就记住这些吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值