要想启动一个应用程序,首先要保证这个应用程序所需要的应用程序进程已经启动。AMS在启动应用程序时会检查这个应用程序需要的应用程序进程是否存在,不存在就会请求Zygote进程启动需要的应用程序进程。下面来看下启动应用进程的大致流程吧:
一、AMS发送启动应用程序进程请求
我们一般通过调用Context.startActivity()方法来启动一个新应用的Activity,startActivity方法中经过层层调用最终会调用到ActivityStackSupervisor类的startSpecificActivityLocked方法,关于Context.startActivity()到ActivityStackSupervisor.startSpecificActivityLocked()方法调用流程,我这里简单列下各个类方法的调用:
Context.startActivity() -> Context.startActivityForResult() ->
Instrumentation.execStartActivity() -> ActivityManager.getService().startActivity()
-> ActivityManagerService.startActivityAsUser() -> ActivityStarter.startActivityMayWait()
-> ActivityStarter.startActivityLocked() -> ActivityStarter.startActivity() (调用多个重载)
-> ActivityStarter.startActivityUnchecked() -> ActivityStackSupervisor.resumeFocusedStackTopActivityLocked()
-> ActivityStack.resumeTopActivityUncheckedLocked() -> ActivityStack.resumeTopActivityInnerLocked()
-> ActivityStackSupervisor.startSpecificActivityLocked() 方法
如下是startSpecificActivityLocked()方法,因为我们是要打开一个应用进程还未开启的的activity,所以会进入到startProcessLocked方法调用来开启一个进程。
frameworks\base\services\core\java\com\android\server\am\ActivityStackSupervisor.java
void startSpecificActivityLocked(ActivityRecord r, boolean andResume, boolean checkConfig) {
.......
// 1、当前要运行的Activity所在的应用程序进程已经运行启动,这走realStartActivityLocked方法
if (app != null && app.thread != null) {
// 如果当前activity
try {
......
realStartActivityLocked(r, app, andResume, checkConfig);
return;
} catch (RemoteException e) {
}
}
// 2、当前要运行的Activity所在的应用程序进程未运行,则调用
// ActivityManagerService类的startProcessLocked方法
mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
"activity", r.intent.getComponent(), false, false, true);
}
然而上面调用的ActivityManagerService类startProcessLocked方法又是最终会调用startProcessLocked( , /* entryPoint */ null, …)的重载方法,并在该重载方法总调用Process类的start()方法开开启进程。
frameworks\base\services\core\java\com\android\server\am\ActivityManagerService.java
private final void startProcessLocked(com.android.server.am.ProcessRecord app,
String hostingType, String hostingNameStr) {
startProcessLocked(app, hostingType, hostingNameStr, null /* abiOverride */,
null /* entryPoint */, null /* entryPointArgs */);
}
private final void startProcessLocked(com.android.server.am.ProcessRecord app, String hostingType,
String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs) {
......
if (entryPoint == null) // entryPoint上面调用可知entryPoint = null
entryPoint = "android.app.ActivityThread"; // 记住这个是后面打开进程后要运行的类
......
if (hostingType.equals("webview_service")) {
.......
} else {
// 开启应用程序进程
startResult = Process.start(entryPoint, ....);
}
}
在Process类的start方法中又是调用zygoteProcess类的start方法
frameworks\base\core\java\android\os\Process.java
public static final ProcessStartResult