前言:
现时你们对“android 服务器”大致比较着重,小伙伴们都想要剖析一些“android 服务器”的相关内容。那么小编同时在网摘上汇集了一些对于“android 服务器””的相关内容,希望朋友们能喜欢,咱们一起来学习一下吧!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多行。
标签: #android 服务器