应用程序进程启动过程概要

       要想启动一个应用程序,首先要保证这个应用程序所需要的应用程序进程已经启动。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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值