首页 > 其他分享 >SystemUI启动流程

SystemUI启动流程

时间:2022-09-05 19:55:16浏览次数:80  
标签:启动 流程 SystemUI public void android com systemui

SystemUI启动流程

  1. frameworks\base\services\java\com\android\server\SystemServer.java

    public final class SystemServer { 
       private static final TimingsTraceLog BOOT_TIMINGS_TRACE_LOG;
       private SystemServiceManager mSystemServiceManager;
       
    public static void main(String[] args) {
          new SystemServer().run();
      }
    private void run() {
          ...
           // Start services.
           try {
          startBootstrapServices();
          }catch(){...}
      }
       
       private void startBootstrapServices() {
          ...
           // TODO: Might need to move after migration to WM.
         ActivityTaskManagerService atm =
           mSystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class).getService();
           mActivityManagerService = ActivityManagerService.Lifecycle.startService(
                   mSystemServiceManager, atm);
           mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
           mActivityManagerService.setInstaller(installer);
           mWindowManagerGlobalLock = atm.getGlobalLock();
           traceEnd();
      }

    }
    mActivityManagerService.systemReady(() -> {
       traceBeginAndSlog("StartSystemUI");
               try {
                   startSystemUi(context, windowManagerF);
              } catch (Throwable e) {
                   reportWtf("starting System UI", e);
              }
               traceEnd();
    },BOOT_TIMINGS_TRACE_LOG);
                                       
     
    //正式启动SystemUi 入口:com.android.systemui.SystemUIService.java
       private static void startSystemUi(Context context, WindowManagerService windowManager) {
           Intent intent = new Intent();
           intent.setComponent(new ComponentName("com.android.systemui","com.android.systemui.SystemUIService"));
           intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
           //Slog.d(TAG, "Starting service: " + intent);
           context.startServiceAsUser(intent, UserHandle.SYSTEM);
           windowManager.onSystemUiStarted();
      }
     
  1. 启动SystemUIService: com.android.systemui.SystemUIService.java

    public class SystemUIService extends Service {

       @Override
       public void onCreate() {
           super.onCreate();    
          ((SystemUIApplication)getApplication()).startServicesIfNeeded();
          }
    }
           
  2. com.android.systemui.SystemUIApplication.java

    public class SystemUIApplication extends Application implements SysUiServiceProvider {
       private SystemUI[] mServices;
       
        @Override
       public void onCreate() {
           super.onCreate();
            SystemUIFactory.createFromConfig(this);
      }
    public void startServicesIfNeeded() { //系统服务(SystemUiservice启动时执行该方法
           String[] names = getResources().getStringArray(R.array.config_systemUIServiceComponents);
           startServicesIfNeeded(names);
      }
       private void startServicesIfNeeded(String[] services) {
      mServices = new SystemUI[services.length];
           final int N = services.length;
           //反射机制,获取SysUI对象,对象列表所在数组:R.array.config_systemUIServiceComponents

           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);
                   Object o = cls.newInstance();
                   if (o instanceof SystemUI.Injector) {
                       o = ((SystemUI.Injector) o).apply(this);
                  }
                   mServices[i] = (SystemUI) o;//Dependency$DependencyCreator+NotificationChannels.java
              }catch(){..}
               mServices[i].mContext = this;
               mServices[i].mComponents = mComponents;
               mServices[i].start();//反射结果.start() //SysUI组件extends SystemUI ,通过start()方法启动
             
          }
           //添加插件:OverLayPlugin.java
           Dependency.get(PluginManager.class).addPluginListener(..,OverlayPlugin.class, true)
      }
    }
  3. SystemUI子类,入口:start()

    1. NotificationChannels.java
    public class NotificationChannels extends SystemUI {
       public Context mContext;
       
    @Override
       public void start() {
           createAll(mContext);
      }
    }
    2.KeyguardViewMediator.java
    public class KeyguardViewMediator extends SystemUI {
        @Override
       public void start() {
           synchronized (this) {
               setupLocked();
          }
           putComponent(KeyguardViewMediator.class, this);
      }
    }
    .....    
  4. 通过反射获取的SystemUI子类:xml文件中的数组

    <!-- SystemUI Services: The classes of the stuff to start. -->
    <string-array name="config_systemUIServiceComponents" translatable="false">
    <item>com.android.systemui.Dependency$DependencyCreator</item>  //依赖
           <item>com.android.systemui.util.NotificationChannels</item>  //创建SystemUI的通知Channel
           <item>com.android.systemui.statusbar.CommandQueue$CommandQueueStart</item>
           <item>com.android.systemui.keyguard.KeyguardViewMediator</item>  
           <item>com.android.systemui.recents.Recents</item> //最近任务
           <item>com.android.systemui.volume.VolumeUI</item>  //音量面板
           <item>com.android.systemui.stackdivider.Divider</item> //分屏
           <item>com.android.systemui.SystemBars</item>
            <item>com.android.systemui.usb.StorageNotification</item> //存储设备相关通知
           <item>com.android.systemui.power.PowerUI</item>   //低电量提醒
           <item>com.android.systemui.media.RingtonePlayer</item>   //手机铃声
           <item>com.android.systemui.keyboard.KeyboardUI</item>  //键盘
           <item>com.android.systemui.pip.PipUI</item> //画中画
           <item>com.android.systemui.shortcut.ShortcutKeyDispatcher</item>
           <item>@string/config_systemUIVendorServiceComponent</item>
           <item>com.android.systemui.util.leak.GarbageMonitor$Service</item> //定期检查SystemUI堆内存并报告
           <item>com.android.systemui.LatencyTester</item> // 在DEBUGGABLE版本运行,用于测试系统中的延迟
           <item>com.android.systemui.globalactions.GlobalActionsComponent</item> // 关机菜单
           <item>com.android.systemui.ScreenDecorations</item> //手机屏幕屏切圆角,模拟刘海屏
           <item>com.android.systemui.biometrics.BiometricDialogImpl</item>
           <item>com.android.systemui.SliceBroadcastRelayHandler</item>
           <item>com.android.systemui.SizeCompatModeActivityController</item>
           <item>com.android.systemui.statusbar.notification.InstantAppNotifier</item>  //显示Instant Apps(用户设备不需要安装的应用)的通知
           <item>com.android.systemui.theme.ThemeOverlayController</item>
           
       </string-array>
  5.  

标签:启动,流程,SystemUI,public,void,android,com,systemui
From: https://www.cnblogs.com/a-n-yan/p/16659357.html

相关文章

  • 流程控制
    流程控制​流程控制主要有三种结构,分别是顺序结构、分支结构、循环结构,这三种结构代表三种代码执行的顺序顺序流程控制​顺序结构是程序中最简单、最......
  • zabbix监控配置流程
    zabbix监控配置流程管理层次:开发人员要加监控,需要让其提供监控指标运营人员要加监控,让其找开发要监控指标运维人员要加监控,让运营人员去找开发要监控指标。配置层次:......
  • vuex使用流程
     从状态出发,将状态提供给vue组件,组件在actions的方法中请求后端接口得到数据,然后委托给mutations(或者通过开发者工具进行更改),来改变状态。 ......
  • Handler的基本使用和工作流程
    一、Handler的基本使用Handler一套Android消息传递机制,在多线程的应用场景中,将工作线程中需更新UI的操作信息传递到UI主线程,从而实现工作线程对UI的更新处理,最终实现异......
  • MBR硬盘丢失UEFI启动项的问题
    MBR硬盘丢失UEFI启动项的问题现象描述:联想笔记本电脑,MBR硬盘有一个FAT32分区,UEFI启动的时候,UEFI的引导项bootx64.efi,bootmgfw.efi总是时不时地丢失。解决办法:用傲梅分区助......
  • Unreal引擎启动流程及耗时分析
    引擎版本:4.18部分耗时流程结构概述:Winmain └GuardedMain └EnginePreInit └FEngineLoop::PreInit └LoadPreInitModules() └AppInit() └Proces......
  • pm2 开机自启动项目
    1、首先在项目根目录使用pm2启动项目```jspm2start./dist/main.js```2、生成开机启动pm2服务的配置文件运行:pm2startup命令,会生成以下命令```jsTosetu......
  • ENVI自动配准流程化工具的另类用法
    这里说的另类用法是指:只想利用自己手动添加的同名点用于图像配准,而不希望工具自动找点。这种需求一般用于无法自动找点的情况,比如卫星图像与DRG之类的线划图进行配准时。......
  • MySQL安装流程
    一、下载MySQL  Mysql官网下载地址:https://downloads.mysql.com/archives/installer/  1.选择想要安装的版本,点击Download下载  本篇文章选择的是......
  • zabbix监控配置流程
    1.0zabbix监控配置流程详细管理角度:开发由开发人员提供监控指标来监控运营让其找开发要监控指标运维直接加配置角度:创建主机创建主机组并加入主机添加监控......