首页 > 科技 > 安卓系统最重要的进程之一:system_server详细分析

安卓系统最重要的进程之一:system_server详细分析

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

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

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

3 system_server启动过程

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4 SystemServiceManager

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

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

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

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

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

5 各种系统服务

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

关键服务:

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

核心服务:

其他服务:

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

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

本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.souzhinan.com/kj/269957.html