本文分析了从点击桌面上的app图标开始到app主页面显示的过程。
一、启动流程概述
上面的一些列步骤简单介绍了一个APP启动到主页面显示的过程:
①点击桌面App图标,Launcher进程通过Binder IPC向system_server进程发起startActivity请求;
②system_server进程接收到请求后,向zygote进程发送创建进程的请求;
③Zygote进程fork出一个新的子进程,即App进程;
④App进程,通过Binder IPC向sytem_server进程发起attachApplication请求;
⑤system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求;
⑥App进程的ApplicationThread在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;
⑦主线程在收到LAUNCH_ACTIVITY消息后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法。
⑧到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。
二、相关的理论基础
1.zygote
zygote进程由init进程fork出来,所有app进程都是由zygote进程fork出来。
每一个App
- 都是一个单独的进程
- 都拥有一个独立的Dalvik虚拟机实例
2.system_server
system_server进程由zygote进程fork出来,这个进程运行着大量的系统服务,比如
ActivityManagerService、PackageManagerService、WindowManagerService等等
3.ActivityManagerService
简称AMS,继承自IActivityManager.Stub。在SystemServer进程开启的时候,就会初始化ActivityManagerServic。在Android系统中,任何一个Activity的启动都是由AMS和应用程序进程(主要通过ActivityThread)相互配合来完成的。AMS统一调度系统中所有进程的Activity启动。
AMS的作用:
- 如果想打开一个App的话,需要AMS去通知zygote进程。
- 除此之外,所有的Activity的启动、暂停、关闭都需要AMS来控制,所以我们说,AMS负责系统中所有Activity的生命周期。
4.Launcher
Launcher本质上也是一个应用程序,也是继承自Activity。
packages/apps/Launcher2/src/com/android/launcher2/Launcher.java
/**
* Default launcher application.
*/
public final class Launcher extends Activity
implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks,
View.OnTouchListener {
static final String TAG = "Launcher";
...//其他代码
}
5.Instrumentation
每个Activity都持有Instrumentation对象的一个引用,但是整个进程只会存在一个Instrumentation对象。
Instrumentation这个类里面的方法大多数和Application和Activity有关,这个类就是负责Application和Activity的初始化以及生命周期。
6.ActivityThread
7. ApplicationThread
ApplicationThread是ActivityThread的内部类
private class ApplicationThread extends IApplicationThread.Stub {
...//其他代码
}
App的启动以及Activity的显示都需要AMS的控制,app进程便需要和AMS进行通信,而这个通信是双向的。
1.当app进程调用AMS的方法时,app进程是client端,AMS是server端。
使用ActivityManagerProxy和ActivityManagerService进行通信。
由于都实现了同样的IActivityManager接口,ActivityManagerProxy提供了与ActivityManagerService一样的函数原型,使用户感觉不出Server是运行在本地还是远端,从而可以更加方便的调用这些重要的系统服务。
2.当AMS调用app进程的方法时,AMS是client端,app进程是server端。
使用ApplicationThreadProxy和ApplicationThread进行通信。
ApplicationThreadProxy和ApplicationThread都实现了IApplicationThread接口。