Android APP启动过程分析

本文分析了从点击桌面上的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的作用:

  1. 如果想打开一个App的话,需要AMS去通知zygote进程。
  2. 除此之外,所有的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进行通信。
在这里插入图片描述
ApplicationThreadProxyApplicationThread都实现了IApplicationThread接口。

三、启动流程详述

参考:
一个APP从启动到主页面显示经历了哪些过程?
Android App启动流程详解

发布了535 篇原创文章 · 获赞 94 · 访问量 74万+

猜你喜欢

转载自blog.csdn.net/yzpbright/article/details/104801449