Application启动流程分析一 Zygote是如何fork进程的

一个App启动另外一个App不会直接启动Application,而是启动另外一个App的MainActivity
在这里插入图片描述

应用进程启动

当System_service进程里面的ATMS检查到要启动的Activity对应的进程还没启动的时候,就会通过socket机制通知Zygote进程fork出对应的APP进程。

在这里插入图片描述

ActivityStackSupervisor类的startSpecificActivity,判断Activity对应的进程是否被启动

ActivityStackSupervisor类里面的startSpecificActivity是真正启动Activity之前执行的函数,这个函数首先判断了Activity对应的进程是否创建,创建了的话直接启动Activity,否则为app启动一个进程。

 void startSpecificActivity(ActivityRecord r, boolean andResume, boolean checkConfig) {
   
   
        // Is this activity's application already running?
        final WindowProcessController wpc =
                mService.getProcessController(r.processName, r.info.applicationInfo.uid);

        boolean knownToBeDead = false;
		// 进程已经创建的话,直接启动activity
        if (wpc != null && wpc.hasThread()) {
   
   
            try {
   
   
                realStartActivityLocked(r, wpc, andResume, checkConfig);
                return;
            } catch (RemoteException e) {
   
   
                Slog.w(TAG, "Exception when starting activity "
                        + r.intent.getComponent().flattenToShortString(), e);
            }

            // If a dead object exception was thrown -- fall through to
            // restart the application.
            knownToBeDead = true;
        }

        r.notifyUnknownVisibilityLaunchedForKeyguardTransition();

        final boolean isTop = andResume && r.isTopRunningActivity();
		//进程不存在的话,为app启动一个进程
        mService.startProcessAsync(r, knownToBeDead, isTop, isTop ? "top-activity" : "activity");
    }

真正启动进程—》ATMS的startProcessAsync怎么启动一个进程?

 void startProcessAsync(ActivityRecord activity, boolean knownToBeDead, boolean isTop,
            String hostingType) {
   
   
        try {
   
   
            if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) {
   
   
                Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "dispatchingStartProcess:"
                        + activity.processName);
            }
            // Post message to start process to avoid possible deadlock of calling into AMS with the
            // ATMS lock held.
            final Message m = PooledLambda.obtainMessage(ActivityManagerInternal::startProcess,
                    mAmInternal, activity.processName, activity.info.applicationInfo, knownToBeDead,
                    isTop, hostingType, activity.intent.getComponent());
            mH.sendMessage(m);
        } finally {
   
   
            Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
        }
    }

通过代码可以看到是通过ActivityManagerInternal的startProcess方法启动一个进程。ActivityManagerInternal是AMS里面的一个内部类,这个内部类里面有AMS大部分的服务。

 public final class LocalService extends ActivityManagerInternal

在LocalService的startProcess方法里面最后会调入到AMS的startProcessLocked方法。

    @GuardedBy("this")
    final ProcessRecord startProcessLocked(String processName,
            ApplicationInfo info, boolean knownToBeDead, int intentFlags,
            HostingRecord hostingRecord, int zygotePolicyFlags, boolean allowWhileBooting,
            boolean isolated, boolean keepIfLarge) {
   
   
        return mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags,
                hostingRecord, zygotePolicyFlags, allowWhileBooting, isolated, 0 /* isolatedUid */,
                keepIfLarge, null /* ABI override */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值