4 SystemServer 创建过程
SystemServer 进程非常关键了,我们上层的服务都是在这里以线程的形式存在,比如 AMS,PMS,WindowManagerService,壁纸服务,而关于调试这个服务进程,我们随后就会讲到。
我们检索下这个代码
找到实现的位置在这里。
创建完成,初始化完成,我们会进入到第二阶段,这个是在 ZygoteInit 的子进程中触发,具体代码是:
然后加载类,进入
这里重点是 RuntimeInit.applicationInit,参数是 com.android.server.SystemServer,于是进入了正式的 main 方法。
也 就 是 我 们 看 了 一 圈 , 主 要 是 设 置 , 创 建 的 过 程 , 下 来 就 是 它 的 正 式 流 程 了 。
/frameworks/base/services/java/com/android/server/ 下的 SystemServer.java
这里我们会加载 so 库,这里专门讲下,一个 so 库被加载的时候,会自动调用它的 onLoad方法
我们这里的 android_servers 编译的位置在
我们继续往下看,后面创建了 SystemServiceManager,后面的创建服务,以及一些系统回调,都是在这里响应的。
这里就遇见了关键的方法,执行启动各类服务,然后如果在这里启动失败的话,是可以看到有异常 Log,而且这里是可以设置断点的。因为虚拟机创建好后,调试就已经开始可用了。
于是服务启动的时候,可以在这里设置断点,分析启动代码。
也就是 PMS 的启动代码,是可以断点跟进学习的,这是我想说的信息。
startBootstrapServices 启动系统 Boot 级服务,我们的 PackageManagerService 在这里,AMS 也在这里。
startCoreServices 启动其他核心服务,比如 BatteryService。
startOtherServices 启动其他服务 比如 WindowManagerService,BluetoothService 和PinnerService,PinnerService 这个是 systemUI 会使用的一个服务。
每个服务会注册一个 SystemReady 的方法,在服务启动完成后触发后续的动作,而 AMS 完成的时候,会启动关键的一个界面,就是 SystemUI,这里方法是 startSystemUi(context, windowManagerF);
我们后面会讲到 SystemUI,虽然很特殊,但是依据规则,跟踪分析还是很好处理 systemUI的问题的。我们下来先分析下 AMS 的启动过程。
而 ActivityManagerServices 完成 SystemReady 这时候也会启动我们的桌面,调用的是startHomeActivityLocked,这样子我们就知道启动的时候都有的界面了。
锁屏,状态栏这些,是在 SystemUI 里面的,解锁后的桌面就是 startHomeActivityLocked 启动的。