安卓系统保留几个进程 安卓系统最重要的进程之一(1)

1 概述

SystemServer是android系统的系统服务进程。属于系统级别,其它服务进程都是应用级别。它也是android系统的唯一一个系统服务进程。

SystemServer进程的名字是system_server,由父进程zygote fork()而来。可以通过ps查看system_server的PPID(Parent Process ID)刚好是zygote进程的PID(Process ID)。

SystemServer进程里面主要有三块内容:android_servers、framework资源、各种系统服务。

1)android_servers是指动态链接库libandroid_servers.so。android_servers是jni层。源码位于frameworks/base/services/core/jni/路径下。是服务的java端和C端衔接的地方。

2)framework资源,创建上下文的时候,会加载framework-res.apk。framework-res.apk是一个资源型APK,只有资源,没有逻辑。源码位于frameworks/base/core/res/。最后生成到system/framework/framework-res.apk。

3)各种系统服务,android的系统服务非常多,有上百个。其中关键服务ActivityManagerService、PowerManagerService、LightsService、DisplayManagerService、PackageManagerService、WindowManagerService、InputManagerService、NetworkManagerService等。源码位于frameworks/base/services/core/java/路径下。

2 system_server前置启动过程

system_server进程是在zygote进程启动的时候,由zygote进程fork而来。

frameworks/base/cmds/app_process/app_main.cpp

安卓系统保留几个进程 安卓系统最重要的进程之一(2)

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

安卓系统保留几个进程 安卓系统最重要的进程之一(3)

安卓系统保留几个进程 安卓系统最重要的进程之一(4)

至此,粗略的回顾了一下,需要详细信息的请参见前面的文章。下面进入system_server进程的实际逻辑。

3 system_server启动过程

主流程代码位于下面的路径。直接去看入口函数main()。

frameworks/base/services/java/com/android/server/Systemserver.java

安卓系统保留几个进程 安卓系统最重要的进程之一(5)

创建匿名对象,然后调用run()方法。下面开始分析run()方法,run()方法就是system_server进程的主流程。

安卓系统保留几个进程 安卓系统最重要的进程之一(6)

第一步检查并设置系统时间。因为如果系统时间在1970年以前,很多Java API会崩溃。所以这里首先检查系统时间,如果小于1970年,就设置系统时间为1970年。正常情况下,后面cell tower或NTP会纠正系统时间。

安卓系统保留几个进程 安卓系统最重要的进程之一(7)

这里是系统语言和地区的检查设置。

安卓系统保留几个进程 安卓系统最重要的进程之一(8)

从虚拟机运行时取得虚拟机库,设置属性persist.sys.dalvik.vm.lib.2。

安卓系统保留几个进程 安卓系统最重要的进程之一(9)

内存设置。system_server作为核心进程,并且需要持续在后台运行。清除内存限制,提高效率。

安卓系统保留几个进程 安卓系统最重要的进程之一(10)

安卓系统保留几个进程 安卓系统最重要的进程之一(11)

检查fingerprint属性并设置。如果没有预先设置fingerprint属性,这里会根据下面的属性生成一个fingerprint的值,然后设置。

安卓系统保留几个进程 安卓系统最重要的进程之一(12)

提高binder calls的优先级,是其为前台优先级。设置最大binder线程数为31个。

安卓系统保留几个进程 安卓系统最重要的进程之一(13)

设置本线程优先级为前台优先级,不允许设置优先级为后台。同时,创建主线程的Looper。

安卓系统保留几个进程 安卓系统最重要的进程之一(14)

加载动态链接库libandroid_servers.so。这个库是系统服务和native进行交互的jni层生成的。

安卓系统保留几个进程 安卓系统最重要的进程之一(15)

创建上下文context,并设置system_server进程的默认主题。

安卓系统保留几个进程 安卓系统最重要的进程之一(16)

创建systemservicemanager,顾名思义,它是用来管理系统服务systemservice的。并把它添加到LocalService。在第四节详细分析。

安卓系统保留几个进程 安卓系统最重要的进程之一(17)

启动系统服务。在第五节详细分析。

安卓系统保留几个进程 安卓系统最重要的进程之一(18)

进入消息循环,Looper的无限循环。

安卓系统保留几个进程 安卓系统最重要的进程之一(19)

消息循环异常退出的时候,会抛出这个异常,意味着system_server进程死掉了。

4 SystemServiceManager

管理系统服务的创建、启动和生命周期事件。

这个类比较小,整个文件就250行。关键成员变量是mServices,是SystemService的列表,每个注册的系统服务,都会在这个列表里面存在instance。

SystemServiceManager是一个管理类Manager。使用列表ArrayList数据结构来存储系统服务的实例。

系统服务都会继承基类SystemService,抽象类SystemService里面定义了系统服务的框架方法。

系统服务管理者SystemServiceManager会在系统启动/运行的不同阶段,调用系统服务们的不同方法。

5 各种系统服务

运行在system_server进程里面的系统服务分为三类:关键服务、核心服务、其它服务。

关键服务:

安卓系统保留几个进程 安卓系统最重要的进程之一(20)

已上都是binder service,还有一个local service 叫light service。

核心服务:

安卓系统保留几个进程 安卓系统最重要的进程之一(21)

其他服务:

安卓系统保留几个进程 安卓系统最重要的进程之一(22)

这里的注解给人以遐想:开始处理一大堆尚未重构和整理的东西。

这一阶段启动的服务非常多:振动器服务、挂载服务、网络管理服务、网络状态服务、连接服务、网络评分服务、nsd服务、窗口管理服务、串号服务、网络时间更新服务、common time管理服务、输入管理服务、TelephonyRegistry、ConsumerIsService、MmsServiceBroker、硬件属性管理服务、SchedulingPolicyService、CameraService、账户管理服务、ContentService、闹钟服务、VR管理服务等等上百个服务。startOtherService()方法有1000多行。

,