App启动源码分析(Android10)

Android10 App启动流程


一、 概述

本文基于Android10源码进行分析,分析之前先上一个概览图,说明APP启动的一个流程
在这里插入图片描述

  1. Launcher进程在Instrumentation中通过ActivityTaskManager.getService().startActivity进入到AMS所在的ServiceManager进程
  2. AMS中依次经过ActivityStartController、ActivityStart、RootActivityContainer、ActivityStack、ActivityStackSupervisor的调用最终走到realStartActivityLocked,在realStartActivityLocker中会判断当前APP对应的进程是否存在,不存在则经过一系列调用走到ZygoteProcess.attemptZygoteSendArgsAndGetResult()发送消息给Zygote进程
  3. Zygote进程收到消息,开始执行启动APP子进程,启动进程结束以后返回结果给AMS进程,同时在RuntimeInit$MethodAndArgsCaller中通过反射执行子进程ActivityThread的main函数
  4. App进程开始执行ActivityThread的main函数,进程开始运行,然后经过一系列的调用又回到AMS所在的ServiceManager进程,然后在AMS中会走到步骤2中的realStartActivityLocked函数中,在该函数中封装了ClientTransaction对象,通过mService.getLifecycleManager().scheduleTransaction(clientTransaction)回调到ActivityThread中,然后开始执行ClientTransaction中的LauncherActivityItem对象,最终调用到ActivityThread的handleLauncherActiivty中,通过Instrumentation执行Activity的onCreate方法

APP启动(冷启动)涉及进程以及相关java类,具体函数调用关系和流程在下面有详细贴出来

系统桌面Launcher App进程
LauncherActivity、Activity、Instrumentation
ServiceManager进程
ActivityTaskManagerService、ActivityStartController、ActivityStarter、RootActivityContainer、ActivityStack、ActivityStackSupervisor、ProcessList、Process
Zygore进程
ZygoteInit、ZygoteConnection、ZygoteInit、RuntimeInit、Zygote
App进程
ActivityThread、ActivityThread.ApplicationThread、ActivityThread.H、Instrumentation、ActivityTaskManagerService、RootActivityContainer、ActivityStackSupervisor、 ClientTransactionHandler、TransactionExecutor 、LaunchActivityItem

二、Launcher进程

  1. LauncherActivity
   /**
   * 点击桌面icon,调用Activity的startActivity(Intent intent)
   */
  protected void onListItemClick(ListView l, View v, int position, long id) {
      Intent intent = intentForPosition(position);
      startActivity(intent);
  }
  1. Activity
    public void startActivity(Intent intent) {
        this.startActivity(intent, null);
    }
    /**
     * 
     * @param intent
     * @param options null
     */
    public void startActivity(Intent intent, @Nullable Bundle options) {
        if (options != null) {
            startActivityForResult(intent, -1, options);
        } else {
            startActivityForResult(intent, -1);
        }
    }
    /**
     * @param intent
     * @param requestCode -1
     */
    public void startActivityForResult(@RequiresPermission Intent intent, int requestCode) {
        startActivityForResult(intent, requestCode, null);
    }
    /**
     * LauncherActivity不存在父activity,走if代码块,然后调用Instrumentation.execStartActivity()
     * 继续执行activity的启动操作
     *
     * @param intent
     * @param requestCode -1
     * @param options     null
     */
    public void startActivityForResult(@RequiresPermission Intent intent, int requestCode, @Nullable Bundle options) {
        if (mParent == null) {
            options = transferSpringboardActivityOptions(options);
            Instrumentation.ActivityResult ar = mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this, intent,
                    requestCode, options);
            if (ar != null) {
                //发送结果,即onActivityResult会被调用
                mMainThread.sendActivityResult(
                        mToken, mEmbeddedID, requestCode, ar.getResultCode(), ar.getResultData());
            }
            if (requestCode >= 0) {
                mStartedActivity = true;
            }
            cancelInputsAndStartExitTransition(options);
        }
        ................
    }
  1. Instrumentation
    /**
     * @param who           LauncherActivity
     * @param contextThread LauncherActivity所在进程的ActivityThread$ApplicationThread的实例,
     *                      AMS与Launcher进程通信时会用到
     * @param token         LauncherActivity对应的token,Token是ActivityRecord中的一个内部类,
     *                      继承自IApplicationToken.Stub,在AMS中通知Launcher进入pause状态时会用到
     * @param target        token对应的target,即LauncherActivity
     * @param intent        启动目标activity的intent
     * @param requestCode   -1
     * @param options       null
     * @return
     */
    public ActivityResult execStartActivity( Context who, IBinder contextThread, 
    		IBinder token, Activity target, Intent intent, int requestCode, Bundle options) {
        IApplicationThread whoThread = (IApplicationThread) contextThread;
        Uri referrer = target != null ? target.onProvideReferrer() : null;
        if (referrer != null) {//referrer为null
            intent.putExtra(Intent.EXTRA_REFERRER, referrer);
        }
        if (mActivityMonitors != null) {
            synchronized (mSync) {
                //先查找一遍看是否存在这个activity
                final int N = mActivityMonitors.size();
                for (int i = 0; i < N; i++) {
                    final ActivityMonitor am = mActivityMonitors.get(i);
                    ActivityResult result = null;
                    if (am.ignoreMatchingSpecificIntents()) {
                        result = am.onStartActivity(intent);
                    }
                  ...........
                }
            }
        }
        try {
            intent.migrateExtraStreamToClipData();
            intent.prepareToLeaveProcess(who);
            //通过IPC机制调用到AMS的startActivity方法,开发进入到AMS进程
            //ActivityTaskManager.getService()返回的是AMS的Binder通信代理
            int result = ActivityTaskManager.getService()
                    .startActivity(whoThread, who.getBasePackageName(), intent,
                            intent.resolveTypeIfNeeded(who.getContentResolver()),
                            token, target != null ? target.mEmbeddedID : null,
                            requestCode, 0, null, options);
            checkStartActivityResult(result, intent);
        } catch (RemoteException e) {
            throw new RuntimeException("Failure from system", e);
        }
        return null;
    }

三、ServiceManager进程

  1. ActivityTaskManagerService(AMS)
    /**
     * @param caller         LauncherActivity所在进程的ActivityThread$ApplicationThread的实例,
     *                       AMS与Launcher进程通信时会用到
     * @param callingPackage LauncherActivity的包名
     * @param intent         启动目标activity的意图
     * @param resolvedType   MIME type of this intent
     * @param resultTo       LauncherActivity的mToken
     * @param resultWho      LauncherActivity.mEmbeddedID
     * @param requestCode    -1
     * @param startFlags     0
     * @param profilerInfo   null
     * @param bOptions       null
     * @return
     */
    public final int startActivity(IApplicationThread caller, String callingPackage,
                                   Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
                                   int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
        return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
                resultWho, requestCode, startFlags, profilerInfo, bOptions,
                UserHandle.getCallingUserId());
    }
    /**
     * 这里新增了userId参数
     *
     * @param userId Launcher进程uid
     * @return
     */
    public int startActivityAsUser(IApplicationThread caller, String callingPackage,
                                   Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
                                   int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) {
        return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
                resultWho, requestCode, startFlags, profilerInfo, bOptions, userId,
                true /*validateIncomingUser*/);
    }
    /**
     * 新增了 validateIncomingUser
     *
     * @param validateIncomingUser true
     * @return
     */
    int startActivityAsUser(IApplicationThread caller, String callingPackage,
                            Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
                            int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId,
                            boolean validateIncomingUser) {
        enforceNotIsolatedCaller("startActivityAsUser");

        userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,
                Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");

        // getActivityStartController().obtainStarter返回ActivityStarter对象
        return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
                .setCaller(caller)
                .setCallingPackage(callingPackage)
                .setResolvedType(resolvedType)
                .setResultTo(resultTo)
                .setResultWho(resultWho)
                .setRequestCode(requestCode)
                .setStartFlags(startFlags)
                .setProfilerInfo(profilerInfo)
                .setActivityOptions(bOptions)
                .setMayWait(userId)//这里会决定这里会决定ActivityStarter.execute()中的if(MayWait)判断
                .execute();//ActivityStarter的execute()

    }
  1. ActivityStartController
 ActivityStarter obtainStarter(Intent intent, String reason) {
 		//mFactory为ActivityStarter内部类DefaultFactory
        return mFactory.obtain().setIntent(intent).setReason(reason);
    }
  1. ActivityStarter
    int execute() {//line num 509
        // for transactional diffs and preprocessing.
        if (mRequest.mayWait) {//这里的mayWait是步骤4中的setUserId()中赋值的
            return startActivityMayWait(......);
        }
    }
    private int startActivityMayWait(......) {//line num 1134
        int res = startActivity(......);
        return res;
    }
    //startActivity 01 创建了ActivityInfo
    private int startActivity(......) {//line num 566
        mLastStartActivityResult = startActivity(......);
        return getExternalResult(mLastStartActivityResult);
    }
    // startActivity02 创建了ActivityRecord
    private int startActivity(.....) {//line num 611
        final int res = startActivity(......);
        return res;
    }
    //startActivity03
    private int startActivity(......) {//line num 1386
        try {
            result = startActivityUnchecked(......);
        } 
        return result;
    }
    private int startActivityUnchecked(......) {//line num 1464
       if (mDoResume) {
           mRootActivityContainer.resumeFocusedStacksTopActivities();
       }
    }
  1. RootActivityContainer
    boolean resumeFocusedStacksTopActivities(ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
        if (targetStack != null && (targetStack.isTopStackOnDisplay() || getTopDisplayFocusedStack() == targetStack)) {
            result = targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
        }
        return result;
    }
  1. ActivityStack
    boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
        boolean result = false;
        try {
            result = resumeTopActivityInnerLocked(prev, options);
        } 
        return result;
    }
    private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {
        if (mResumedActivity != null) {
            pausing |= startPausingLocked(userLeaving, false, next, false);//通知launcher进入pause状态
        }
        mStackSupervisor.startSpecificActivityLocked(next, true, true);//继续执行启动APP
    }
  1. ActivityStackSupervisor
    void startSpecificActivityLocked(ActivityRecord r, boolean andResume, boolean checkConfig) {
        final WindowProcessController wpc = mService.getProcessController(r.processName, r.info.applicationInfo.uid);
        if (wpc != null && wpc.hasThread()) { //目标activity所在进程已经启动直接启动activity
            try {
            	//这里需重点留意,等zygote创建完APP进程以后,Zygote通过反射执行ActivityThread的main函数,
            	//然后通过一系列调用,会继续走到该函数执行activity的启动
                realStartActivityLocked(r, wpc, andResume, checkConfig);
                return;
            }
        }
        try {
            // APP冷启动,所对应的进程不存在,发送消息给zygote进程,通知zygote fork APP子进程
            final Message msg = PooledLambda.obtainMessage(
                    ActivityManagerInternal::startProcess, mService.mAmInternal, r.processName,
                    r.info.applicationInfo, knownToBeDead, "activity", r.intent.getComponent());
            mService.mH.sendMessage(msg);
        }
    }
    
  由于zygote进程fork完APP子进程以后经过一系列调用,最终还是会走到这里,所以继续跟踪分析realStartActivityLocked函数,
  关于zygote fork APP进程以及APP进程启动以后如何调用到realStartActivityLocked放在第四节继续跟踪
    boolean realStartActivityLocked(ActivityRecord r, WindowProcessController proc, boolean andResume, boolean checkConfig) throws RemoteException {
        // Create activity launch transaction.
        final ClientTransaction clientTransaction = ClientTransaction.obtain(proc.getThread(), r.appToken);
        final DisplayContent dc = r.getDisplay().mDisplayContent;
        clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent), System.identityHashCode(r), r.info,
                mergedConfiguration.getGlobalConfiguration(), mergedConfiguration.getOverrideConfiguration(), r.compat,
                r.launchedFromPackage, task.voiceInteractor, proc.getReportedProcState(), r.icicle, r.persistentState, results,
                newIntents, dc.isNextTransitionForward(), proc.createProfilerInfoIfNeeded(), r.assistToken));
        // Set desired final state.
        final ActivityLifecycleItem lifecycleItem;
        if (andResume) {
            lifecycleItem = ResumeActivityItem.obtain(dc.isNextTransitionForward());
        } else {
            lifecycleItem = PauseActivityItem.obtain();
        }
        clientTransaction.setLifecycleStateRequest(lifecycleItem);
        // Schedule transaction.
        mService.getLifecycleManager().scheduleTransaction(clientTransaction);
    }
   // mService.getLifecycleManager()返回ClientLifecycleManager对象,ClientLifecycleManager.scheduleTransaction()函数会执行
   //参数的schedule()函数,也就是说这里执行了clientTransaction.schedule()函数,那我们继续追踪ClientTransaction类
  1. ClientTransaction
 public void schedule() throws RemoteException {
 		//mClient对象即ActivityThread$ApplicationThread的Binder通信代理,
 		//这里即通过IPC回调到了App进程执行ActivityThread$ApplicationThread.scheduleTransaction()函数
        mClient.scheduleTransaction(this);
    }
  1. ActivityThread$ApplicationThread
public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
     ActivityThread.this.scheduleTransaction(transaction);
 }
 //这里调用了ActivityThread父类ClientTransactionHandler.scheduleTransaction(),继续追踪ClientTransactionHandler
  1. ClientTransactionHandler
void scheduleTransaction(ClientTransaction transaction) {
    transaction.preExecute(this);
    sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
}
//这里会调用ActivityThread$H.handleMessage()
  1. ActivityThread$H
 public void handleMessage(Message msg) {
      switch (msg.what) {
          case EXECUTE_TRANSACTION:
              final ClientTransaction transaction = (ClientTransaction) msg.obj;
              mTransactionExecutor.execute(transaction);
              break;
      } 
  }
  //这里调用了TransactionExecutor的execute函数,继续分析TransactionExecutor类
  1. TransactionExecutor
public void execute(ClientTransaction transaction) {
    executeCallbacks(transaction);
    executeLifecycleState(transaction);
}
public void executeCallbacks(ClientTransaction transaction) {
     final List<ClientTransactionItem> callbacks = transaction.getCallbacks();
     final int size = callbacks.size();
     for (int i = 0; i < size; ++i) {
         final ClientTransactionItem item = callbacks.get(i);
         //这里的item即步骤9中realStartActivityLocked函数中添加的LaunchActivityItem对象,这里会调用activity的onCreate
         item.execute(mTransactionHandler, token, mPendingActions);
         item.postExecute(mTransactionHandler, token, mPendingActions);
         if (postExecutionState != UNDEFINED && r != null) {
             //这里会调用activity的onStart的函数
             cycleToPath(r, postExecutionState, shouldExcludeLastTransition, transaction);
         }
     }
 }
private void executeLifecycleState(ClientTransaction transaction) {
    final ActivityLifecycleItem lifecycleItem = transaction.getLifecycleStateRequest();
    //这里的lifecycleItem即步骤9中realStartActivityLocked函数中添加的ResumeActivityItem对象,这里会调用activity的onResume
    lifecycleItem.execute(mTransactionHandler, token, mPendingActions);
    lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions);
}
  1. LaunchActivityItem
public void execute(ClientTransactionHandler client, IBinder token,  PendingTransactionActions pendingActions) {
        ActivityClientRecord r = new ActivityClientRecord(....);
        //这里的client即ActivityThread
        client.handleLaunchActivity(r, pendingActions, null /* customIntent */);
    }
  1. ActivityThread
   public Activity handleLaunchActivity(ActivityClientRecord r, PendingTransactionActions pendingActions, Intent customIntent) {
        final Activity a = performLaunchActivity(r, customIntent);
        return a;
    }
 private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
        Activity activity = null;
        java.lang.ClassLoader cl = appContext.getClassLoader();
        //新建Activity对象
        activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);
        ....
        if (activity != null) {
           activity.attach(.....);
           .....
           int theme = r.activityInfo.getThemeResource();
           activity.setTheme(theme);
           .....
            if (r.isPersistable()) {
               mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
             } else {
               mInstrumentation.callActivityOnCreate(activity, r.state);
             }
           ......
        return activity;
    }
  1. Instrumentation
public Activity newActivity(ClassLoader cl, String className,  Intent intent) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        String pkg = intent != null && intent.getComponent() != null? intent.getComponent().getPackageName() : null;
        return getFactory(pkg).instantiateActivity(cl, className, intent);
    }
public void callActivityOnCreate(Activity activity, Bundle icicle) {
        prePerformCreate(activity);
        activity.performCreate(icicle);
        postPerformCreate(activity);
    }
  1. Activity
final void performCreate(Bundle icicle, PersistableBundle persistentState) {
        dispatchActivityPreCreated(icicle);
        mCanEnterPictureInPicture = true;
        restoreHasCurrentPermissionRequest(icicle);
        if (persistentState != null) {
            onCreate(icicle, persistentState);
        } else {
            onCreate(icicle);
        }
    }
//至此,启动activity结束,onStart和onResume方法同样是通过Instrumentation调用,调用方式与create类似

四、AMS向Zygote进程发送fork APP子进程消息

这里从第三节的步骤9中ActivityStackSupervisor.startSpecificActivityLocked()开始

  1. ActivityStackSupervisor
 void startSpecificActivityLocked(ActivityRecord r, boolean andResume, boolean checkConfig) {
        final WindowProcessController wpc = mService.getProcessController(r.processName, r.info.applicationInfo.uid);
        if (wpc != null && wpc.hasThread()) { //目标activity所在进程已经启动直接启动activity
            try {
                realStartActivityLocked(r, wpc, andResume, checkConfig);
                return;
            }
        }
        try {
            // Post message to start process to avoid possible deadlock of calling into AMS with the
            // APP初期启动,所对应的进程不存在,发送消息给zygote进程,通知zygote创建APP运行进程
            final Message msg = PooledLambda.obtainMessage(
                    ActivityManagerInternal::startProcess, mService.mAmInternal, r.processName,
                    r.info.applicationInfo, knownToBeDead, "activity", r.intent.getComponent());
            mService.mH.sendMessage(msg);
        } 
  }
//ActivityManagerInternal::startProcess是个抽象方法,具体实现类在ActivityManagerService$LocalService.startProcess()
  1. ActivityManagerService$LocalService
   @Override
public void startProcess(String processName, ApplicationInfo info, boolean knownToBeDead, String hostingType, ComponentName hostingName) {
        synchronized (ActivityManagerService.this) {
            startProcessLocked(processName, info, knownToBeDead, 0 /* intentFlags */,
                    new HostingRecord(hostingType, hostingName),
                    false /* allowWhileBooting */, false /* isolated */,
                    true /* keepIfLarge */);
        }
    }
final ProcessRecord startProcessLocked(......) {
        return mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags,
                hostingRecord, allowWhileBooting, isolated, 0 /* isolatedUid */, keepIfLarge,
                null /* ABI override */, null /* entryPoint */, null /* entryPointArgs */,
                null /* crashHandler */);
    }

  1. ProcessList
//startProcessLocked 01
boolean startProcessLocked(ProcessRecord app, HostingRecord hostingRecord, boolean disableHiddenApiChecks, boolean mountExtStorageFull, String abiOverride) {
        return startProcessLocked(hostingRecord, entryPoint, app, uid, gids, runtimeFlags, mountExternal, seInfo, requiredAbi, instructionSet, invokeWith, startTime);
    }
//startProcessLocked02
boolean startProcessLocked(HostingRecord hostingRecord,
                               String entryPoint,
                               ProcessRecord app, int uid, int[] gids, int runtimeFlags, int mountExternal,
                               String seInfo, String requiredAbi, String instructionSet, String invokeWith,
                               long startTime) {
        final Process.ProcessStartResult startResult = startProcess(hostingRecord,
                entryPoint, app,
                uid, gids, runtimeFlags, mountExternal, seInfo, requiredAbi, instructionSet,
                invokeWith, startTime);
    }
private Process.ProcessStartResult startProcess(HostingRecord hostingRecord, String entryPoint,
        ProcessRecord app, int uid, int[] gids, int runtimeFlags, int mountExternal,
        String seInfo, String requiredAbi, String instructionSet, String invokeWith,
        long startTime) {
            startResult = Process.start(entryPoint,
                    app.processName, uid, uid, gids, runtimeFlags, mountExternal,
                    app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
                    app.info.dataDir, invokeWith, app.info.packageName,
                    new String[] {PROC_START_SEQ_IDENT + app.startSeq});
    }
  1. Process
 public static ProcessStartResult start(......) {
        return ZYGOTE_PROCESS.start(processClass, niceName, uid, gid, gids,
                    runtimeFlags, mountExternal, targetSdkVersion, seInfo,
                    abi, instructionSet, appDataDir, invokeWith, packageName,
                    /*useUsapPool=*/ true, zygoteArgs);
    }
  1. ZygoteProcess
public final Process.ProcessStartResult start(.....) {
            return startViaZygote(processClass, niceName, uid, gid, gids,
                    runtimeFlags, mountExternal, targetSdkVersion, seInfo,
                    abi, instructionSet, appDataDir, invokeWith, /*startChildZygote=*/ false,
                    packageName, useUsapPool, zygoteArgs);
    }
 private Process.ProcessStartResult startViaZygote(......) throws ZygoteStartFailedEx {
    return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi), useUsapPool, argsForZygote);
 }
private Process.ProcessStartResult zygoteSendArgsAndGetResult(ZygoteState zygoteState, boolean useUsapPool, @NonNull ArrayList<String> args) throws ZygoteStartFailedEx {
          return attemptUsapSendArgsAndGetResult(zygoteState, msgStr);
          //这里会通过socket向zygote进程发送启动APP子进程的消息
    }

五、Zygote进程

  1. ZygoteInit
 public static void main(String argv[]) {
     caller = zygoteServer.runSelectLoop(abiList);
      if (caller != null) {
          caller.run();
      }
}
//使zygote进入循环模式,接收c端数据并处理
  1. ZygoteServer
    
Runnable runSelectLoop(String abiList) {
	ZygoteConnection connection = peers.get(pollIndex);
    final Runnable command = connection.processOneCommand(this);
}
//接收C端数据
  1. ZygoteConnection
Runnable processOneCommand(ZygoteServer zygoteServer) {
	//创建指定APP子进程
	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.mTargetSdkVersion);
    try {
            if (pid == 0) {
                return handleChildProc(parsedArgs, descriptors, childPipeFd, parsedArgs.mStartChildZygote);
            } else {
                // In the parent. A pid < 0 indicates a failure and will be handled in
                handleParentProc(pid, descriptors, serverPipeFd);
                return null;
            }
   } 
}
private Runnable handleChildProc(ZygoteArguments parsedArgs, FileDescriptor[] descriptors, FileDescriptor pipeFd, boolean isZygote) {
      if (!isZygote) {
          return ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion, parsedArgs.mRemainingArgs, null /* classLoader */);
      } else {
          return ZygoteInit.childZygoteInit(parsedArgs.mTargetSdkVersion,  parsedArgs.mRemainingArgs, null /* classLoader */);
     }
}
  1. ZygoteInit
public static final Runnable zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader) {
        RuntimeInit.commonInit();
        ZygoteInit.nativeZygoteInit();
        return RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);
    }
  1. RuntimeInit
protected static Runnable applicationInit(int targetSdkVersion, String[] argv,ClassLoader classLoader) {
        // Remaining arguments are passed to the start class's static main
        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) {}

        Method m;
        try {
            m = cl.getMethod("main", new Class[] { String[].class });
        } 
     
        return new MethodAndArgsCaller(m, argv);
    }
  1. RuntimeInit$MethodAndArgsCaller
public void run() {
     try {
           mMethod.invoke(null, new Object[] { mArgs });
     } 
 }
//这里通过反射调用ActivityThread的main()函数
  1. ActivityThread
public static void main(String[] args) {
	ActivityThread thread = new ActivityThread();
    thread.attach(false, startSeq);
}
private void attach(boolean system, long startSeq) {
	final IActivityManager mgr = ActivityManager.getService();
	mgr.attachApplication(mAppThread, startSeq);
}
  1. ActivityManagerService
public final void attachApplication(IApplicationThread thread, long startSeq) {
        synchronized (this) {
            int callingPid = Binder.getCallingPid();
            final int callingUid = Binder.getCallingUid();
            final long origId = Binder.clearCallingIdentity();
            attachApplicationLocked(thread, callingPid, callingUid, startSeq);
            Binder.restoreCallingIdentity(origId);
        }
    }

private final boolean attachApplicationLocked(IApplicationThread thread, int pid, int callingUid, long startSeq) {
		......
        // See if the top visible activity is waiting to run in this process...
        if (normalMode) {
            try {
                didSomething = mAtmInternal.attachApplication(app.getWindowProcessController());
            } catch (Exception e) {
                Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);
                badApp = true;
            }
        }
        .......
        return true;
    }
  1. ActivityTaskManagerService$LocalService
public boolean attachApplication(WindowProcessController wpc) throws RemoteException {
            synchronized (mGlobalLockWithoutBoost) {
                return mRootActivityContainer.attachApplication(wpc);
            }
        }
  1. RootActivityContainer
boolean attachApplication(WindowProcessController app) throws RemoteException {
        final String processName = app.mName;
        boolean didSomething = false;
        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
            final ActivityDisplay display = mActivityDisplays.get(displayNdx);
            final ActivityStack stack = display.getFocusedStack();
            if (stack != null) {
                stack.getAllRunningVisibleActivitiesLocked(mTmpActivityList);
                final ActivityRecord top = stack.topRunningActivityLocked();
                final int size = mTmpActivityList.size();
                for (int i = 0; i < size; i++) {
                    final ActivityRecord activity = mTmpActivityList.get(i);
                    if (activity.app == null && app.mUid == activity.info.applicationInfo.uid && processName.equals(activity.processName)) {
                        try {
                            if (mStackSupervisor.realStartActivityLocked(activity, app, top == activity /* andResume */, true /* checkConfig */)) {
                                didSomething = true;
                            }
                        } 
                    }
                }
            }
        }
        return didSomething;
}
//这里就回到了第二节步骤9中的realStartActivityLocked,继续执行启动activity
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值