android 开机启动流程分析(16)Launcher启动

该系列文章总纲链接:专题分纲目录 android 开机启动流程分析


本章关键点总结 & 说明:

这里因为整体的导图太大,因此截取一部分 ,方便大家看的清楚:

在上图中关注➕“launcher启动”部分即可。同时,下面的图是开机启动流程分析 持续迭代的效果,可放大观看。

在SystemServer启动后,SystemServer又启动了AMS,同时在SystemServer中关键方法 startOtherServices 中

private void startOtherServices() {
		//...
		final AudioService audioServiceF = audioService;
        mActivityManagerService.systemReady(new Runnable() {//这里会回调
            @Override
            public void run() {
                Slog.i(TAG, "Making services ready");
                mSystemServiceManager.startBootPhase(
                        SystemService.PHASE_ACTIVITY_MANAGER_READY);

                try {
                    mActivityManagerService.startObservingNativeCrashes();
                } catch (Throwable e) {
                    reportWtf("observing native crashes", e);
                }

                Slog.i(TAG, "WebViewFactory preparation");
                WebViewFactory.prepareWebViewInSystemServer();

                try {
                    startSystemUi(context);
                } catch (Throwable e) {
                    reportWtf("starting System UI", e);
                }
				//...
                try {
                    if (mmsServiceF != null) mmsServiceF.systemRunning();
                } catch (Throwable e) {
                    reportWtf("Notifying MmsService running", e);
                }
            }
       });	

1 这里专注AMS的SystemReady方法,实现如下:

public void systemReady(final Runnable goingCallback) {
        synchronized(this) {
            if (mSystemReady) {
                // If we're done calling all the receivers, run the next "boot phase" passed in
                // by the SystemServer
                if (goingCallback != null) {
                    goingCallback.run();
                }
                return;
            }
			//...
			/**startHomeActivityLocked调用栈
				mStackSupervisor.startHomeActivity(intent, aInfo, reason);
					moveHomeStackTaskToTop
					startActivityLocked,这里接下来启动Activity的启动流程
			*/
			startHomeActivityLocked(mCurrentUserId, "systemReady");
			//...
		}
	}

这里在startHomeActivityLocked之后 便开始 执行 Activity的启动流程了,因为这里涉及的函数调用层数比较多,这里整理了一下startHomeActivityLocked的调用栈,如下所示:

/**startHomeActivityLocked调用栈*/
	ActivityStackSupervisor:
	mStackSupervisor.startHomeActivity(intent, aInfo, reason);
	    moveHomeStackTaskToTop->startActivityLocked,这里接下来启动Activity的启动流程
			startActivityUncheckedLocked
			resumeTopActivityLocked
	-------------------------------------------------------
	ActivityStack:->targetStack.startActivityLocked
		mStackSupervisor.resumeTopActivitiesLocked
			targetStack.resumeTopActivityLocked
			    resumeTopActivityInnerLocked
	---------------------------------------
	ActivityStackSupervisor:
		mStackSupervisor.startSpecificActivityLocked
			mService.getProcessRecordLocked
			realStartActivityLocked
			mService.startProcessLocked //创建 ActivityThread线程

 在这里,最后 调用的 startProcessLocked方法,目的就是 创建ActivityThread线程

2 创建ActivityThread线程流程如下:

mService.startProcessLocked //创建 ActivityThread线程
	Process.start
		startViaZygote
			zygoteSendArgsAndGetResult

3 最后在ActivityThread 启动后,执行main方法,分析如下

public static void main(String[] args) {
        SamplingProfilerIntegration.start();
        CloseGuard.setEnabled(false);

        Environment.initForCurrentUser();

        // Set the reporter for event logging in libcore
        EventLogger.setReporter(new EventLoggingReporter());
        Security.addProvider(new AndroidKeyStoreProvider());
		
        // Make sure TrustedCertificateStore looks in the right place for CA certificates
        final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
        TrustedCertificateStore.setDefaultUserDirectory(configDir);
		
        Process.setArgV0("<pre-initialized>");
		//创建looper对象,与本线程绑定,在activity或service或dialog中可以随便使用handler是这个线程在后台
        Looper.prepareMainLooper();
		//创建ActicityThread对象实例,当new ActivityThread()进行时,其成员变量ApplicationThread同时被创建
        ActivityThread thread = new ActivityThread();
		/**进行attach回调,调用栈如下:
			mgr.attachApplication(mAppThread); 
			这里走的是binder通信->call AMS:attachApplication->attachApplicationLocked
		*/
        thread.attach(false);
        if (sMainThreadHandler == null) {
            sMainThreadHandler = thread.getHandler();
        }
        if (false) {
            Looper.myLooper().setMessageLogging(new
                    LogPrinter(Log.DEBUG, "ActivityThread"));
        }
        Looper.loop();
        throw new RuntimeException("Main thread loop unexpectedly exited");
    }

4 这里最为关键的一个步骤是attach,这里详细分析下:

   private final boolean attachApplicationLocked(IApplicationThread thread, int pid) {
        ProcessRecord app;
        if (pid != MY_PID && pid >= 0) {
            synchronized (mPidsSelfLocked) {
                app = mPidsSelfLocked.get(pid);
            }
        } else {
            app = null;
        }
		//...
        app.makeActive(thread, mProcessStats);
        //...
        try {
            //...
            thread.bindApplication(processName, appInfo, providers, app.instrumentationClass,
                    profilerInfo, app.instrumentationArguments, app.instrumentationWatcher,
                    app.instrumentationUiAutomationConnection, testMode, enableOpenGlTrace,
                    isRestrictedBackupMode || !normalMode, app.persistent,
                    new Configuration(mConfiguration), app.compat,
                    getCommonServicesLocked(app.isolated),
                    mCoreSettingsObserver.getCoreSettingsLocked());
            updateLruProcessLocked(app, false, null);
            app.lastRequestedGc = app.lastLowMemory = SystemClock.uptimeMillis();
        } catch (Exception e) {
            // ...
            return false;
        }
        //...
        // See if the top visible activity is waiting to run in this process...
        if (normalMode) {
            try {
                if (mStackSupervisor.attachApplicationLocked(app)) {
                    didSomething = true;
                }
            } catch (Exception e) {
                //...
            }
        }
		//...
        return true;
    }

这里代码做了大部分的删减,主要表明这里做了4件事情,分别是

  1.     PID->ProcessRecord
  2.     thread->注册app记录
  3.     thread与PID绑定
  4.     call mStackSupervisor.attachApplicationLocked->realStartActivityLocked

通过attach,ActivityThread的ApplicationThread.scheduleResumeActivity触发显示,到此 Launcher 的Activity也就启动并显示出来了

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android系统在启动过程中,会依次启动各个系统服务,其中也包括Launcher服务。LauncherAndroid系统的桌面显示服务,它负责管理并显示设备的主屏幕和应用程序列表。Launcher服务在Android系统的最后阶段启动,即在主界面启动之前。 当设备完成各个系统服务的启动,并且系统进入正常运行状态时,Launcher服务会被启动。系统启动时,先启动底层服务如Zygote进程、SystemServer进程等,然后再启动Android应用进程。Launcher服务作为最基本的应用程序之一,需要在其他应用程序之前加载,以确保用户可以正常使用设备的主屏幕。 Launcher服务的启动主要通过系统服务管理器来实现。系统服务管理器负责管理Android系统的各项服务,并按照事先定义好的优先级顺序启动服务。在启动Launcher服务时,系统服务管理器会调用相应的启动函数,加载Launcher相关的资源和配置文件,并开始监控用户对桌面的操作。 一旦Launcher服务启动成功,就会显示设备的主屏幕,并加载应用程序列表。通过Launcher服务,用户可以查看和管理设备上已安装的应用程序,并快捷地启动它们。同时,Launcher服务还提供了桌面小部件、壁纸等个性化设置,使用户可以自定义设备的外观和功能。 总而言之,Android系统的Launcher服务在启动过程的最后阶段启动,它管理和显示设备的主屏幕和应用程序列表,为用户提供方便的桌面操作和个性化设置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图王大胜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值