APP启动流程

首先看张android手机系统图
这里写图片描述
从按电源键到导航界面,android初始化的组件:

Loader层:
Boot Rom:电源按下,引导芯片代码从固化Rom层开始执行,加载执行到RAM层,
Boot Loader:这是进入android系统前的引导程序,主要检测外部RAM、网络,内存、硬件参数等。

Kernel层:
android系统的内核层,到在这里才刚进入android系统,启动了两个进程,swapper进程(pid=0):从无到有的第一个进程,初始化进程管理,内存管理和加载各种驱动等工作,启动kthreadd进程(pid=2):是系统的内核进程,会创建内核工作进程kworkder和一系列守护进程,kthreadd进程是所有内核进程的父进程。

Native层:
native层启动init进程(android第一个用户空间进程),HAL(硬件抽象层)和开机动画,init进程是所有用户进程的鼻祖,同时init进程会孵化出一系列用户进程,包括孵化Zygote进程,Zygote进程是java层的第一个进程,

总结:

kthreadd进程:是所有内核进程的父进程

init进程:是所有用户进程的父进程

zygote进程:是所有上层java进程(framework)的父进程。

FrameWork层:
framework层分为java framework和c++ framework层,分别由system_server进程和media_server进程启动和管理。zygote进程会孵化出第一个进程system_server,同时孵化出第一个app进程APP进程Launcher,也就是桌面APP,system_server进程会启动N多服务,包括我们常用的ActivityManagerService、WindowManagerService和PackageManagerService等

APP层:
zygote进程孵化出第一个app进程launcher进程,就是桌面的app,然后还有其他的app进程如Browser,phone,Email等进程,,所有的app进程都是由zygote孵化出来的

APP启动:

当点击桌面APP时,由Launcher进程启动远程进程,利用Binder通信发送消息给system_server进程,启动进程先调用AMS.startProcessLocked方法,内部调用Process.start(android.app.ActivityThread),而后通过socket通信告知zygote进程fork出app进程,app进程中执行ActivityThread.main()方法。
这里写图片描述
在ActivityThread.main()方法中主要做两件事,一是准备主线程Looper,开启消息队列,二是调用ActivityThread.attch方法,将其绑定到ActivivtyManagerService中,看attch方法
这里写图片描述
ActivityManagerNative是继承自Binder并且实现IActivityManager这个Binder接口,AMS继承自ActivityManagerNative,getDefault()返回的就是Binder的具体实现AMS,将ApplicationThread对象绑定到AMS中,跨进程调用attachApplication方法,看AMS中attachApplication方法
这里写图片描述
在attachApplicationLocked方法逻辑要长很多,比较重要的调用方法是bindApplication和attachApplicationLocked这两个。
这里写图片描述
顾名思义,就是将ApplicationThread对象绑定到AMS中
这里写图片描述
mStackSupervisor指向的是一个ActivityStackSupervisor类的对象,看下这个类的attachApplicationLocked方法
这里写图片描述
里面重要的代码就是红色框中的,realStartActivityLocked方法,如名字一样,其内部就是真正启动Activity的逻辑。 在realStartActivityLocked方法中有如下一段代码
这里写图片描述
其中app.thread的类型为IApplicationThread,是一个接口,实现了IInterface接口,它是一个Binder类型的接口,接口方法定义很多activity启动、停止,service的启动和停止的方法,说明它和activity和service启动和停止有关,那么它的实现类是谁呢,答案是ApplicationThread。
这里写图片描述
这里写图片描述
在ApplicationThread中的scheduleLaunchActivity的实现很简单,就是发送一个消息给H处理
sendMessage(H.LAUNCH_ACTIVITY,r);
再看handler对这则消息的处理:
这里写图片描述
启动过程交由ActicityThread的handleLaunchActivity处理,这个方法又调用performLaunchActivity方法返回Activity对象实例.
这里写图片描述
这里写图片描述
在makeApplication中创建Application对象实例,当之前有创建application对象,则直接返回,没有则创建,说明一个app只能有一个application对象。
这里写图片描述
application对象创建完毕后,系统会通过callApplicationOnCreate()来调用Application的onCreate方法。
这里写图片描述
在performLaunchActivity方法里,还创建了contextImpl对象,然后attch方法关联activity的基本信息
这里写图片描述
这里写图片描述
在activity,attach方法中新建了window窗口,并将activity与window关联。
。
会调用activity的onCreate方法。
这里写图片描述
至此,整个app的启动流程分析结束。
参考链接:

http://www.jianshu.com/p/b85b929a12b7

http://www.jianshu.com/p/c129eea78d61

《andorid开发艺术探索》

《Android设计模式实战》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值