Activity启动流程(二)

216 阅读10分钟

2.11.10 realStartActivityLocked()



final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,

        boolean andResume, boolean checkConfig) throws RemoteException {



    if (!allPausedActivitiesComplete()) {

        // While there are activities pausing we skipping starting any new activities until

        // pauses are complete. NOTE: that we also do this for activities that are starting in

        // the paused state because they will first be resumed then paused on the client side.

        if (DEBUG_SWITCH || DEBUG_PAUSE || DEBUG_STATES) Slog.v(TAG_PAUSE,

                "realStartActivityLocked: Skipping start of r=" + r

                + " some activities pausing...");

        return false;

    }

    // 获取app stack

    final TaskRecord task = r.getTask();

    final ActivityStack stack = task.getStack();



    beginDeferResume();



    try {

            ......

            // 创建activity启动transaction对象

            // 详见2.13.1

            final ClientTransaction clientTransaction = ClientTransaction.obtain(app.thread,

                    r.appToken);

            // 添加回调。详见2.13.5

            clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),

                    System.identityHashCode(r), r.info,

                    // TODO: Have this take the merged configuration instead of separate global

 // and override configs.

                    mergedConfiguration.getGlobalConfiguration(),

                    mergedConfiguration.getOverrideConfiguration(), r.compat,

                    r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,

                    r.persistentState, results, newIntents, mService.isNextTransitionForward(),

                    profilerInfo));



            // Set desired final state.

            final ActivityLifecycleItem lifecycleItem;

            if (andResume) {

                lifecycleItem = ResumeActivityItem.obtain(mService.isNextTransitionForward());

            } else {

                lifecycleItem = PauseActivityItem.obtain();

            }

            clientTransaction.setLifecycleStateRequest(lifecycleItem);

            // 设置定时任务,详见2.14.1

            mService.getLifecycleManager().scheduleTransaction(clientTransaction);

            ......

            

}

在realStartActivityLocked()中,主要做以下工作:

  • 创建一个ClientTransaction对象。详见2.13.1
  • 为这个对象添加回调
  • 使用这个对象设置定时任务。mService是ActivityManagerService对象,

ActivityManagerService调用getLifecycleManager()方法,返回ActivityManagerService中持有的ClientLifecycleManager对象,因此实际上是ClientLifecycleManager执行了scheduleTransaction()函数。详见2.14.1

2.12 ActivityStack.java

path:frameworks/base/services/core/java/com/android/server/am/ActivityStack.java

2.12.1 resumeTopActivityUncheckedLocked()



boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {

    if (mStackSupervisor.inResumeTopActivity) {

        // Don't even start recursing.

        return false;

    }



    boolean result = false;

    try {

        // Protect against recursion.

        mStackSupervisor.inResumeTopActivity = true;

        // 详见2.12.2

        result = resumeTopActivityInnerLocked(prev, options);



        // When resuming the top activity, it may be necessary to pause the top activity (for

        // example, returning to the lock screen. We suppress the normal pause logic in

        // {@link #resumeTopActivityUncheckedLocked}, since the top activity is resumed at the

        // end. We call the {@link ActivityStackSupervisor#checkReadyForSleepLocked} again here

        // to ensure any necessary pause logic occurs. In the case where the Activity will be

        // shown regardless of the lock screen, the call to

        // {@link ActivityStackSupervisor#checkReadyForSleepLocked} is skipped.

        final ActivityRecord next = topRunningActivityLocked(true /* focusableOnly */);

        if (next == null || !next.canTurnScreenOn()) {

            checkReadyForSleep();

        }

    } finally {

        mStackSupervisor.inResumeTopActivity = false;

    }



    return result;

}

2.12.2 resumeTopActivityInnerLocked()



@GuardedBy("mService")

private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {

    if (!mService.mBooting && !mService.mBooted) {

        // Not ready yet!

        return false;

    }

    ......

    // Find the next top-most activity to resume in this stack that is not finishing and is

    // focusable. If it is not focusable, we will fall into the case below to resume the

    // top activity in the next focusable task.

    final ActivityRecord next = topRunningActivityLocked(true /* focusableOnly */);

    ......

            try {

                ......

                // 详见2.11.9 

                mStackSupervisor.startSpecificActivityLocked(next, true, false);

               

            }

        }

        ......

    return true;

}

2.13 ClientTransaction

2.13.1 obtain()



 /** Obtain an instance initialized with provided params. */

public static ClientTransaction obtain(IApplicationThread client, IBinder activityToken) {

    ClientTransaction instance = ObjectPool.obtain(ClientTransaction.class);

    if (instance == null) {

        instance = new ClientTransaction();

    }

    instance.mClient = client;

    instance.mActivityToken = activityToken;



    return instance;

}

使用单利创建一个对象,并且用传来的参数初始化这个对象。

2.13.2 schedule()



 /** Target client. */

private IApplicationThread mClient;



 /**

 * Schedule the transaction after it was initialized. It will be send to client and all its

 * individual parts will be applied in the following sequence:

 * 1. The client calls {  @link #preExecute(ClientTransactionHandler)}, which triggers all work

 *    that needs to be done before actually scheduling the transaction for callbacks and

 *    lifecycle state request.

 * 2. The transaction message is scheduled.

 * 3. The client calls {  @link TransactionExecutor#execute(ClientTransaction)}, which executes

 *    all callbacks and necessary lifecycle transitions.

 */

public void schedule() throws RemoteException {

    // 执行2.15.1.1

    mClient.scheduleTransaction(this);

}

mClient已经是初始化过的IApplicationThread对象,因此最终由IApplicationThread的实现类执行scheduleTransaction()函数。

IApplicationThread的子类在ActivityThread中由ApplicationThread.java继承,是ActivityThread的子类。详见2.15

至此,运行在SystemServer的AMS相关进程,通过IApplicationThread这个AIDL进行Binder通信,实现了跨进程通信。

2.13.3 preExecute()



 /**

 * Do what needs to be done while the transaction is being scheduled on the client side.

 *  @param clientTransactionHandler Handler on the client side that will executed all operations

 *                                 requested by transaction items.

 */

public void preExecute(android.app.ClientTransactionHandler clientTransactionHandler) {

    if (mActivityCallbacks != null) {

        final int size = mActivityCallbacks.size();

        for (int i = 0; i < size; ++i) {

            mActivityCallbacks.get(i).preExecute(clientTransactionHandler, mActivityToken);

        }

    }

    if (mLifecycleStateRequest != null) {

        mLifecycleStateRequest.preExecute(clientTransactionHandler, mActivityToken);

    }

}

2.13.4 getCallbacks()



 /** Get the list of callbacks. */

@Nullable

List<ClientTransactionItem> getCallbacks() {

    return mActivityCallbacks;

}

2.13.5 addCallback()

private List<ClientTransactionItem> mActivityCallbacks;

 /**

 * Add a message to the end of the sequence of callbacks.

 *  @param activityCallback A single message that can contain a lifecycle request/callback.

 */

public void addCallback(ClientTransactionItem activityCallback) {

    if (mActivityCallbacks == null) {

        mActivityCallbacks = new ArrayList<>();

    }

    mActivityCallbacks.add(activityCallback);

}

将回调添加到mActivityCallbacks列表中去。添加的是抽象类ClientTransactionItem。

2.14 ClientLifecycleManager.java

path:frameworks/base/services/core/java/com/android/server/am/ClientLifecycleManager.java

2.14.1 scheduleTransaction()



 /**

 * Schedule a transaction, which may consist of multiple callbacks and a lifecycle request.

 *  @param transaction A sequence of client transaction items.

 *  @throws RemoteException

 *

 *  @see ClientTransaction

 */

void scheduleTransaction(ClientTransaction transaction) throws RemoteException {

    final IApplicationThread client = transaction.getClient();

    // 详见2.13.2

    transaction.schedule();

    if (!(client instanceof Binder)) {

        // If client is not an instance of Binder - it's a remote call and at this point it is

        // safe to recycle the object. All objects used for local calls will be recycled after

        // the transaction is executed on client in ActivityThread.

        transaction.recycle();

    }

}

2.15 ActivityThread.java

path:/frameworks/base/core/java/android/app/ActivityThread.java

2.15.1 ApplicationThread

2.15.1.1 scheduleTransaction()


@Override

public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {

    ActivityThread.this.scheduleTransaction(transaction);

}

调用ActivityThread父类ClientTransactionHandler的scheduleTransaction()。执行2.16.1

2.15.2 H

class H extends Handler {

    ......

    public static final int EXECUTE_TRANSACTION = 159;

    ......

    public void handleMessage(Message msg) {

    ......

    

        case EXECUTE_TRANSACTION:

            final ClientTransaction transaction = (ClientTransaction) msg.obj;

            // 执行2.17.1

            mTransactionExecutor.execute(transaction);

            if (isSystem()) {

                // Client transactions inside system process are recycled on the client side

                // instead of ClientLifecycleManager to avoid being cleared before this

                // message is handled.

                transaction.recycle();

            }

            // TODO(lifecycler): Recycle locally scheduled transactions.

        break;

    ......

    

H类处理EXECUTE_TRANSACTION消息, TransactionExecutor执行execute方法,携带传来的transaction作为参数。详见2.17.1

2.15.3 handleLaunchActivity()

 /**

 * Extended implementation of activity launch. Used when server requests a launch or relaunch.

 */

@Override

public Activity handleLaunchActivity(ActivityClientRecord r,

        PendingTransactionActions pendingActions, Intent customIntent) {

    // If we are getting ready to gc after going to the background, well

    // we are back active so skip it.

    unscheduleGcIdler();

    mSomeActivitiesChanged = true;



    if (r.profilerInfo != null) {

        mProfiler.setProfiler(r.profilerInfo);

        mProfiler.startProfiling();

    }



    // Make sure we are running with the most recent config.

    handleConfigurationChanged(null, null);



    if (localLOGV) Slog.v(

        TAG, "Handling launch of " + r);



    // Initialize before creating the activity

    if (!ThreadedRenderer.sRendererDisabled) {

        GraphicsEnvironment.earlyInitEGL();

    }

    WindowManagerGlobal.initialize();

    // 执行启动activity,执行2.15.4

    final Activity a = performLaunchActivity(r, customIntent);



    if (a != null) {

        r.createdConfig = new Configuration(mConfiguration);

        reportSizeConfigurations(r);

        if (!r.activity.mFinished && pendingActions != null) {

            pendingActions.setOldState(r.state);

            pendingActions.setRestoreInstanceState(true);

            pendingActions.setCallOnPostCreate(true);

        }

    } else {

        // If there was an error, for any reason, tell the activity manager to stop us.

        try {

            ActivityManager.getService()

                    .finishActivity(r.token, Activity.RESULT_CANCELED, null,

                            Activity.DONT_FINISH_TASK_WITH_ACTIVITY);

        } catch (RemoteException ex) {

            throw ex.rethrowFromSystemServer();

        }

    }



    return a;

}

2.15.4 performLaunchActivity()

 /**  Core implementation of activity launch. */

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {

    // 获取ActivityInfo对象aInfo

    ActivityInfo aInfo = r.activityInfo;

    if (r.packageInfo == null) {

        // 获取apk文件描述类LoadApk

        r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo,

                Context.CONTEXT_INCLUDE_CODE);

    }

    // 获取conponentName

    ComponentName component = r.intent.getComponent();

    if (component == null) {

        component = r.intent.resolveActivity(

            mInitialApplication.getPackageManager());

        r.intent.setComponent(component);

    }



    if (r.activityInfo.targetActivity != null) {

        component = new ComponentName(r.activityInfo.packageName,

                r.activityInfo.targetActivity);

    }

    // 创建Activity的Context

    ContextImpl appContext = createBaseContextForActivity(r);

    Activity activity = null;

    try {

        // 类加载器创建Activity实例

        java.lang.ClassLoader cl = appContext.getClassLoader();

        activity = mInstrumentation.newActivity(

                cl, component.getClassName(), r.intent);

        StrictMode.incrementExpectedActivityCount(activity.getClass());

        r.intent.setExtrasClassLoader(cl);

        r.intent.prepareToEnterProcess();

        if (r.state != null) {

            r.state.setClassLoader(cl);

        }

    } catch (Exception e) {

        if (!mInstrumentation.onException(activity, e)) {

            throw new RuntimeException(

                "Unable to instantiate activity " + component

                + ": " + e.toString(), e);

        }

    }



    try {

        // 创建Application对象

        Application app = r.packageInfo.makeApplication(false, mInstrumentation);



        if (localLOGV) Slog.v(TAG, "Performing launch of " + r);

        if (localLOGV) Slog.v(

                TAG, r + ": app=" + app

                + ", appName=" + app.getPackageName()

                + ", pkg=" + r.packageInfo.getPackageName()

                + ", comp=" + r.intent.getComponent().toShortString()

                + ", dir=" + r.packageInfo.getAppDir());



        if (activity != null) {

            // 初始化Activity

            CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());

            Configuration config = new Configuration(mCompatConfiguration);

            if (r.overrideConfig != null) {

                config.updateFrom(r.overrideConfig);

            }

            if (DEBUG_CONFIGURATION) Slog.v(TAG, "Launching activity "

                    + r.activityInfo.name + " with config " + config);

            Window window = null;

            if (r.mPendingRemoveWindow != null && r.mPreserveWindow) {

                window = r.mPendingRemoveWindow;

                r.mPendingRemoveWindow = null;

                r.mPendingRemoveWindowManager = null;

            }

            appContext.setOuterContext(activity);

            activity.attach(appContext, this, getInstrumentation(), r.token,

                    r.ident, app, r.intent, r.activityInfo, title, r.parent,

                    r.embeddedID, r.lastNonConfigurationInstances, config,

                    r.referrer, r.voiceInteractor, window, r.configCallback);



            if (customIntent != null) {

                activity.mIntent = customIntent;

            }

            r.lastNonConfigurationInstances = null;

            checkAndBlockForNetworkAccess();

            activity.mStartedActivity = false;

            int theme = r.activityInfo.getThemeResource();

            if (theme != 0) {

                activity.setTheme(theme);

            }

            

            activity.mCalled = false;

            // activity的onCreate方法。详见2.2.3

            if (r.isPersistable()) {

                mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);

            } else {

                mInstrumentation.callActivityOnCreate(activity, r.state);

            }

            if (!activity.mCalled) {

                throw new SuperNotCalledException(

                    "Activity " + r.intent.getComponent().toShortString() +

                    " did not call through to super.onCreate()");

            }

            r.activity = activity;

        }

        r.setState(ON_CREATE);



        mActivities.put(r.token, r);



    } catch (SuperNotCalledException e) {

        throw e;



    } catch (Exception e) {

        if (!mInstrumentation.onException(activity, e)) {

            throw new RuntimeException(

                "Unable to start activity " + component

                + ": " + e.toString(), e);

        }

    }

    

    return activity;

}

activity启动的核心方法。

2.15.5 sendActivityResult()



public final void sendActivityResult(

        IBinder token, String id, int requestCode,

        int resultCode, Intent data) {

    if (DEBUG_RESULTS) Slog.v(TAG, "sendActivityResult: id=" + id

            + " req=" + requestCode + " res=" + resultCode + " data=" + data);

    ArrayList<ResultInfo> list = new ArrayList<ResultInfo>();

    list.add(new ResultInfo(id, requestCode, resultCode, data));

    final ClientTransaction clientTransaction = ClientTransaction.obtain(mAppThread, token);

    clientTransaction.addCallback(ActivityResultItem.obtain(list));

    try {

        mAppThread.scheduleTransaction(clientTransaction);

    } catch (RemoteException e) {

        // Local scheduling

    }

}

2.16 ClientTransactionHandler.java

path:frameworks/base/core/java/android/app/ClientTransactionHandler.java

抽象类,子类是:ActivityThread

public final class ActivityThread extends ClientTransactionHandler

2.16.1 scheduleTransaction()



 /** Prepare and schedule transaction for execution. */

void scheduleTransaction(ClientTransaction transaction) {

    transaction.preExecute(this);

    sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);

}

主要做两件事:

  • 客户端侧的预处理。详见2.13.3
  • 给ActivityThread.H类发送EXECUTE_TRANSACTION的消息。详见2.15.2

2.16.2 handleLaunchActivity()



 /** Perform activity launch. */

public abstract Activity handleLaunchActivity(ActivityThread.ActivityClientRecord r,

        PendingTransactionActions pendingActions, Intent customIntent);

抽象方法,详见实类中的方法。详见2.15.3

2.17 TransactionExecutor

2.17.1 execute()



 /**

 * Resolve transaction.

 * First all callbacks will be executed in the order they appear in the list. If a callback

 * requires a certain pre- or post-execution state, the client will be transitioned accordingly.

 * Then the client will cycle to the final lifecycle state if provided. Otherwise, it will

 * either remain in the initial state, or last state needed by a callback.

 */

public void execute(ClientTransaction transaction) {

    final IBinder token = transaction.getActivityToken();

    log("Start resolving transaction for client: " + mTransactionHandler + ", token: " + token);

    // 2.17.2

    executeCallbacks(transaction);

    // 2.17.3

    executeLifecycleState(transaction);

    mPendingActions.clear();

    log("End resolving transaction");

}

2.17.2 executeCallbacks()



 /** Cycle through all states requested by callbacks and execute them at proper times. */

@VisibleForTesting

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);

        // 执行启动activity

        item.execute(mTransactionHandler, token, mPendingActions);

        item.postExecute(mTransactionHandler, token, mPendingActions);

        ......

    }

}

在executeCallbacks中,先从transaction中取出callbacks列表。这个callback是在2.11.10的ActivityStackSupervisor.java的realStartActivityLocked()函数中,开启任务之前添加进去的。

callbacks列表里面希望添加的是抽象类ClientTransactionItem,实际上在realStartActivityLocked()中添加的是LaunchActivityItem.obtain(new Intent(r.intent),因此LaunchActivityItem.obtain()这个方法返回的应该是ClientTransactionItem的实现子类。

            // 添加回调

            clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),

                    System.identityHashCode(r), r.info,

                    // TODO: Have this take the merged configuration instead of separate global

 // and override configs.

                    mergedConfiguration.getGlobalConfiguration(),

                    mergedConfiguration.getOverrideConfiguration(), r.compat,

                    r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,

                    r.persistentState, results, newIntents, mService.isNextTransitionForward(),

                    profilerInfo));

因此这里的item是LaunchActivityItem对象,item执行的execute()和postExecute()也是LaunchActivityItem的函数。详见2.18

2.17.3 executeLifecycleState()

2.18 LaunchActivityItem.java

path:/frameworks/base/core/java/android/app/servertransaction/LaunchActivityItem.java

2.18.1 LaunchActivityItem.obtain()



 /** Obtain an instance initialized with provided params. */

public static LaunchActivityItem obtain(Intent intent, int ident, ActivityInfo info,

        Configuration curConfig, Configuration overrideConfig, CompatibilityInfo compatInfo,

        String referrer, IVoiceInteractor voiceInteractor, int procState, Bundle state,

        PersistableBundle persistentState, List<ResultInfo> pendingResults,

        List<ReferrerIntent> pendingNewIntents, boolean isForward, ProfilerInfo profilerInfo) {

    LaunchActivityItem instance = ObjectPool.obtain(LaunchActivityItem.class);

    if (instance == null) {

        instance = new LaunchActivityItem();

    }

    setValues(instance, intent, ident, info, curConfig, overrideConfig, compatInfo, referrer,

            voiceInteractor, procState, state, persistentState, pendingResults,

            pendingNewIntents, isForward, profilerInfo);



    return instance;

}

单例模式创建LaunchActivityItem对象

2.18.2 execute()



@Override

public void execute(ClientTransactionHandler client, IBinder token,

        PendingTransactionActions pendingActions) {

    Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStart");

    ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo,

            mOverrideConfig, mCompatInfo, mReferrer, mVoiceInteractor, mState, mPersistentState,

            mPendingResults, mPendingNewIntents, mIsForward,

            mProfilerInfo, client);

    // 2.16.2

    client.handleLaunchActivity(r, pendingActions, null /* customIntent */);

    Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);

}

执行ClientTransactionHandler.handleLaunchActivity()函数。handleLaunchActivity()是抽象类中的抽象方法。详见2.16.2。

2.18.3 preExecute()



@Override

public void preExecute(ClientTransactionHandler client, IBinder token) {

    client.updateProcessState(mProcState, false);

    client.updatePendingConfiguration(mCurConfig);

}

2..18.4 postExecute()

没有这个函数?!

2.19 Process.java

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

2.19.1 start()

public static final String ZYGOTE_SOCKET = "zygote";

public static final String SECONDARY_ZYGOTE_SOCKET = "zygote_secondary";



public static final ZygoteProcess zygoteProcess =

        new ZygoteProcess(ZYGOTE_SOCKET, SECONDARY_ZYGOTE_SOCKET);

        

public static final ProcessStartResult start(final String processClass,

                              final String niceName,

                              int uid, int gid, int[] gids,

                              int runtimeFlags, int mountExternal,

                              int targetSdkVersion,

                              String seInfo,

                              String abi,

                              String instructionSet,

                              String appDataDir,

                              String invokeWith,

                              String[] zygoteArgs) {

    return zygoteProcess.start(processClass, niceName, uid, gid, gids,

                runtimeFlags, mountExternal, targetSdkVersion, seInfo,

                abi, instructionSet, appDataDir, invokeWith, zygoteArgs);

}

2.20 ZygoteProcess.java

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

2.20.1 start()

public final Process.ProcessStartResult start(final String processClass,

                                              final String niceName,

                                              int uid, int gid, int[] gids,

                                              int runtimeFlags, int mountExternal,

                                              int targetSdkVersion,

                                              String seInfo,

                                              String abi,

                                              String instructionSet,

                                              String appDataDir,

                                              String invokeWith,

                                              String[] zygoteArgs) {

    try {

        return startViaZygote(processClass, niceName, uid, gid, gids,

                runtimeFlags, mountExternal, targetSdkVersion, seInfo,

                abi, instructionSet, appDataDir, invokeWith, false /* startChildZygote */,

                zygoteArgs);

    } catch (ZygoteStartFailedEx ex) {

        Log.e(LOG_TAG,

                "Starting VM process through Zygote failed");

        throw new RuntimeException(

                "Starting VM process through Zygote failed", ex);

    }

}

2.20.2 startViaZygote()



private Process.ProcessStartResult startViaZygote(final String processClass,

                                                  final String niceName,

                                                  final int uid, final int gid,

                                                  final int[] gids,

                                                  int runtimeFlags, int mountExternal,

                                                  int targetSdkVersion,

                                                  String seInfo,

                                                  String abi,

                                                  String instructionSet,

                                                  String appDataDir,

                                                  String invokeWith,

                                                  boolean startChildZygote,

                                                  String[] extraArgs)

                                                  throws ZygoteStartFailedEx {

    ArrayList<String> argsForZygote = new ArrayList<String>();



    // --runtime-args, --setuid=, --setgid=,

    // and --setgroups= must go first

    argsForZygote.add("--runtime-args");

    argsForZygote.add("--setuid=" + uid);

    argsForZygote.add("--setgid=" + gid);

    argsForZygote.add("--runtime-flags=" + runtimeFlags);

    if (mountExternal == Zygote.MOUNT_EXTERNAL_DEFAULT) {

        argsForZygote.add("--mount-external-default");

    } else if (mountExternal == Zygote.MOUNT_EXTERNAL_READ) {

        argsForZygote.add("--mount-external-read");

    } else if (mountExternal == Zygote.MOUNT_EXTERNAL_WRITE) {

        argsForZygote.add("--mount-external-write");

    }

    argsForZygote.add("--target-sdk-version=" + targetSdkVersion);



    // --setgroups is a comma-separated list

    if (gids != null && gids.length > 0) {

        StringBuilder sb = new StringBuilder();

        sb.append("--setgroups=");



        int sz = gids.length;

        for (int i = 0; i < sz; i++) {

            if (i != 0) {

                sb.append(',');

            }

            sb.append(gids[i]);

        }



        argsForZygote.add(sb.toString());

    }



    if (niceName != null) {

        argsForZygote.add("--nice-name=" + niceName);

    }



    if (seInfo != null) {

        argsForZygote.add("--seinfo=" + seInfo);

    }



    if (instructionSet != null) {

        argsForZygote.add("--instruction-set=" + instructionSet);

    }



    if (appDataDir != null) {

        argsForZygote.add("--app-data-dir=" + appDataDir);

    }



    if (invokeWith != null) {

        argsForZygote.add("--invoke-with");

        argsForZygote.add(invokeWith);

    }



    if (startChildZygote) {

        argsForZygote.add("--start-child-zygote");

    }



    argsForZygote.add(processClass);



    if (extraArgs != null) {

        for (String arg : extraArgs) {

            argsForZygote.add(arg);

        }

    }



    synchronized(mLock) {

        return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi), argsForZygote);

    }

}

2.20.3 zygoteSendArgsAndGetResult()



private static Process.ProcessStartResult zygoteSendArgsAndGetResult(

        ZygoteState zygoteState, ArrayList<String> args)

        throws ZygoteStartFailedEx {

    try {

        // Throw early if any of the arguments are malformed. This means we can

        // avoid writing a partial response to the zygote.

        int sz = args.size();

        for (int i = 0; i < sz; i++) {

            if (args.get(i).indexOf('\n') >= 0) {

                throw new ZygoteStartFailedEx("embedded newlines not allowed");

            }

        }



        /**

 * See com.android.internal.os.SystemZygoteInit.readArgumentList()

 * Presently the wire format to the zygote process is:

 * a) a count of arguments (argc, in essence)

 * b) a number of newline-separated argument strings equal to count

 *

 * After the zygote process reads these it will write the pid of

 * the child or -1 on failure, followed by boolean to

 * indicate whether a wrapper process was used.

 */

 final BufferedWriter writer = zygoteState.writer;

        final DataInputStream inputStream = zygoteState.inputStream;



        writer.write(Integer.toString(args.size()));

        writer.newLine();



        for (int i = 0; i < sz; i++) {

            String arg = args.get(i);

            writer.write(arg);

            writer.newLine();

        }



        writer.flush();



        // Should there be a timeout on this?

        Process.ProcessStartResult result = new Process.ProcessStartResult();



        // Always read the entire result from the input stream to avoid leaving

        // bytes in the stream for future process starts to accidentally stumble

        // upon.

        result.pid = inputStream.readInt();

        result.usingWrapper = inputStream.readBoolean();



        if (result.pid < 0) {

            throw new ZygoteStartFailedEx("fork() failed");

        }

        return result;

    } catch (IOException ex) {

        zygoteState.close();

        throw new ZygoteStartFailedEx(ex);

    }

}

3. 核心方法流程图&流程总结

3.1 流程图

// 调用流程忽略返回的回调

3.2 简单总结

以上详细介绍了Activity的启动流程,在以上流程中:

  1. Application层:
    • 2.1.1是在LauncherActivity.java在Application层,其中LauncherActivity使用的startActivity()方法是Application启动Activity的入口。
    • LauncherActivity所在的进程作为Binder的Client端,通过这个方法,将创建和启动Activity的意图转送给system_server进程。
  2. Framework层:
    • 从2.1.1~2.16.1再从2.16.1到2.1.7是Android Framework层启动Activity流程。
    • 以上流程中从2.1.1到2.16.1运行在system_server中,是启动Activity中整个Framework中最复杂最核心的部分。
    • 流程2.16.1到2.1.7,运行在目标Application进程,主要是通过Hanlder消息机制,使用这个进程内的通信机制,binder所在的线程向主线程发送H.LAUNCHER_ACTIVITY消息,最红创建Activity并且通过ApplicationThread调用Activity的onCreate()函数,并且完成对Activity的生命周期控制。

4. 原理图&总结

4.1 原理图:

流程图.jpg

4.2 总结

  1. 启动Activity的时候,LaucnehrActivity所在的进程通过startActivity()函数,使用Binder,作为Binder的Client,将创建Activity的意图发送给system_server。

  2. system_server收到请求后,会判断意图中的Activity是否存在,如果不存在,通过socket就向zygote发送请求。如果存在就直接通过H.LAUNCHER_ACTIVITY启动对应的Activity

  3. Zygote收到创建进程的请求后,fork出一个新的App进程

  4. 创建完成App进程后,通过Binder的system_server发起attachApplication请求

  5. system_server进程收到请求后,通过内部函数和方法处理,即5~6。处理完成(满足条件)后,通过Binder,实现跨进程通信,告知App进程。

  6. App进程的Binder进程(ApplicationThread)收到system_server发送的消息后,通过Handler向主线程发送H.LAUNCHER_ACTIVITY消息

  7. App的主线程收到Message之后,创建目标Activity,并且指定Activity.onCreate()函数,管理Activity的生命周期。

6.参考:

  1. Activity生命周期:developer.android.com/reference/a…