简介Android启动过程

其实吧,大家都不是神,不可能一出生就知道一个事情,都是后天学习的结果。

对于Android启动过程,网上讲的太复杂了,像我们这种菜鸟看都看不明白他说半天说个啥。

所以吧,我决定自己讲讲,简单的讲讲,简单到听一遍就会了。


Android启动可以有两个不同的理解,这一定要分开,决不能像网上别人那样含糊其辞。

Android启动一种理解是Android系统的启动,第二种理解是Android应用的启动,这两个启动可以说是风马牛不相及的。

以下见解纯属个人见解,如有不对请指正。

先看Android系统启动:

1.启动Linux系统

启动Linux系统的过程我就不讲了,系统都是从BIOS启动起来的。
执行system/core/init/init.c是Linux启动的一个必要操作。

2.启动Zygote进程

代码在哪:

system/core/init/init.c
init.c会调device/renesas/emev/init.rc
init.rc会调framework/base/cmds/app_process/app_main.cpp
app_main.cpp负责启动Zygote进程。

什么Zygote进程?

Zygote进程其实是一个Linux的服务,所以也可以叫Zygote服务。
Zygote服务其实是和系统服务是平级的关系,但Zygote服务会比系统服务先启动。

为什么需要Zygote?

Zygote服务的作用就是专门处理Android应用启动,或者说专门克隆Dalvik进程。如用户一点app图标去启动app,那么原始的Dalvik是最先处理这个事件的,那个原始的Dalvik进程会请求Zygote服务克隆一个新的Dalvik,这个新的Dalvik会去启动app(执行ActivityThread的main)。

为什么要克隆Dalvik进程?

其实我们可以反过来思考:Android应用需要一个什么样的进程?
当然是一个Dalvik虚拟机进程啊!
所以Zygote服务需要克隆的是一个Dalvik进程。

问题又来了为什么要克隆不直接创建呢?

因为克隆比创建一个新的Dalvik快,这就是Google所说的对Dalvik专门的优化之一。

克隆之后Zygote还要干嘛呢?

Zygote是个死循环,它会一直循环等别人发起克隆Dalvik的请求,所以克隆一个Dalvik之后它又会等下一个克隆请求。

最原始的Dalvik是如何请求Zygote克隆Dalvik的?

Dalvik中的ZygoteInit.java会请求Zygote服务克隆一个Dalvik,说具体点就是克隆Dalvik自己进程的所有属性和服务,用来给Android应用使用。

为什么会有一个可以永远被克隆的Dalvik虚拟机进程呢,这个虚拟机进程是怎么来的?

最原始的Dalvik虚拟机进程在Zygote进程启动时已经启动了,代码仍然在app_main.cpp,app_main.cpp会调用AndroitRuntime.app,AndroidRuntime.cpp启动第一个Dalvik。

3.启动系统服务

Linux在启动Zygote服务后,紧接着马上启动系统服务。
系统服务我也不太了解,不了解就不误导人了。只知道它和Zygote是好基友,Zygote是老大,系统服务是小弟,这两个好基友撑起了Android运行环境的半边天。
估计系统服务人如其名,只是一些Android应用需要的一些Android系统必备服务。

再来说Android应用启动:

1.创建应用进程

这个步骤由最原始的Dalvik完成的,其实就是由最原始的Dalvik向Zygote服务请求从自己身上克隆出一个Dalvik。

2.创建主线程

这个步骤是由最原始的Dalvik克隆出来的Dalvik完成的。
创建的主线程类叫:ActivityThread.java。
四大组件都是由它启动的,不过它不直接管理Activity,它负责启动ActivityManager,ActivityManager负责管理Activity,就是负责Activity的生命周期,什么onCreate等方法都是由ActivityManager调用的。
这个步骤是应用程序的真正入口点,所以以后千万别说Activity的onCreate是Android应用的入口点了!真正的入口点ActivityThread的main方法。

3启动主Activity

这个步骤也是由最原始的Dalvik克隆出来的Dalvik完成的。

PS:Android项目编译并运行过程:

1.javac工具先把java文件编译成class文件。

2.dx工具再把class文件编译成classes.dex文件。

3.dx工具再把classes.dex和其他资源文件等打包并签名成apk文件。

4.abd工具再把apk安装到Android模拟器即AVD上。

5.AVD运行apk。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值