从ActivityThread类启动到Activity类的onCreate过程分析

211 阅读6分钟

在Android中,ActivityThread是应用进程的初始化类,它的main()方法就是应用的入口方法,应用进程被创建后会调用ActivityThread.main()方法。 本文以Android 13代码为例进行分析。
1,在frameworks/base/core/java/android/app/IApplicationThread.aidl中

oneway interface IApplicationThread {
	void bindApplication(...);
        ......
}

2,在frameworks/base/core/java/android/app/ActivityThread.java中

public final class ActivityThread extends ClientTransactionHandler implements ActivityThreadInternal {

	final ApplicationThread mAppThread = new ApplicationThread();
        
	public ApplicationThread getApplicationThread()
	{
	    return mAppThread;
	}
	
	private class ApplicationThread extends IApplicationThread.Stub {
		public final void scheduleCreateService(...) {
			CreateServiceData s = new CreateServiceData();
			sendMessage(H.CREATE_SERVICE, s);
		}
	}
	
	class H extends Handler {
		public static final int BIND_APPLICATION        = 110;
		public static final int CREATE_SERVICE          = 114;
		public void handleMessage(Message msg) {}
	}
	

	public static void main(String[] args) {
		Looper.prepareMainLooper(); // Looper.prepareMainLooper()为当前线程(即主线程)准备了一个Looper,Looper是Android中用于处理消息循环(如UI事件)的类。
		ActivityThread thread = new ActivityThread(); // 创建ActivityThread的实例,并通过调用其attach方法将其附加到系统服务中。这里第一个参数为false,表示这不是系统服务进程。
		thread.attach(false, startSeq); //调用ActivityThread的attach方法,第一个参数为false,表示不是system server进程,tartSeq参数用于传递启动序列号,可能用于调试或跟踪目的
		Looper.loop(); // Looper.loop()方法使得当前线程进入一个无限循环,等待并处理消息队列中的消息。这是Android应用UI线程的核心,所有UI更新和事件处理都发生在这里。
	}
	
	private void attach(boolean system, long startSeq) {
		RuntimeInit.setApplicationObject(mAppThread.asBinder()); // 通过RuntimeInit.setApplicationObject设置应用的Binder对象,以便AMS可以与之通信。
		final IActivityManager mgr = ActivityManager.getService(); // 获取AMS服务,并调用attachApplication方法通知AMS应用进程已经准备好。这是通过Binder IPC(跨进程通信)完成的。
		try {
			mgr.attachApplication(mAppThread, startSeq);//通知AMS,app进程已经准备好,binder跨进程通信。mAppThread是ApplicationThread类对象,继承自IApplicationThread.Stub
		} catch (RemoteException ex) {
			throw ex.rethrowFromSystemServer();
		}
	}
	
}

上面的代码通过ActivityManager.getService()获取AMS服务。
3,在frameworks/base/core/java/android/app/ActivityManager.java中

public class ActivityManager {
	@UnsupportedAppUsage
    public static IActivityManager getService() {
        return IActivityManagerSingleton.get();
    }
    
    private static IActivityTaskManager getTaskService() {
        return ActivityTaskManager.getService();
    }
    
    @UnsupportedAppUsage
    private static final Singleton<IActivityManager> IActivityManagerSingleton =
            new Singleton<IActivityManager>() {
                @Override
                protected IActivityManager create() {
                    final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE); // 获取ActivityManagerService的IBinder接口实例
                    final IActivityManager am = IActivityManager.Stub.asInterface(b); // 通过IActivityManager.Stub.asInterface(b)将这个IBinder实例转换为IActivityManager接口实例
                    return am;
                }
            };
			
}

上面的代码从ServiceManager获取ActivityManagerService的IBinder接口实例,通常被称为实名binder.
4,在frameworks/base/core/java/android/app/ActivityTaskManager.java中

public class ActivityTaskManager {
	private static final Singleton<ActivityTaskManager> sInstance =
            new Singleton<ActivityTaskManager>() {
                @Override
                protected ActivityTaskManager create() {
                    return new ActivityTaskManager();
                }
            };
    
    private ActivityTaskManager() {
    }
    
    /** @hide */
    public static ActivityTaskManager getInstance() {
        return sInstance.get();
    }
    
    /** @hide */
    public static IActivityTaskManager getService() {
        return IActivityTaskManagerSingleton.get();
    }
    
    @UnsupportedAppUsage(trackingBug = 129726065)
    private static final Singleton<IActivityTaskManager> IActivityTaskManagerSingleton =
            new Singleton<IActivityTaskManager>() {
                @Override
                protected IActivityTaskManager create() {
                    final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);
                    return IActivityTaskManager.Stub.asInterface(b);
                }
    };
}

上面的代码从ServiceManager获取ActivityTaskManager的IBinder接口实例。
5,在frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java中

public class ActivityManagerService extends IActivityManager.Stub
         implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback, ActivityManagerGlobalLock {

	public final void attachApplication(IApplicationThread thread, long startSeq) {
        if (thread == null) {
            throw new SecurityException("Invalid application interface");
        }
        synchronized (this) {
            int callingPid = Binder.getCallingPid();
            final int callingUid = Binder.getCallingUid();
            final long origId = Binder.clearCallingIdentity();
            attachApplicationLocked(thread, callingPid, callingUid, startSeq);//调用attachApplicationLocked函数
            Binder.restoreCallingIdentity(origId);
        }
    }
	
	@GuardedBy("this")
    private boolean attachApplicationLocked(@NonNull IApplicationThread thread,
            int pid, int callingUid, long startSeq) {
			
			thread.bindApplication(...);//启动application
			//ATMS启动activity,调用ActivityTaskManagerInternal抽象类的attachApplication方法,会走到其实现类ActivityTaskManagerService.java中的attachApplication函数。
			didSomething = mAtmInternal.attachApplication(app.getWindowProcessController());
			return true;
	}
}

对于thread.bindApplication(...)会调用到ActivityThread.java中的 public final void bindApplication函数。
6,在frameworks/base/core/java/android/app/ActivityThread.java中

public final void bindApplication(...) {
	AppBindData data = new AppBindData();
	sendMessage(H.BIND_APPLICATION, data);//发送BIND_APPLICATION消息
}

public void handleMessage(Message msg) {
	switch (msg.what) {
		case BIND_APPLICATION:
			AppBindData data = (AppBindData)msg.obj;
			handleBindApplication(data);
			break;
	}
}

private void handleBindApplication(AppBindData data) {
	final ContextImpl appContext = ContextImpl.createAppContext(this, data.info);
	Application app;
	app = data.info.makeApplicationInner(data.restrictedBackupMode, null);
	...
}

7,在frameworks/base/core/java/android/app/LoadedApk.java中

public Application makeApplicationInner(boolean forceDefaultAppClass,Instrumentation instrumentation) {
        return makeApplicationInner(forceDefaultAppClass, instrumentation,
                /* allowDuplicateInstances= */ false);
}

private Application makeApplicationInner(boolean forceDefaultAppClass,Instrumentation instrumentation, boolean allowDuplicateInstances) {
	......
    app = mActivityThread.mInstrumentation.newApplication(
            cl, appClass, appContext);
    appContext.setOuterContext(app);
    ......
    instrumentation.callApplicationOnCreate(app);
    ......
}

此时application已经启动。
8,在frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java中

public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
	@Override
	//此处的attachApplication是抽象类ActivityTaskManagerInternal中attachApplication函数的实现
	public boolean attachApplication(WindowProcessController wpc) throws RemoteException {
		synchronized (mGlobalLockWithoutBoost) {
			return mRootWindowContainer.attachApplication(wpc);//调用RootWindowContainer类的attachApplication函数
		}
	}
}

9,在frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java中

class RootWindowContainer extends WindowContainer<DisplayContent> implements DisplayManager.DisplayListener {
	boolean attachApplication(WindowProcessController app) throws RemoteException {
        try {
            return mAttachApplicationHelper.process(app); //执行AttachApplicationHelper类的process函数
        } finally {
            mAttachApplicationHelper.reset();
        }
    }
	
	private class AttachApplicationHelper implements Consumer<Task>, Predicate<ActivityRecord> {
		boolean process(WindowProcessController app) throws RemoteException {
	        mApp = app;
	        for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) {
	            getChildAt(displayNdx).forAllRootTasks(this);// 对每个根任务调用forAllRootTasks(this),可以调用到test()函数,在forAllRootTasks中isRootTask() ? callback.test(this) : false;
	            if (mRemoteException != null) {
	                throw mRemoteException;
	            }
	        }
	        if (!mHasActivityStarted) {
	            ensureActivitiesVisible(null /* starting */, 0 /* configChanges */,
	                    false /* preserveWindows */);
	        }
	        return mHasActivityStarted;
	    }
		
		@Override
	    public boolean test(ActivityRecord r) {
	        if (r.finishing || !r.showToCurrentUser() || !r.visibleIgnoringKeyguard
	                || r.app != null || mApp.mUid != r.info.applicationInfo.uid
	                || !mApp.mName.equals(r.processName)) {
	            return false;
	        }
	    
	        try {
	    		  //调用ActivityTaskSupervisor.java类中的realStartActivityLocked
	            if (mTaskSupervisor.realStartActivityLocked(r, mApp,
	                    mTop == r && r.getTask().canBeResumed(r) /* andResume */,
	                    true /* checkConfig */)) {
	                mHasActivityStarted = true;
	            }
	        } catch (RemoteException e) {
	            Slog.w(TAG, "Exception in new application when starting activity " + mTop, e);
	            mRemoteException = e;
	            return true;
	        }
	        return false;
	    }
	}
}

上面的代码中调用forAllRootTasks函数,走到Task.java文件中。
上面的代码调用realStartActivityLocked函数,走到ActivityTaskSupervisor.java文件中。
10,在frameworks/base/services/core/java/com/android/server/wm/Task.java中

class Task extends TaskFragment {
	@Override
    boolean forAllRootTasks(Predicate<Task> callback, boolean traverseTopToBottom) {
        return isRootTask() ? callback.test(this) : false; //调用到test函数
    }
}

11,在frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java中

public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
	boolean realStartActivityLocked(ActivityRecord r, WindowProcessController proc,boolean andResume, boolean checkConfig) throws RemoteException {
		// Create activity launch transaction.
		final ClientTransaction clientTransaction = ClientTransaction.obtain(
				proc.getThread(), r.token);// 创建ClientTransaction:通过ClientTransaction.obtain方法创建一个ClientTransaction对象,用于封装启动Activity的IPC请求。Activity的token用于唯一标识Activity
		final boolean isTransitionForward = r.isTransitionForward();
		final IBinder fragmentToken = r.getTaskFragment().getFragmentToken();
		// 此处添加callback,后面会在TransactionExecutor类中执行
		// 使用clientTransaction.addCallback方法向ClientTransaction对象中添加一个LaunchActivityItem回调,这个回调包含了启动Activity所需的所有信息,如Intent、Activity信息、配置信息等。
		clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
				System.identityHashCode(r), r.info,mergedConfiguration.getGlobalConfiguration(),mergedConfiguration.getOverrideConfiguration(), r.compat,
				r.getFilteredReferrer(r.launchedFromPackage), task.voiceInteractor,proc.getReportedProcState(), r.getSavedState(), r.getPersistentSavedState(),
				results, newIntents, r.takeOptions(), isTransitionForward,proc.createProfilerInfoIfNeeded(), r.assistToken, activityClientController,
				r.shareableActivityToken, r.getLaunchedFromBubble(), fragmentToken)); 
		// Schedule transaction.
		mService.getLifecycleManager().scheduleTransaction(clientTransaction); //通过mService.getLifecycleManager().scheduleTransaction(clientTransaction)方法将封装好的ClientTransaction对象调度到目标进程中。这实际上是通过IPC机制,将启动Activity的请求发送到目标进程。
	}
}

上面的代码调用scheduleTransaction函数。
12,在frameworks/base/services/core/java/com/android/server/wm/ClientLifecycleManager.java中

class ClientLifecycleManager {
	void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
        final IApplicationThread client = transaction.getClient();
        transaction.schedule(); //调用ClientTransaction类的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();
        }
    }
}

上面的代码调用schedule()函数。
13,在frameworks/base/core/java/android/app/servertransaction/ClientTransaction.java中

public class ClientTransaction implements Parcelable, ObjectPoolItem {
	private IApplicationThread mClient;
	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;
	}
	
	public void schedule() throws RemoteException {
        mClient.scheduleTransaction(this); //mClient为IApplicationThread对象
    }
}

上面的代码调用scheduleTransaction函数。
14,在frameworks/base/core/java/android/app/ActivityThread.java中

@Override
public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
	//已有类定义public final class ActivityThread extends ClientTransactionHandler,代码会进一步走到ClientTransactionHandler类的scheduleTransaction
	ActivityThread.this.scheduleTransaction(transaction); 
}

15,在frameworks/base/core/java/android/app/ClientTransactionHandler.java中

public abstract class ClientTransactionHandler {
	 void scheduleTransaction(ClientTransaction transaction) {
         transaction.preExecute(this);
         sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);//在ActivityThread类中定义有class H extends Handler
     }
}

16,在frameworks/base/core/java/android/app/ActivityThread.java中

private final TransactionExecutor mTransactionExecutor = new TransactionExecutor(this);
public void handleMessage(Message msg) {
	switch (msg.what) {
		case EXECUTE_TRANSACTION:
            final ClientTransaction transaction = (ClientTransaction) msg.obj;
            mTransactionExecutor.execute(transaction);//调用TransactionExecutor类的execute函数
		break;
	}
}

17,在frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java中

public class TransactionExecutor {

	public void execute(ClientTransaction transaction) {
		executeCallbacks(transaction);//调用TransactionExecutor类的executeCallbacks函数
	}
	
	public void executeCallbacks(ClientTransaction transaction) { // 由于在ActivityTaskSupervisor.java中,clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),此处执行的就是添加的callback
		 final List<ClientTransactionItem> callbacks = transaction.getCallbacks();
		 final int size = callbacks.size();
		 for (int i = 0; i < size; ++i) {
		     final ClientTransactionItem item = callbacks.get(i);  // 获取到LaunchActivityItem对象,callbacks的内容是在ActivityTaskSupervisor.java中添加的
			 item.execute(mTransactionHandler, token, mPendingActions);//执行LaunchActivityItem的execute函数
		}
	}
	
}

上面的代码调用execute()函数。
18,在frameworks/base/core/java/android/app/Servertransaction/LaunchActivityItem.java中

public class LaunchActivityItem extends ClientTransactionItem {
	@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, mActivityOptions, mIsForward, mProfilerInfo,
                client, mAssistToken, mShareableActivityToken, mLaunchedFromBubble,
                 mTaskFragmentToken);
         client.handleLaunchActivity(r, pendingActions, null /* customIntent */); //执行ClientTransactionHandler的handleLaunchActivity
         Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
     }
}

19,在frameworks/base/core/java/android/app/ActivityThread.java中

@Override
public Activity handleLaunchActivity(ActivityClientRecord r,PendingTransactionActions pendingActions, Intent customIntent) { //handleLaunchActivity是ClientTransactionHandler抽象类中的函数
	final Activity a = performLaunchActivity(r, customIntent);//执行performLaunchActivity
}

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {

	ContextImpl appContext = createBaseContextForActivity(r);
    Activity activity = null;
    try {
        java.lang.ClassLoader cl = appContext.getClassLoader();
        activity = mInstrumentation.newActivity(
                cl, component.getClassName(), r.intent);//创建新的activity
        StrictMode.incrementExpectedActivityCount(activity.getClass());
        r.intent.setExtrasClassLoader(cl);
        r.intent.prepareToEnterProcess(isProtectedComponent(r.activityInfo),
                appContext.getAttributionSource());
        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);
        }
    }
	r.activity = activity;
    if (r.isPersistable()) {
        mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState); //调用callActivityOnCreate函数
    } else {
        mInstrumentation.callActivityOnCreate(activity, r.state);
    }
	return activity;
}

上面的代码调用callActivityOnCreate函数。
20,在frameworks/base/core/java/android/app/Instrumentation.java中

public class Instrumentation {

	public void callApplicationOnCreate(Application app) {
	    app.onCreate();
	}

	public void callActivityOnCreate(Activity activity, Bundle icicle,PersistableBundle persistentState) {
        prePerformCreate(activity);
        activity.performCreate(icicle, persistentState); //调用performCreate函数
        postPerformCreate(activity);
    }
}

21,在frameworks/base/core/java/android/app/Activity.java中

public class Activity extends ContextThemeWrapper implements LayoutInflater.Factory2,Window.Callback, KeyEvent.Callback,
			OnCreateContextMenuListener, ComponentCallbacks2,
			Window.OnWindowDismissedCallback,ContentCaptureManager.ContentCaptureClient {

	final void performCreate(Bundle icicle) {
        performCreate(icicle, null);
    }
	final void performCreate(Bundle icicle, PersistableBundle persistentState) {
		if (persistentState != null) {
            onCreate(icicle, persistentState); // 调用onCreate函数
        } else {
            onCreate(icicle);
        }
	}
}

经过上面的步骤,就可以执行到activity的onCreate函数。