android 冷启动,android开启app过程

APP的启动过程是任何一个学习Android的人所必须了解的,这篇文章将会基于Android P完整的解析一个APP从其图标被点击到其界面显示完毕的全过程 。
1、概述
概括地来说,一个APP的冷启动过程可以划分如下:
请求阶段
1.发起请求
2.解析Intent
3.创建ActivityRecord
4.分配Task
5.Pause前台activity
6.Resume请求的activity
进程启动阶段
7.AMS请求创建进程
8.Zygote fork进程
9.初始化 Runtime
10.注册进程到system_server
11.创建application
Activity初始化阶段
12.真正地start activity
13.加载activity
14.初始化窗口
Activity显示阶段
15.新建DecorView
16.新建ViewRootImpl
17.添加到Display
18.显示
注意,这里说的是APP冷启动的过程,如果不是冷启动,经过的阶段是上述阶段的一个子集 。
2、发出启动Activity的请求
Android为了降低开发难度,屏蔽底层进程间通讯等细节,抽象出了四大组件 。通过四大组件,我们可以方便、快捷地和其他组件进行交互,而不管目标组件是在哪个APP实现的、哪个进程中运行的 。而一个APP的主Activity通常声明如下:
android.intent.action.MAIN:决定应用的入口Activity , 也就是我们启动应用时首先显示哪一个Activity 。
android.intent.category.LAUNCHER:表示activity应该被列入系统的启动器(launcher)(允许用户启动它) 。Launcher是安卓系统中的桌面启动器,是桌面UI的统称 。
凡是声明了上面filter的activity,都会被launcher解析出来 , 对应图标排列在桌面 。这样,用户就可以通过点击的方式启动Activity了 。
APP端启动activity流程是:
Acticity.startActivity(new Intent(this,target.class))
Acticity.startActivityForResult(...)
Instrumentation.execStartActivity(...)
IActivityManager.startActivity(...)
(为了简洁起见,上面过程省略一些重载的调用,以后调用过程同样如此) 。
APP请求启动activity最重要的两个参数:Context和Intent 。
Context指明我是谁 。为了安全认证和管理,系统必须知道谁请求启动activity,而context里面包含着身份信息例如activity token等表明了我是谁,这样ActivityManagerService(以后简称AMS)才允许启动activity 。
Intent指明我想做什么 。上面的intent是显式intent,显式intent通常用在包内启动组件 , 如果是启动其他APP的组件 , 则通常用隐式intent 。显式intent里面包含了一个ComponentName,ComponentName由包名类名组成,可以唯一标识一个组件,系统通过ComponentName就可以找到要启动的组件 。隐式intent通常通过Action来过滤出要启动的组件,这一点我们将在第3节中展开讲述 。
在表明身份和说明意图后,最后通过Binder调用请求AMS启动目标activity
3、AMS解析Intent
本阶段的调用流程是:
AMS.startActivity(...)
AMS.startActivityAsUser(...)
ActivityStarter.startActivity(...)
ActivityStarter.startActivityMayWait(...)
ResolveInfo rInfo = ASS.resolveIntent(intent,uid,...)
PackageManagerService.resolveIntent()
ActivityInfo aInfo = ASS.resolveActivity(intent, rInfo...);
ActivityStarter.startActivty(intent,aInfo,...)
AMS解析Intent主要是通过PackageManagerService后面简称(PMS)来解析的,因为我们四大组件都是必须声明在AndroidManifest.xml文件中的(广播接收器允许动态注册) 。Android这么做的原因上面也说过了,为了屏蔽进程间通讯细节,应用之间通过组件就可以交互,系统会在必要的时候拉起对方进程 。在应用没起来之前,只有PMS知道应用都有哪些组件 。应用四大组件的信息在应用安装的时候,就已经被PMS解析保存起来了 。如果没有声明在AndroidManifest.xml文件中,那么AMS就无法获取目标组件的信息,对于显式intent,会抛出错误;对于隐式intent,也会启动失败 。