Launcher 进程即 Android 系统桌面也是一个应用程序。随着 Android 系统不断更新,Launcher 也已经升级到现在的 Launcher3 了,本文主要研究 Launcher3 的启动过程。Launcher 作为一个应用程序由AMS(ActivityManagerService)来管理进程调度与启动,AMS是 Android 中最核心的系统服务,几乎所有的应用都需要与AMS通信。本文先从AMS启动入手,再分析由AMS启动 Launcher 的这个过程。
AMS的启动过程
从上篇文章安卓系统启动流程得知AMS是由 SystemServer 启动的,下面看看 SystemServer 内部执行流程
1.创建系统上下文
- private void createSystemContext() {
- ActivityThread activityThread = ActivityThread.systemMain();
- mSystemContext = activityThread.getSystemContext();
- mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
-
- final Context systemUiContext = activityThread.getSystemUiContext();
- systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
- }
2.创建系统服务
// Create the system service manager.
- mSystemServiceManager = new SystemServiceManager(mSystemContext);
- mSystemServiceManager.setStartInfo(mRuntimeRestart,
- mRuntimeStartElapsedTime, mRuntimeStartUptime);
- LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
- 3.startBootstrapServices()
引导服务中启动了ATMS(ActivityTaskManagerServici)、AMS等服务,其中ATMS是 Android 10中新增的,本来都是AMS来管理,可能考虑到AMS职责太多代码太庞大,所以单独拆出来ATMS用于管理Activity。
//创建ATMS和AMS
- ActivityTaskManagerService atm = mSystemServiceManager.startService(
- ActivityTaskManagerService.Lifecycle.class).getService();
- mActivityManagerService = ActivityManagerService.Lifecycle.startService(
- mSystemServiceManager, atm);
ATMS和AMS内部都有一个 Lifecycle 用来创建并启动,publishBinderService 最后会调用到 ServiceManager.addService(),注册 Binder 服务。
//ActivityTaskManagerService内部类
public static final class Lifecycle extends SystemService { private final ActivityTaskManagerService mService; public Lifecycle(Context context) { super(context); mService = new ActivityTaskManagerService(context); } @Override public void onStart() { publishBinderService(Context.ACTIVITY_TASK_SERVICE, mService); mService.start(); } }
4.startCoreServices 和 startOtherServices
startCoreServices 启动核心服务,基本都是系统的服务,startOtherServices启动其他服务,WMS就在这里启动。systemReady 方法会启动 Launcher 进程。
// 启动Launcher
- mActivityManagerService.systemReady(() -> {
- mSystemServiceManager.startBootPhase(t, SystemService.PHASE_ACTIVITY_MANAGER_READY);
- startSystemUi(context, windowManagerF);
-
- }
SystemServer执行流程图:
Launcher启动流程
上文说到AMS的 systemReady 方法会启动 Launcher,来看看 Launcher 是如何被启动起来的。
ActivityManagerService.java
- public void systemReady(final Runnable goingCallback, @NonNull TimingsTraceAndSlog t) {
- ...
- mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");
- ...
- }
systemReady 中会调用 mAtmInternal.startHomeOnAllDisplays 方法,mAtmInternal 就是ActivityTaskManagerInternal,在ATMS的构造方法中初始化,是由ATMS对外提供的一个抽象类,真正的实现是在ATMS中的 LocalService,所以执行到了 LocalService 的 startHomeOnAllDisplays方法。
//ActivityTaskManagerService.java # LocalService
- public boolean startHomeOnAllDisplays(int userId, String reason) {
- synchronized (mGlobalLock) {
- return mRootWindowContainer.startHomeOnAllDisplays(userId, reason);
- }
- }
然后会调用到 startHomeOnTaskDisplayArea 方法,这里 getHomeIntent 方法中创建了一个 category为 CATEGORY_HOME 的 Intent,这个 category 会在 Launcher3 的 AndroidManifest.xml 中配置,表明是 HomeActivity,最后再调用 startHomeActivity 方法。
- boolean startHomeOnTaskDisplayArea(int userId, String reason, TaskDisplayArea taskDisplayArea,
- boolean allowInstrumenting, boolean fromHomeKey) {
- Intent homeIntent = null;
- ActivityInfo aInfo = null;
-
- homeIntent = mService.getHomeIntent();
- aInfo = resolveHomeActivity(userId, homeIntent);
-
- mService.getActivityStartController().startHomeActivity(homeIntent, aInfo, myReason,
- taskDisplayArea);
- return true;
- }
ActivityStartController.startHomeActivity
obtainStarter 方法返回的是 ActivityStarter 对象,它负责 Activity 的启动。这里多个 set 方法设置启动需要的参数, 最后 execute 方法才是真正的启动逻辑。这段代码看起来像构建者模式,实际上是工厂 + 享元 + 链式调用。
//ActivityStartController.java
- void startHomeActivity(Intent intent, ActivityInfo aInfo, String reason,
- TaskDisplayArea taskDisplayArea) {
- //obtainStarter 返回一个 ActivityStarter,它负责 Activity 的启动
- mLastHomeActivityStartResult = obtainStarter(intent, "startHomeActivity: " + reason)
- .setOutActivity(tmpOutRecord)
- .setCallingUid(0)
- .setActivityInfo(aInfo)
- .setActivityOptions(options.toBundle())
- .execute();
- }
ActivityStarter.extcute
onExecutionComplete 方法在 ActivityStartController 清除数据放回startPool池子中。
- int execute() {
- try {
- int res;
- synchronized (mService.mGlobalLock) {
- ...
- //执行这个方法
- res = executeRequest(mRequest);
- ...
- } finally {
- onExecutionComplete();
- }
- }
ActivityStarter.executeRequest
- private int executeRequest(Request request) {
- //调用 startActivityUnchecked
- mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession,
- request.voiceInteractor, startFlags, true /* doResume */, checkedOptions, inTask,
- restrictedBgActivity, intentGrants);
- return mLastStartActivityResult;
- }
ActivityStarter.startActivityUnchecked
- 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;
- try {
- //延时布局
- mService.deferWindowLayout();
- //执行startActivityInner
- result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor,
- startFlags, doResume, options, inTask, restrictedBgActivity, intentGrants);
- } finally {
- //恢复布局
- mService.continueWindowLayout();
- }
- return result;
- }
ActivityStarter.startActivityInner
- int startActivityInner() {
- if (mDoResume) {
- //ActivityRecord 记录着 Activity 信息
- final ActivityRecord topTaskActivity =
- mStartActivity.getTask().topRunningActivityLocked();
- if (!mTargetStack.isTopActivityFocusable()
- || (topTaskActivity != null && topTaskActivity.isTaskOverlay()
- && mStartActivity != topTaskActivity)) {
- mTargetStack.getDisplay().mDisplayContent.executeAppTransition();
- } else {
- //执行resumeFocusedStacksTopActivities
- mRootWindowContainer.resumeFocusedStacksTopActivities(
- mTargetStack, mStartActivity, mOptions);
- }
- }
- return START_SUCCESS;
- }
RootWindowContainer.resumeFocusedStacksTopActivities
- boolean resumeFocusedStacksTopActivities(
- ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
- //如果是栈顶Activity,启动resumeTopActivityUncheckedLocked
- if (targetStack != null && (targetStack.isTopStackInDisplayArea()
- || getTopDisplayFocusedStack() == targetStack)) {
- result = targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
- }
- if (!resumedOnDisplay) {
- //获取栈顶的 ActivityRecord
- final ActivityStack focusedStack = display.getFocusedStack();
- if (focusedStack != null) {
- //执行resumeTopActivityUncheckedLocked
- result |= focusedStack.resumeTopActivityUncheckedLocked(target, targetOptions);
- }
- }
- return result;
- }
ActivityStack.resumeTopActivityUncheckedLocked
- boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
- boolean result = false;
- try {
- mInResumeTopActivity = true;
- //执行resumeTopActivityInnerLocked,
- //最终调用到ActivityStackSupervisor.startSpecificActivity
- result = resumeTopActivityInnerLocked(prev, options);
- } finally {
- mInResumeTopActivity = false;
- }
- return result;
- }
ActivityStackSupervisor.startSpecificActivity
这个方法是关键方法,如果进程已经存在直接执行 realStartActivityLocked 去启动 Activity,进程不存在则通过AMS去创建 Socket,然后通知 Zygote 去 fork 进程。由于这里第一次创建,所以走到 startProcessAsync
- 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;
- //进程存在
- if (wpc != null && wpc.hasThread()) {
- try {
- //真正启动Activity方法
- 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 =ATMS
- mService.startProcessAsync(r, knownToBeDead, isTop, isTop ? "top-activity" : "activity");
- }
以上流程调用栈如图
创建Socket建立连接
ActivityTaskManagerService.startProcessAsync
- void startProcessAsync(ActivityRecord activity, boolean knownToBeDead, boolean isTop,
- String hostingType) {
- //执行startProcess
- final Message m = PooledLambda.obtainMessage(ActivityManagerInternal::startProcess,
- mAmInternal, activity.processName, activity.info.applicationInfo, knownToBeDead,
- isTop, hostingType, activity.intent.getComponent());
- mH.sendMessage(m);
-
- }
调用 startProcessLocked,然后到 Process 的 start,最终到 ZygoteProcess 的attemptUsapSendArgsAndGetResult 通过 Socket 通信,fork 一个新的 Launcher 进程,调用过程如图
ZygoteProcess.attemptZygoteSendArgsAndGetResult
通过 Socket 连接 Zygote 进程,把应用进程的一些参数写给前面连接的 zygote 进程
- private Process.ProcessStartResult attemptZygoteSendArgsAndGetResult(
- ZygoteState zygoteState, String msgStr) throws ZygoteStartFailedEx {
- try {
- final BufferedWriter zygoteWriter = zygoteState.mZygoteOutputWriter;
- final DataInputStream zygoteInputStream = zygoteState.mZygoteInputStream;
-
- zygoteWriter.write(msgStr);把应用进程的一些参数写给前面连接的zygote进程
- zygoteWriter.flush();//进入Zygote进程,处于阻塞状态
- //从socket中得到zygote创建的应用pid,赋值给 ProcessStartResult的对象
- Process.ProcessStartResult result = new Process.ProcessStartResult();
- result.pid = zygoteInputStream.readInt();
- result.usingWrapper = zygoteInputStream.readBoolean();
- return result;
- } catch (IOException ex) {
- zygoteState.close();
- }
- }
Zygote进程处理
ZygoteInit.main
- public static void main(String argv[]) {
- Runnable caller;
- if (startSystemServer) {
- //Zygote Fork出的第一个进程 SystmeServer
- Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);
-
- if (r != null) {
- r.run();
- return;
- }
- }
- //循环等待fork出其他的应用进程,比如Launcher
- caller = zygoteServer.runSelectLoop(abiList);
- ...
- if (caller != null) {
- caller.run(); //执行runSelectLoop返回的Runnable对象,进入子进程
- }
- }
ZygoteServer.runSelectLoop
- Runnable runSelectLoop(String abiList) {
- while (true) {
- int pollReturnValue;
- try {
- //epoll机制 循环
- pollReturnValue = Os.poll(pollFDs, pollTimeoutMs);
- } catch (ErrnoException ex) {
- throw new RuntimeException("poll failed", ex);
- }
- ...
- //来了消息后,调用processOneCommand()来进行进程的处理
- final Runnable command = connection.processOneCommand(this);
- }
- }
ZygoteConnection.processOneCommand
- Runnable processOneCommand(ZygoteServer zygoteServer) {
- //fork进程,得到新进程pid
- //pid=0 表示Zygote fork子进程成功
- //pid > 0 表示子进程 的真正的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 {
- //fork成功,第一次返回的pid = 0
- if (pid == 0) {
- return handleChildProc(parsedArgs, childPipeFd, parsedArgs.mStartChildZygote);
- } else {
- handleParentProc(pid, serverPipeFd);
- return null;
- }
- }
ZygoteConnection.handleChildProc
这里主要执行到 ZygoteInit.zygoteInit,zygoteInit 进行一些环境的初始化、启动Binder进程等操作,最终反射执行 ActivityThread.main
- private Runnable handleChildProc(ZygoteArguments parsedArgs,
- FileDescriptor pipeFd, boolean isZygote) {
- closeSocket();
- Zygote.setAppProcessName(parsedArgs, TAG);
- if (!isZygote) {
- //App进程将会调用到这里,最终反射执行ActivityThread.main
- return ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion,
- parsedArgs.mDisabledCompatChanges,
- parsedArgs.mRemainingArgs, null /* classLoader */);
- } else {
- return ZygoteInit.childZygoteInit(parsedArgs.mTargetSdkVersion,
- parsedArgs.mRemainingArgs, null /* classLoader */);
- }
-
- }
Zygote进程调用栈如图
ActivityThread中处理
Zygote fork出了 Launcher 的进程,并把接下来的 Launcher 启动任务交给了 ActivityThread 来进行,接下来我们就从 ActivityThread.main方法来分析 Launcher 的创建过程。
ActivityThread.main
创建 ActivityThread 对象,调用 attach 进行处理,最终进入 Looper 循环
- public static void main(String[] args) {
- Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");
- //创建主线程Looper
- Looper.prepareMainLooper();
- ActivityThread thread = new ActivityThread();
- //执行attach
- thread.attach(false, startSeq);
- //开启循环
- Looper.loop();
- throw new RuntimeException("Main thread loop unexpectedly exited");
- }
ActivityThread.attach
- private void attach(boolean system, long startSeq) {
-
- RuntimeInit.setApplicationObject(mAppThread.asBinder());
- final IActivityManager mgr = ActivityManager.getService();
- try {
- //应用的句柄发给AMS,从而使AMS可以管理新进程
- mgr.attachApplication(mAppThread, startSeq);
- } catch (RemoteException ex) {
- throw ex.rethrowFromSystemServer();
- }
-
- }
ActivityManagerService.attachApplication
- public final void attachApplication(IApplicationThread thread, long startSeq) {
- if (thread == null) {
- throw new SecurityException("Invalid application interface");
- }
- synchronized (this) {
- //通过Binder获取传入的pid信息
- int callingPid = Binder.getCallingPid();
- final int callingUid = Binder.getCallingUid();
- final long origId = Binder.clearCallingIdentity();
- //执行attachApplicationLocked
- attachApplicationLocked(thread, callingPid, callingUid, startSeq);
- Binder.restoreCallingIdentity(origId);
- }
- }
ActivityManagerService.attachApplicationLocked
调用ATM的 attachApplication(),最终层层调用到 ActivityStackSupervisor 的 realStartActivityLocked,真正准备去启动Activity。
- private final boolean attachApplicationLocked(IApplicationThread thread,
- int pid, int callingUid, long startSeq) {
- //如果当前的Application记录仍然依附到之前的进程中,则清理掉
- if (app.thread != null) {
- handleAppDiedLocked(app, true, true);
- }
- if (normalMode) {
- //调用ATM的attachApplication(),最终层层调用到ActivityStackSupervisor.java的 realStartActivityLocked()
- didSomething = mAtmInternal.attachApplication(app.getWindowProcessController());
- }
- return true;
- }
ActivityThread调用栈如图
