0


Android 10.0 SystemUI启动流程

1、手机开机后,Android系统首先会创建一个Zygote(核心进程)。
2、由Zygote启动SystemServer。
3、SystemServer会启动系统运行所需的众多核心服务和普通服务、以及一些应用及数据。例如:SystemUI 启动就是从 SystemServer 里启动的。
4、进入锁屏界面,开机完成。

SystemServer 中有一个 main()方法为系统服务的入口;
frameworks/base/services/java/com/android/server/SystemServer.java

/**
     * The main entry point from zygote.
     */publicstaticvoidmain(String[] args){newSystemServer().run();}

在SystemServer 中的 main()方法中,就一句代码生成 SystemServer 对象,执行run 方法。在run()方法里启动了各类服务;
frameworks/base/services/java/com/android/server/SystemServer.java

privatevoidrun(){//省略部分代码// Start services.try{traceBeginAndSlog("StartServices");startBootstrapServices();startCoreServices();startOtherServices();// 在该方法里启动了 SystemUI的服务。SystemServerInitThreadPool.shutdown();}catch(Throwable ex){Slog.e("System","******************************************");Slog.e("System","************ Failure starting system services", ex);throw ex;}finally{traceEnd();}//省略部分代码}privatevoidstartOtherServices(){//省略部分代码
    t.traceBegin("StartSystemUI");try{startSystemUi(context, windowManagerF);}catch(Throwable e){reportWtf("starting System UI", e);}
     t.traceEnd();//省略部分代码}privatestaticvoidstartSystemUi(Context context,WindowManagerService windowManager){PackageManagerInternal pm =LocalServices.getService(PackageManagerInternal.class);Intent intent =newIntent();
     intent.setComponent(pm.getSystemUiServiceComponent());
     intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);//Slog.d(TAG, "Starting service: " + intent);
     context.startServiceAsUser(intent,UserHandle.SYSTEM);
     windowManager.onSystemUiStarted();}

SystemServer执行流程图:

SystemUi进入到SystemUIService的onCreate()方法里;在onCreate()方法中获得 SystemUIApplication 对象并调用其 startServicesIfNeeded() 方法
frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIService.java

@OverridepublicvoidonCreate(){super.onCreate();// Start all of SystemUI((SystemUIApplication)getApplication()).startServicesIfNeeded();// 省略部分代码...}/**
     * Makes sure that all the SystemUI services are running. If they are already running, this is a
     * no-op. This is needed to conditinally start all the services, as we only need to have it in
     * the main process.
     * <p>This method must only be called from the main thread.</p>
     */publicvoidstartServicesIfNeeded(){String[] names =getResources().getStringArray(R.array.config_systemUIServiceComponents);startServicesIfNeeded(names);}

在SystemUIApplication中查看startServicesIfNeeded() 方法,其中其中 config_systemUIServiceComponents 值在frameworks/base/packages/SystemUI/res/values/config.xml 里:
frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java

privatevoidstartServicesIfNeeded(String[] services){if(mServicesStarted){return;}
    mServices =newSystemUI[services.length];if(!mBootCompleted){// check to see if maybe it was already completed long before we began// see ActivityManagerService.finishBooting()if("1".equals(SystemProperties.get("sys.boot_completed"))){
            mBootCompleted =true;if(DEBUG)Log.v(TAG,"BOOT_COMPLETED was already sent");}}Log.v(TAG,"Starting SystemUI services for user "+Process.myUserHandle().getIdentifier()+".");TimingsTraceLog log =newTimingsTraceLog("SystemUIBootTiming",Trace.TRACE_TAG_APP);
    log.traceBegin("StartServices");finalintN= services.length;for(int i =0; i <N; i++){String clsName = services[i];if(DEBUG)Log.d(TAG,"loading: "+ clsName);
        log.traceBegin("StartServices"+ clsName);long ti =System.currentTimeMillis();Class cls;try{
            cls =Class.forName(clsName);
            mServices[i]=(SystemUI) cls.newInstance();}catch(ClassNotFoundException ex){thrownewRuntimeException(ex);}catch(IllegalAccessException ex){thrownewRuntimeException(ex);}catch(InstantiationException ex){thrownewRuntimeException(ex);}
        mServices[i].mContext =this;
        mServices[i].mComponents = mComponents;if(DEBUG)Log.d(TAG,"running: "+ mServices[i]);
        mServices[i].start();
        log.traceEnd();//省略其他代码}}

可以看到 startServicesIfNeeded() 循环 start 了config_systemUIServiceComponents 里的 Service,这些服务不是四大组件之一的 Service, 而是继承自 SystemUI 接口的服务,我们称之为 SystemUI服务。
到此SystemUI 启动流程分析完毕。

标签: android

本文转载自: https://blog.csdn.net/u010345983/article/details/134181653
版权归原作者 龙之叶 所有, 如有侵权,请联系我们删除。

“Android 10.0 SystemUI启动流程”的评论:

还没有评论