美文网首页FrameWork
APP启动流程(二)ActivityTaskManagerSer

APP启动流程(二)ActivityTaskManagerSer

作者: Duzzi | 来源:发表于2021-09-01 17:32 被阅读0次

    具体过程

    1.ActivityTaskManagerService->ActivityStarter

    frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java

    ActivityTaskManagerService执行startActivity方法最终获取到ActivityStarter,ActivityStarter对启动activity的相关参数进行了赋值,最终执行execute方法

    
    public final int startActivity(IApplicationThread caller, String callingPackage,
            String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo,
            String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo,
            Bundle bOptions) {
        return startActivityAsUser(caller, callingPackage, callingFeatureId, intent, resolvedType,
                resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions,
                UserHandle.getCallingUserId());
    }
    
    public final int startActivity(IApplicationThread caller, String callingPackage,
            String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo,
            String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo,
            Bundle bOptions) {
        return startActivityAsUser(caller, callingPackage, callingFeatureId, intent, resolvedType,
                resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions,
                UserHandle.getCallingUserId());
    }
    
    private int startActivityAsUser(IApplicationThread caller, String callingPackage,
            @Nullable String callingFeatureId, Intent intent, String resolvedType,
            IBinder resultTo, String resultWho, int requestCode, int startFlags,
            ProfilerInfo profilerInfo, Bundle bOptions, int userId, boolean validateIncomingUser) {
        //检查callingUid与当前callingPackage是否是用一个应用,如果不是抛出异常
        assertPackageMatchesCallingUid(callingPackage);
        //判断是否被隔离
        enforceNotIsolatedCaller("startActivityAsUser");
        //
        userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,
                Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");
    
        // TODO: Switch to user app stacks here.
        return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
                .setCaller(caller)
                .setCallingPackage(callingPackage)
                .setCallingFeatureId(callingFeatureId)
                .setResolvedType(resolvedType)
                .setResultTo(resultTo)
                .setResultWho(resultWho)
                .setRequestCode(requestCode)
                .setStartFlags(startFlags)
                .setProfilerInfo(profilerInfo)
                .setActivityOptions(bOptions)
                .setUserId(userId)
                .execute();
    
    }
    

    2.ActivityStarter

    frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java
    用于解释如何启动Activity和启动Activity的控制器,执行executeRequest

    //根据之前提供的请求参数解析必要的信息,执行启动Activity的请求
    int execute() {
        try {
                final LaunchingState launchingState;
                synchronized (mService.mGlobalLock) {
                    final ActivityRecord caller = ActivityRecord.forTokenLocked(mRequest.resultTo);
                    launchingState = mSupervisor.getActivityMetricsLogger().notifyActivityLaunching(
                            mRequest.intent, caller);
                }
                if (mRequest.activityInfo == null) {
                    mRequest.resolveActivity(mSupervisor);
                }
                int res;
                synchronized (mService.mGlobalLock) {
                    final boolean globalConfigWillChange = mRequest.globalConfig != null
                            && mService.getGlobalConfiguration().diff(mRequest.globalConfig) != 0;
                    final ActivityStack stack = mRootWindowContainer.getTopDisplayFocusedStack();
                    if (stack != null) {
                        stack.mConfigWillChange = globalConfigWillChange;
                    }
    
                    final long origId = Binder.clearCallingIdentity();
                    res = resolveToHeavyWeightSwitcherIfNeeded();
                    if (res != START_SUCCESS) {
                        return res;
                    }
                    //这里执行启动activity
                    res = executeRequest(mRequest);
    
                    Binder.restoreCallingIdentity(origId);
    
                    if (globalConfigWillChange) {
                        mService.mAmInternal.enforceCallingPermission(
                                android.Manifest.permission.CHANGE_CONFIGURATION,
                                "updateConfiguration()");
                        if (stack != null) {
                            stack.mConfigWillChange = false;
                        }
                        mService.updateConfigurationLocked(mRequest.globalConfig, null, false);
                    }
    
                    // 通知 ActivityMetricsLogger 已经启动了activity,ActivityMetricsLogger将会等待window绘制和填充结果
                    mSupervisor.getActivityMetricsLogger().notifyActivityLaunched(launchingState, res,
                            mLastStartActivityRecord);
                    return getExternalResult(mRequest.waitResult == null ? res
                            : waitForResult(res, mLastStartActivityRecord));
                }
            } finally {
                onExecutionComplete();
            }
    }
    
    //执行启动Activity的请求并开始启动Activity。在这里首先执行一些初步检查,正常情况下将调用startActivityUnchecked->startActivityInner启动Acitivy
    private int executeRequest(Request request) {
    
        //一系列的检查...
        
        mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession,
                request.voiceInteractor, startFlags, true /* doResume */, checkedOptions, inTask,
                restrictedBgActivity, intentGrants);
    }
    
    private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,
                IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
                int startFlags, boolean doResume, ActivityOptions options, Task inTask,
                boolean restrictedBgActivity, NeededUriGrants intentGrants) {
        int result = START_CANCELED;
        final ActivityStack startedActivityStack;
        try {
            mService.deferWindowLayout();
            
            result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor,
                    startFlags, doResume, options, inTask, restrictedBgActivity, intentGrants);
        } finally {
            startedActivityStack = handleStartResult(r, result);
            mService.continueWindowLayout();
        }
        postStartActivityProcessing(r, result, startedActivityStack);
        return result;
    }
    
    //启动Activity并确定Activity是否应添加到现有任务的顶部或向现有Activity传递新的Intent,同时将Activity Task操作到请求的或有效的任务栈显示上。
    //该方法只能被startActivityUnchecked调用
    int startActivityInner(final ActivityRecord r, ActivityRecord sourceRecord,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            int startFlags, boolean doResume, ActivityOptions options, Task inTask,
            boolean restrictedBgActivity, NeededUriGrants intentGrants) {
        //计算启动Activity的TaskFlag
        computeLaunchingTaskFlags();
        //计算源任务栈
        computeSourceStack();
        //设置启动Flag
        mIntent.setFlags(mLaunchFlags);
        //获取是否有可用的任务栈
        final Task reusedTask = getReusableTask();
        //判断是否有可用的目标任务栈
        final Task targetTask = reusedTask != null ? reusedTask : computeTargetTask();
        final boolean newTask = targetTask == null;
        mTargetTask = targetTask;
        //计算启动参数
        computeLaunchParams(r, sourceRecord, targetTask);
        //检查是否允许启动
        int startResult = isAllowedToStart(r, newTask, targetTask);
        if (startResult != START_SUCCESS) {
            return startResult;
        }
        final ActivityRecord targetTaskTop = newTask? null : targetTask.getTopNonFinishingActivity();
        if (targetTaskTop != null) {
            //有可复用的任务栈,复用此次启动的任务栈
            // Recycle the target task for this launch.
            startResult = recycleTask(targetTask, targetTaskTop, reusedTask, intentGrants);
            if (startResult != START_SUCCESS) {
                return startResult;
            }
        } else {
            //需要添加到新的任务栈
            mAddingToTask = true;
        }
        //如果将要启动的Activity和TopActivity相同,检查是否需要只用启动一次
        final ActivityStack topStack = mRootWindowContainer.getTopDisplayFocusedStack();
        if (topStack != null) {
            startResult = deliverToCurrentTopIfNeeded(topStack, intentGrants);
            if (startResult != START_SUCCESS) {
                return startResult;
            }
        }
        
        ...
        if (mDoResume) {
            final ActivityRecord topTaskActivity =
                    mStartActivity.getTask().topRunningActivityLocked();
            if (!mTargetStack.isTopActivityFocusable()
                    || (topTaskActivity != null && topTaskActivity.isTaskOverlay()
                    && mStartActivity != topTaskActivity)) {
                mTargetStack.ensureActivitiesVisible(null /* starting */,
                        0 /* configChanges */, !PRESERVE_WINDOWS);
                mTargetStack.getDisplay().mDisplayContent.executeAppTransition();
            } else {
                if (mTargetStack.isTopActivityFocusable()&& !mRootWindowContainer.isTopDisplayFocusedStack(mTargetStack)) {
                    mTargetStack.moveToFront("startActivityInner");
                }
                
                //resume栈顶的activity
                mRootWindowContainer.resumeFocusedStacksTopActivities(mTargetStack, mStartActivity, mOptions);
            }
        }
                
    }
    
    
    

    3.RootWindowContainer

    frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java

    
    boolean resumeFocusedStacksTopActivities(
            ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
        //...
        boolean result = false;
        if (targetStack != null && (targetStack.isTopStackInDisplayArea()
                || getTopDisplayFocusedStack() == targetStack)) {
            result = targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
        }
        //...
    }
    
    
    

    4.ActivityStack

    frameworks/base/services/core/java/com/android/server/wm/ActivityStack.java

    boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
        if (mInResumeTopActivity) {
            return false;
        }
        boolean result = false;
        try {
            // 防止递归
            mInResumeTopActivity = true;
            //
            result = resumeTopActivityInnerLocked(prev, options);
    
            //在resume的过程中,对锁屏等特殊情况处理
            final ActivityRecord next = topRunningActivity(true /* focusableOnly */);
            if (next == null || !next.canTurnScreenOn()) {
                checkReadyForSleep();
            }
        } finally {
            mInResumeTopActivity = false;
        }
    
        return result;
    }
    

    做了非常多的判断,最终走到了mStackSupervisor.startSpecificActivity(next, true, true)来启动Activity

    private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {
            if (!mAtmService.isBooting() && !mAtmService.isBooted()) {
                return false;
            }
            
            // 找到还没finish的且获取到焦点的TopActivity。如果没有焦点,将在下一个获取焦点的任务中唤醒TopActivity
            ActivityRecord next = topRunningActivity(true /* focusableOnly */);
            
            //代码好多,做了大量的判断
            
            ...
            
            
            //topActivity是否启动了ApplicationThread,这里我们分析首次启动,所以跳过,直接进入else
            if (next.attachedToProcess()) {
                ...
            } else {
                // Whoops, need to restart this activity!
                if (!next.hasBeenLaunched) {
                    next.hasBeenLaunched = true;
                } else {
                    if (SHOW_APP_STARTING_PREVIEW) {
                        next.showStartingWindow(null /* prev */, false /* newTask */,
                                false /* taskSwich */);
                    }
                    if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "Restarting: " + next);
                }
                if (DEBUG_STATES) Slog.d(TAG_STATES, "resumeTopActivityLocked: Restarting " + next);
                //ActivityStackSupervisor执行startSpecificActivity
                mStackSupervisor.startSpecificActivity(next, true, true);
            }
    
            return true;
    }
    

    5.ActivityStackSupervisor

    frameworks/base/services/core/java/com/android/server/wm/ActivityStackSupervisor.java

    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;
        //如果已经有了ApplicationThread,直接启动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();
        //启动进程
        mService.startProcessAsync(r, knownToBeDead, isTop, isTop ? "top-activity" : "activity");
    }
    

    6. ActivityTaskManagerService,准备开始fork APP进程

    frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java

    注意源码中调用了ActivityManagerInternal::startProcess启动App进程,ActivityManagerInternal是系统服务抽象类,ActivityTaskManagerService中通过mAmInternal = LocalServices.getService(ActivityManagerInternal.class)获取到ActivityManagerInternal实现类对象,它的具体实现是ActivityManagerService的内部类LocalService

    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.
            //注意这里会先创建APP进程
            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);
        }
    }
    

    7.fork进程前

    frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java#LocalService

    public final class LocalService extends ActivityManagerInternal {
        @Override
        public void startProcess(String processName, ApplicationInfo info, boolean knownToBeDead,
                boolean isTop, String hostingType, ComponentName hostingName) {
            try {
                if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) {
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "startProcess:"
                            + processName);
                }
                synchronized (ActivityManagerService.this) {
                    startProcessLocked(processName, info, knownToBeDead, 0 /* intentFlags */,
                            new HostingRecord(hostingType, hostingName, isTop),
                            ZYGOTE_POLICY_FLAG_LATENCY_SENSITIVE, false /* allowWhileBooting */,
                            false /* isolated */, true /* keepIfLarge */);
                }
            } finally {
                Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
            }
        }
        
        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 */, null /* entryPoint */,
                    null /* entryPointArgs */, null /* crashHandler */);
        }
    }
    

    frameworks/base/services/core/java/com/android/server/am/ProcessList.java

    注意这里startProcessLocked中传入的entryPoint就是后面RuntimeInit中findStaticMain方法参数中的args.startClass

    final ProcessRecord startProcessLocked(String processName, ApplicationInfo info,
                boolean knownToBeDead, int intentFlags, HostingRecord hostingRecord,
                int zygotePolicyFlags, boolean allowWhileBooting, boolean isolated, int isolatedUid,
                boolean keepIfLarge, String abiOverride, String entryPoint, String[] entryPointArgs,
                Runnable crashHandler) {
        //....
        ProcessRecord app;
        final boolean success = startProcessLocked(app, hostingRecord, zygotePolicyFlags, abiOverride);
                        
    }
    
    final boolean startProcessLocked(ProcessRecord app, HostingRecord hostingRecord,
                int zygotePolicyFlags, String abiOverride) {
        return startProcessLocked(app, hostingRecord, zygotePolicyFlags,
                false /* disableHiddenApiChecks */, false /* disableTestApiChecks */,
                false /* mountExtStorageFull */, abiOverride);
    }
    
    boolean startProcessLocked(ProcessRecord app, HostingRecord hostingRecord,
                int zygotePolicyFlags, boolean disableHiddenApiChecks, boolean disableTestApiChecks,
                boolean mountExtStorageFull, String abiOverride) {
                
        final String seInfo = app.info.seInfo
                        + (TextUtils.isEmpty(app.info.seInfoUser) ? "" : app.info.seInfoUser);
        //启动进程。如果成功返回进程PID,如果失败抛出运行RuntimeException
        //注意这里传入的entryPoint就是后面RuntimeInit中findStaticMain方法参数中的args.startClass
        final String entryPoint = "android.app.ActivityThread";
        ...
        return startProcessLocked(hostingRecord, entryPoint, app, uid, gids,
                        runtimeFlags, zygotePolicyFlags, mountExternal, seInfo, requiredAbi,
                        instructionSet, invokeWith, startTime);
                    
    }
    
    
    boolean startProcessLocked(HostingRecord hostingRecord, String entryPoint, ProcessRecord app,
                int uid, int[] gids, int runtimeFlags, int zygotePolicyFlags, int mountExternal,
                String seInfo, String requiredAbi, String instructionSet, String invokeWith,
                long startTime) {
        ...
        //判断启动进程是否是异步方式
        if (mService.mConstants.FLAG_PROCESS_START_ASYNC) {
            if (DEBUG_PROCESSES) Slog.i(TAG_PROCESSES,
                    "Posting procStart msg for " + app.toShortString());
            mService.mProcStartHandler.post(() -> handleProcessStart(
                    app, entryPoint, gids, runtimeFlags, zygotePolicyFlags, mountExternal,
                    requiredAbi, instructionSet, invokeWith, startSeq));
            return true;
        } else {
            try {
                final Process.ProcessStartResult startResult = startProcess(hostingRecord,
                        entryPoint, app,
                        uid, gids, runtimeFlags, zygotePolicyFlags, mountExternal, seInfo,
                        requiredAbi, instructionSet, invokeWith, startTime);
                handleProcessStartedLocked(app, startResult.pid, startResult.usingWrapper,
                        startSeq, false);
            } catch (RuntimeException e) {
                Slog.e(ActivityManagerService.TAG, "Failure starting process "
                        + app.processName, e);
                app.pendingStart = false;
                mService.forceStopPackageLocked(app.info.packageName, UserHandle.getAppId(app.uid),
                        false, false, true, false, false, app.userId, "start failure");
            }
            return app.pid > 0;
        }
        
        private Process.ProcessStartResult startProcess(HostingRecord hostingRecord, String entryPoint,
                ProcessRecord app, int uid, int[] gids, int runtimeFlags, int zygotePolicyFlags,
                int mountExternal, String seInfo, String requiredAbi, String instructionSet,
                String invokeWith, long startTime) {
            if (hostingRecord.usesWebviewZygote()) {
                //分支1
                ...
            } else if (hostingRecord.usesAppZygote()) {
                //分支2
                final AppZygote appZygote = createAppZygoteForProcessIfNeeded(app);
    
                // We can't isolate app data and storage data as parent zygote already did that.
                startResult = appZygote.getProcess().start(entryPoint,
                        app.processName, uid, uid, gids, runtimeFlags, mountExternal,
                        app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
                        app.info.dataDir, null, app.info.packageName,
                        /*zygotePolicyFlags=*/ ZYGOTE_POLICY_FLAG_EMPTY, isTopApp,
                        app.mDisabledCompatChanges, pkgDataInfoMap, whitelistedAppDataInfoMap,
                        false, false,
                        new String[]{PROC_START_SEQ_IDENT + app.startSeq});
            } else {
                //分支3
                startResult = Process.start(entryPoint,
                        app.processName, uid, uid, gids, runtimeFlags, mountExternal,
                        app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
                        app.info.dataDir, invokeWith, app.info.packageName, zygotePolicyFlags,
                        isTopApp, app.mDisabledCompatChanges, pkgDataInfoMap,
                        whitelistedAppDataInfoMap, bindMountAppsData, bindMountAppStorageDirs,
                        new String[]{PROC_START_SEQ_IDENT + app.startSeq});
            }
            
                    
        }
                        
    }
    
    

    因为是从launcher启动App,所以发起进程是launcher所在进程,于是走到分支3,最终会调用 Process.start,Process.start内部调用了ZYGOTE_PROCESS.start

    frameworks/base/core/java/android/os/Process.java

    public static final ZygoteProcess ZYGOTE_PROCESS = new ZygoteProcess();
    public static ProcessStartResult start(@NonNull final String processClass,
                                               @Nullable final String niceName,
                                               int uid, int gid, @Nullable int[] gids,
                                               int runtimeFlags,
                                               int mountExternal,
                                               int targetSdkVersion,
                                               @Nullable String seInfo,
                                               @NonNull String abi,
                                               @Nullable String instructionSet,
                                               @Nullable String appDataDir,
                                               @Nullable String invokeWith,
                                               @Nullable String packageName,
                                               int zygotePolicyFlags,
                                               boolean isTopApp,
                                               @Nullable long[] disabledCompatChanges,
                                               @Nullable Map<String, Pair<String, Long>>
                                                       pkgDataInfoMap,
                                               @Nullable Map<String, Pair<String, Long>>
                                                       whitelistedDataInfoMap,
                                               boolean bindMountAppsData,
                                               boolean bindMountAppStorageDirs,
                                               @Nullable String[] zygoteArgs) {
            return ZYGOTE_PROCESS.start(processClass, niceName, uid, gid, gids,
                        runtimeFlags, mountExternal, targetSdkVersion, seInfo,
                        abi, instructionSet, appDataDir, invokeWith, packageName,
                        zygotePolicyFlags, isTopApp, disabledCompatChanges,
                        pkgDataInfoMap, whitelistedDataInfoMap, bindMountAppsData,
                        bindMountAppStorageDirs, zygoteArgs);
        }
    
    

    frameworks/base/core/java/android/os/ZygoteProcess.java

    
    public final Process.ProcessStartResult start(@NonNull final String processClass,
                                                      final String niceName,
                                                      int uid, int gid, @Nullable int[] gids,
                                                      int runtimeFlags, int mountExternal,
                                                      int targetSdkVersion,
                                                      @Nullable String seInfo,
                                                      @NonNull String abi,
                                                      @Nullable String instructionSet,
                                                      @Nullable String appDataDir,
                                                      @Nullable String invokeWith,
                                                      @Nullable String packageName,
                                                      int zygotePolicyFlags,
                                                      boolean isTopApp,
                                                      @Nullable long[] disabledCompatChanges,
                                                      @Nullable Map<String, Pair<String, Long>>
                                                              pkgDataInfoMap,
                                                      @Nullable Map<String, Pair<String, Long>>
                                                              whitelistedDataInfoMap,
                                                      boolean bindMountAppsData,
                                                      boolean bindMountAppStorageDirs,
                                                      @Nullable String[] zygoteArgs) {
        ...
        try {
            return startViaZygote(processClass, niceName, uid, gid, gids,
                    runtimeFlags, mountExternal, targetSdkVersion, seInfo,
                    abi, instructionSet, appDataDir, invokeWith, /*startChildZygote=*/ false,
                    packageName, zygotePolicyFlags, isTopApp, disabledCompatChanges,
                    pkgDataInfoMap, whitelistedDataInfoMap, bindMountAppsData,
                    bindMountAppStorageDirs, zygoteArgs);
        } catch (ZygoteStartFailedEx ex) {
        }
    }
        
        
    private Process.ProcessStartResult startViaZygote(...)throws ZygoteStartFailedEx {
        ArrayList<String> argsForZygote = new ArrayList<>();
        argsForZygote.add("--runtime-args");
        创建了一个ArrayList,往里面添加了很多进程启动参数 
        synchronized(mLock) {
                // The USAP pool can not be used if the application will not use the systems graphics
                // driver.  If that driver is requested use the Zygote application start path.
                return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi),
                                                  zygotePolicyFlags,
                                                  argsForZygote);
        }
    }
    //尝试通过兼容ABI向Zygote进程打通一个socket连接
    private ZygoteState openZygoteSocketIfNeeded(String abi) throws ZygoteStartFailedEx {
        try {
            attemptConnectionToPrimaryZygote();
    
            if (primaryZygoteState.matches(abi)) {
                return primaryZygoteState;
            }
            if (mZygoteSecondarySocketAddress != null) {
                // The primary zygote didn't match. Try the secondary.
                attemptConnectionToSecondaryZygote();
                if (secondaryZygoteState.matches(abi)) {
                    return secondaryZygoteState;
                }
            }
        } catch (IOException ioe) {
            throw new ZygoteStartFailedEx("Error connecting to zygote", ioe);
        }
        throw new ZygoteStartFailedEx("Unsupported zygote ABI: " + abi);
    }
    
    
    
    private Process.ProcessStartResult zygoteSendArgsAndGetResult(
            ZygoteState zygoteState, int zygotePolicyFlags, @NonNull ArrayList<String> args)
            throws ZygoteStartFailedEx {
    
        String msgStr = args.size() + "\n" + String.join("\n", args) + "\n";
    
        if (shouldAttemptUsapLaunch(zygotePolicyFlags, args)) {
            try {
                return attemptUsapSendArgsAndGetResult(zygoteState, msgStr);
            } catch (IOException ex) {
                // If there was an IOException using the USAP pool we will log the error and
                // attempt to start the process through the Zygote.
                Log.e(LOG_TAG, "IO Exception while communicating with USAP pool - "
                        + ex.getMessage());
            }
        }
    
        return attemptZygoteSendArgsAndGetResult(zygoteState, msgStr);
    }
        
    private Process.ProcessStartResult attemptZygoteSendArgsAndGetResult(
            ZygoteState zygoteState, String msgStr) throws ZygoteStartFailedEx {
        try {
            final BufferedWriter zygoteWriter = zygoteState.mZygoteOutputWriter;
            final DataInputStream zygoteInputStream = zygoteState.mZygoteInputStream;
            //向zygoteState写入启动参数
            zygoteWriter.write(msgStr);
            zygoteWriter.flush();
    
            Process.ProcessStartResult result = new Process.ProcessStartResult();
            //创建了进程ID
            result.pid = zygoteInputStream.readInt();
            result.usingWrapper = zygoteInputStream.readBoolean();
    
            if (result.pid < 0) {
                throw new ZygoteStartFailedEx("fork() failed");
            }
            return result;
        } catch (IOException ex) {
            zygoteState.close();
            Log.e(LOG_TAG, "IO Exception while communicating with Zygote - "
                    + ex.toString());
            throw new ZygoteStartFailedEx(ex);
        }
    }
    
    
    

    在Zygote进程启动后,main方法会创建一个ZygoteServer,并调用ZygoteServer对象的runSelectLoop方法,循环等待AMS的请求。

    attemptZygoteSendArgsAndGetResult方法将保存在ArrayList中的启动参数写入ZygoteState对象中,通过socket通道向Zygote进程发送启动参数列表,然后进入阻塞等待状态,直到远端ZygoteServer的socket服务端LocalServerSocket读取到启动参数,发送回来新创建的进程pid才返回。


    接下来我们分析下Zygote进程中是如何接收到这个socket消息,并看看接收到消息后干了啥

    ServerSocket读取消息

    com/android/internal/os/ZygoteInit.java

     public static void main(String argv[]) {
            ZygoteServer zygoteServer = null;
            ...
            zygoteServer = new ZygoteServer(isPrimaryZygote);
            Runnable caller;
            caller = zygoteServer.runSelectLoop(abiList);
            if (caller != null) {
                caller.run();
            }
     }
    
    

    可以看到,Zygote的main方法中,创建了ZygoteServer对象,ZygoteServer的构造方法中创建了LocalServerSocket,会在runSelectLoop方法中不断读取Socket消息

    frameworks/base/core/java/com/android/internal/os/ZygoteServer.java

    
    /**
     * Runs the zygote process's select loop. Accepts new connections as
     * they happen, and reads commands from connections one spawn-request's
     * worth at a time.
     */
    Runnable runSelectLoop(String abiList) {
        ArrayList<FileDescriptor> socketFDs = new ArrayList<>();
        ArrayList<ZygoteConnection> peers = new ArrayList<>();
        
        socketFDs.add(mZygoteSocket.getFileDescriptor());
        peers.add(null);
    
        mUsapPoolRefillTriggerTimestamp = INVALID_TIMESTAMP;
        //开始无线循环读取socket链接
        while (true) {
            fetchUsapPoolPolicyPropsWithMinInterval();
            mUsapPoolRefillAction = UsapPoolRefillAction.NONE;
    
            int[] usapPipeFDs = null;
            StructPollfd[] pollFDs;
    
            if (mUsapPoolEnabled) {
                usapPipeFDs = Zygote.getUsapPipeFDs();
                pollFDs = new StructPollfd[socketFDs.size() + 1 + usapPipeFDs.length];
            } else {
                pollFDs = new StructPollfd[socketFDs.size()];
            }
    
            int pollIndex = 0;
            for (FileDescriptor socketFD : socketFDs) {
                pollFDs[pollIndex] = new StructPollfd();
                pollFDs[pollIndex].fd = socketFD;
                pollFDs[pollIndex].events = (short) POLLIN;
                ++pollIndex;
            }
    
            final int usapPoolEventFDIndex = pollIndex;
    
            ....
    
            int pollTimeoutMs;
    
            ....
    
            int pollReturnValue;
            ..
            if (pollReturnValue == 0) {
                mUsapPoolRefillTriggerTimestamp = INVALID_TIMESTAMP;
                mUsapPoolRefillAction = UsapPoolRefillAction.DELAYED;
    
            } else {
                boolean usapPoolFDRead = false;
    
                while (--pollIndex >= 0) {
                    if ((pollFDs[pollIndex].revents & POLLIN) == 0) {
                        continue;
                    }
    
                    if (pollIndex == 0) {
                        // Zygote server socket
                        //建立了socket链接
                        ZygoteConnection newPeer = acceptCommandPeer(abiList);
                        peers.add(newPeer);
                        socketFDs.add(newPeer.getFileDescriptor());
    
                    } else if (pollIndex < usapPoolEventFDIndex) {
                        // Session socket accepted from the Zygote server socket
                        //从Zygote server socket接收到了一个socket消息
                        try {
                            ZygoteConnection connection = peers.get(pollIndex);
                            //执行命令
                            final Runnable command = connection.processOneCommand(this);
    
                            // TODO (chriswailes): Is this extra check necessary?
                            if (mIsForkChild) {
                                return command;
                            } else {
                               ...
                               //执行结束后关闭连接
                               if (connection.isClosedByPeer()) {
                                    connection.closeSocket();
                                    peers.remove(pollIndex);
                                    socketFDs.remove(pollIndex);
                                }
                            }
                        } catch (Exception e) {
                            ...
                        } finally {
                            mIsForkChild = false;
                        }
    
                    } else {
                        ...
                    }
                }
    
                ...
            }
    
            if (mUsapPoolRefillAction != UsapPoolRefillAction.NONE) {
                ....
            }
        }
    }
    
    

    ZygoteServer接收到消息后,ZygoteConnection调用processOneCommand方法读取并解析到的启动参数

    主要做了两件事:

    1. 调用Native方法fork了一个进程并返回PID
    2. 解析参数,执行ActivityThread的Main方法

    8.开始fork进程

    D:\develop\Sdk\sources\android-30\com\android\internal\os\ZygoteConnection.java

    Runnable processOneCommand(ZygoteServer zygoteServer) {
            String[] args;
            
            try {
                //读取启动参数
                args = Zygote.readArgumentList(mSocketReader);
            } catch (IOException ex) {
                throw new IllegalStateException("IOException on command socket", ex);
            }
    
    
            int pid;
            FileDescriptor childPipeFd = null;
            FileDescriptor serverPipeFd = null;
            
            //这个类对启动参数进行了解析
            //几个关键的参数
            //parsedArgs.mTargetSdkVersion,
            //parsedArgs.mDisabledCompatChanges,
            //parsedArgs.mRemainingArgs
            ZygoteArguments parsedArgs = new ZygoteArguments(args);
            
            ...
            
            Zygote.applyUidSecurityPolicy(parsedArgs, peer);
            Zygote.applyInvokeWithSecurityPolicy(parsedArgs, peer);
    
            Zygote.applyDebuggerSystemProperty(parsedArgs);
            Zygote.applyInvokeWithSystemProperty(parsedArgs);
    
            int[][] rlimits = null;
            
            if (parsedArgs.mInvokeWith != null) {
                try {
                    FileDescriptor[] pipeFds = Os.pipe2(O_CLOEXEC);
                    childPipeFd = pipeFds[1];
                    serverPipeFd = pipeFds[0];
                    Os.fcntlInt(childPipeFd, F_SETFD, 0);
                    fdsToIgnore = new int[]{childPipeFd.getInt$(), serverPipeFd.getInt$()};
                } catch (ErrnoException errnoEx) {
                    throw new IllegalStateException("Unable to set up pipe for invoke-with", errnoEx);
                }
            }
    
            int [] fdsToClose = { -1, -1 };
    
            FileDescriptor fd = mSocket.getFileDescriptor();
    
            if (fd != null) {
                fdsToClose[0] = fd.getInt$();
            }
    
            fd = zygoteServer.getZygoteSocketFileDescriptor();
    
            if (fd != null) {
                fdsToClose[1] = fd.getInt$();
            }
            
            //Zygote进程为启动的App fork了一个进程,并返回进程pid
            pid = Zygote.forkAndSpecialize(parsedArgs.mUid, parsedArgs.mGid, parsedArgs.mGids,
                    parsedArgs.mRuntimeFlags, rlimits, parsedArgs.mMountExternal, parsedArgs.mSeInfo,
                    parsedArgs.mNiceName, fdsToClose, fdsToIgnore, parsedArgs.mStartChildZygote,
                    parsedArgs.mInstructionSet, parsedArgs.mAppDataDir, parsedArgs.mIsTopApp,
                    parsedArgs.mPkgDataInfoList, parsedArgs.mWhitelistedDataInfoList,
                    parsedArgs.mBindMountAppDataDirs, parsedArgs.mBindMountAppStorageDirs);
    
            try {
                if (pid == 0) {
                    // in child
                    zygoteServer.setForkChild();
    
                    zygoteServer.closeServerSocket();
                    IoUtils.closeQuietly(serverPipeFd);
                    serverPipeFd = null;
    
                    return handleChildProc(parsedArgs, childPipeFd, parsedArgs.mStartChildZygote);
                } else {
                    // In the parent. A pid < 0 indicates a failure and will be handled in
                    // handleParentProc.
                    IoUtils.closeQuietly(childPipeFd);
                    childPipeFd = null;
                    handleParentProc(pid, serverPipeFd);
                    return null;
                }
            } finally {
                IoUtils.closeQuietly(childPipeFd);
                IoUtils.closeQuietly(serverPipeFd);
            }
        }
        
      static int forkAndSpecialize(int uid, int gid, int[] gids, int runtimeFlags,
                int[][] rlimits, int mountExternal, String seInfo, String niceName, int[] fdsToClose,
                int[] fdsToIgnore, boolean startChildZygote, String instructionSet, String appDataDir,
                boolean isTopApp, String[] pkgDataInfoList, String[] whitelistedDataInfoList,
                boolean bindMountAppDataDirs, boolean bindMountAppStorageDirs) {
            ZygoteHooks.preFork();
            //调用Native方法fork进程
            int pid = nativeForkAndSpecialize(
                    uid, gid, gids, runtimeFlags, rlimits, mountExternal, seInfo, niceName, fdsToClose,
                    fdsToIgnore, startChildZygote, instructionSet, appDataDir, isTopApp,
                    pkgDataInfoList, whitelistedDataInfoList, bindMountAppDataDirs,
                    bindMountAppStorageDirs);
            if (pid == 0) {
                // Note that this event ends at the end of handleChildProc,
                Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "PostFork");
    
                // If no GIDs were specified, don't make any permissions changes based on groups.
                if (gids != null && gids.length > 0) {
                    NetworkUtils.setAllowNetworkingForProcess(containsInetGid(gids));
                }
            }
    
            // Set the Java Language thread priority to the default value for new apps.
            Thread.currentThread().setPriority(Thread.NORM_PRIORITY);
    
            ZygoteHooks.postForkCommon();
            return pid;
        }  
        
        private Runnable handleChildProc(ZygoteArguments parsedArgs,
                FileDescriptor pipeFd, boolean isZygote) {
            /*
             * By the time we get here, the native code has closed the two actual Zygote
             * socket connections, and substituted /dev/null in their place.  The LocalSocket
             * objects still need to be closed properly.
             */
            //关闭socket链接
            closeSocket();
    
            Zygote.setAppProcessName(parsedArgs, TAG);
    
            // End of the postFork event.
            Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
            if (parsedArgs.mInvokeWith != null) {
                WrapperInit.execApplication(parsedArgs.mInvokeWith,
                        parsedArgs.mNiceName, parsedArgs.mTargetSdkVersion,
                        VMRuntime.getCurrentInstructionSet(),
                        pipeFd, parsedArgs.mRemainingArgs);
    
                // Should not get here.
                throw new IllegalStateException("WrapperInit.execApplication unexpectedly returned");
            } else {
                if (!isZygote) {
                    //进入到这里(SystemServer也是通过该方法执行SystemServer的main方法)
                    return ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion,
                            parsedArgs.mDisabledCompatChanges,
                            parsedArgs.mRemainingArgs, null /* classLoader */);
                } else {
                    return ZygoteInit.childZygoteInit(parsedArgs.mTargetSdkVersion,
                            parsedArgs.mRemainingArgs, null /* classLoader */);
                }
            }
        }
        
    

    frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

    各种初始化

    public static final Runnable zygoteInit(int targetSdkVersion, long[] disabledCompatChanges,
                String[] argv, ClassLoader classLoader) {
            Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ZygoteInit");
            RuntimeInit.redirectLogStreams();
    
            RuntimeInit.commonInit();
            ZygoteInit.nativeZygoteInit();//创建binder连接池,方便后续用心
            return RuntimeInit.applicationInit(targetSdkVersion, disabledCompatChanges, argv,
                    classLoader);
        }
    

    执行ActivityThread的main方法并执行

    frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
    找到ActivityThread的main方法并执行

    protected static Runnable applicationInit(int targetSdkVersion, long[] disabledCompatChanges,
                String[] argv, ClassLoader classLoader) {
        nativeSetExitWithoutCleanup(true);
    
        VMRuntime.getRuntime().setTargetSdkVersion(targetSdkVersion);
        VMRuntime.getRuntime().setDisabledCompatChanges(disabledCompatChanges);
         //这个类对传入的启动参数进行了再一次解析
        final Arguments args = new Arguments(argv);
    
        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
        //此处args.startClass为android.app.ActivityThread
        return findStaticMain(args.startClass, args.startArgs, classLoader);
    }
    
    protected static Runnable findStaticMain(String className, String[] argv,
            ClassLoader classLoader) {
        Class<?> cl;
    
        try {
            cl = Class.forName(className, true, classLoader);
        } catch (ClassNotFoundException ex) {
            throw new RuntimeException(
                    "Missing class when invoking static main " + className,
                    ex);
        }
    
        Method m;
        try {
            //通过classLoader获取main方法
            m = cl.getMethod("main", new Class[] { String[].class });
        } catch (NoSuchMethodException ex) {
            throw new RuntimeException(
                    "Missing static main on " + className, ex);
        } catch (SecurityException ex) {
            throw new RuntimeException(
                    "Problem getting static main on " + className, ex);
        }
    
        int modifiers = m.getModifiers();
        if (! (Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers))) {
            throw new RuntimeException(
                    "Main method is not public and static on " + className);
        }
    
        /*
         * This throw gets caught in ZygoteInit.main(), which responds
         * by invoking the exception's run() method. This arrangement
         * clears up all the stack frames that were required in setting
         * up the process.
         */
        return new MethodAndArgsCaller(m, argv);
    }
        
    static class MethodAndArgsCaller implements Runnable {
        /** method to call */
        private final Method mMethod;
    
        /** argument array */
        private final String[] mArgs;
    
        public MethodAndArgsCaller(Method method, String[] args) {
            mMethod = method;
            mArgs = args;
        }
    
        public void run() {
            try {
                mMethod.invoke(null, new Object[] { mArgs });
            } catch (IllegalAccessException ex) {
                throw new RuntimeException(ex);
            } catch (InvocationTargetException ex) {
                Throwable cause = ex.getCause();
                if (cause instanceof RuntimeException) {
                    throw (RuntimeException) cause;
                } else if (cause instanceof Error) {
                    throw (Error) cause;
                }
                throw new RuntimeException(ex);
            }
        }
    }    
    

    注意这里返回的new MethodAndArgsCaller(m, argv)是一个runnable,经过层层返回,最终在ZygoteInit.main()中执行run

    public static void main(String argv[]) {
        zygoteServer = new ZygoteServer(isPrimaryZygote);
        caller = zygoteServer.runSelectLoop(abiList);
        if (caller != null) {
            caller.run();
        }
    }
    

    至此,APP进程创建完毕,ActivityThread的main方法开始执行

    相关文章

      网友评论

        本文标题:APP启动流程(二)ActivityTaskManagerSer

        本文链接:https://www.haomeiwen.com/subject/pnxfwltx.html