在平时的开发中或多或少会了解过ActivityManagerService,WindowManagerService,PowerManagerService等服务,那你有想过这些服务如何产生的吗,它们运行在哪呢?我们是如何获取到这些服务的呢?要想了解这些就要看System Server进程了
本篇博客源码基于API24
System Server进程和Zygote进程可以说是Android世界中的两大最重要的进程,离开其中之一基本上系统就玩完了(这里还有一个Media Server进程,是由init进程fork而来,负责启动和管理整个C++ framework,包含AudioFlinger,Camera Service等服务);System Server负责启动和管理整个framework,基本上在Framework中的大多数服务都是在system server进程中以一个线程的方式存在的,比如平时开发接触比较多的ActivityManagerService,PackageManagerService ,WindowManagerService等。
System Server进程的进程名是system_server,大家可以通过adb shell ps查看当前手机存在的进程信息,可以看到这几条
USER PID PPID VSIZE RSS WCHAN PC NAME
root 1 0 9048 1012 ffffffff 00000000 S /init
root 349 1 2118552 17464 ffffffff 00000000 S zygote64
root 350 1 1526172 16800 ffffffff 00000000 S zygote
system 793 349 2792784 109876 ffffffff 00000000 S system_server
最后一条就是system server进程信息
System Server进程是由Zygote进程fork出来的,至于如何被Zygote进程fork出来的可以参考下面博客,本篇文章介绍Java层的工作原理
Android系统启动流程概述 init进程启动 zygote进程启动 system server进程启动
zygote进程fork成功后,会反射调用SystemServer.main()方法,至此进入system server进程的工作空间
public static void main(String[] args) {
new SystemServer().run();
}
private void run() {
try {
//若当前时间小于1970年1月1日,那就设置为1970年1月1日
if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
}
//设置系统的语言环境
if (!SystemProperties.get("persist.sys.language").isEmpty()) {
final String languageTag = Locale.getDefault().toLanguageTag();
SystemProperties.set("persist.sys.locale", languageTag);
SystemProperties.set("persist.sys.language", "");
SystemProperties.set("persist.sys.country", "");
SystemProperties.set("persist.sys.localevar", "");
}
//变更虚拟机的库文件,对于Android 6.0默认采用的是libart.so
SystemProperties.set("persist.sys.dalvik.vm.lib.2", VMRuntime.getRuntime().vmLibrary());
//清除vm内存增长上限,由于启动过程需要较多的虚拟机内存空间
VMRuntime.getRuntime().clearGrowthLimit();
//设置内存的可能有效使用率为0.8
VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
// 针对部分设备依赖于运行时就产生指纹信息,因此需要在开机完成前已经定义
Build.ensureFingerprintProperty();
//访问环境变量前,需要明确地指定用户
Environment.setUserRequired(true);
// Within the system server, any incoming Bundles should be defused
// to avoid throwing BadParcelableException.
BaseBundle.setShouldDefuse(true);
//确保当前系统进程的binder调用,总是运行在前台优先级(foreground priority)
BinderInternal.disableBackgroundScheduling(true);
// 增加system_server中的binder线程数
BinderInternal.setMaxThreads(sMaxBinderThreads);
// 创建主线程looper 在当前线程运行
android.os.Process.setThreadPriority(
android.os.Process.THREAD_PRIORITY_FOREGROUND);
android.os.Process.setCanSelfBackground(false);
Looper.prepareMainLooper();
//初始化android_servers库
System.loadLibrary("android_servers");
//检测上次关机过程是否失败
performPendingShutdown();
//初始化系统上下文
//初始化系统上下文对象mSystemContext,并设置默认的主题,mSystemContext实际上是一个ContextImpl对象。
//调用ActivityThread.systemMain()的时候,会调用ActivityThread.attach(true),而在attach()里面,则创建了Application对象,并调用了Application.onCreate()。
createSystemContext();
//创建系统服务管理
mSystemServiceManager = new SystemServiceManager(mSystemContext);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
//启动各种系统服务
try {
//引导服务
startBootstrapServices();
//核心服务
startCoreServices();
//其它服务
startOtherServices();
} catch (Throwable ex) {
throw ex;
} finally {
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
//开启消息循环
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
这个main方法做了很多事情:设置系统时间,设置语言环境,设置虚拟机内存,设置binder线程数,初始化Loop,加载运行库等
除了这些操作外,接下来继续往下看main方法后半段
private Context mSystemContext;
private void createSystemContext() {
ActivityThread activityThread = ActivityThread.systemMain();
mSystemContext = activityThread.getSystemContext();
mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
}
没想到啊,原来System Server中也有Context对象,这个方法就是初始化system context;可能有人不太理解Context到底是个什么玩意
Context英文原意是上下文的意思,在平时开发中涉及到的四大组件及资源操作基本上都离不开Context对象;你可以想象它是一团神秘的漂浮的物质,在一个生活场景中,不管你在哪,在干什么,你都可以通过这团神秘物质获取到一些属于这个场景的隐性信息
比如你在吃一条鱼这个场景,你能知道的就是这条鱼多大,多好吃,但是假如你有Context这个上下文信息,你就能获取到更多信息,比如鱼的重量,鱼的种类,鱼的年龄等,用代码表示就是Context.getFishType(),你就知道这条鱼的种类了
这就是上下文的意思,某一个场景下一些隐藏的信息
其实Context家族很复杂,Context本身是一个抽象类,而ContextImpl,ContextWrapper,Activity,Service,Application等都是它的直接或间接子类
接下来我们看下方法后续调用
public static ActivityThread systemMain() {
// 低内存设备上的系统进程无法使用硬件加速绘图,因为这会给进程增加太多开销
if (!ActivityManager.isHighEndGfx()) {
ThreadedRenderer.disable(true);
} else {
ThreadedRenderer.enableForegroundTrimming();
}
ActivityThread thread = new ActivityThread();
thread.attach(true);
return thread;
}
public ContextImpl getSystemContext() {
synchronized (this) {
if (mSystemContext == null) {
mSystemContext = ContextImpl.createSystemContext(this);
}
return mSystemContext;
}
}
其中 thread.attach(true)这句话经过一系列调用后会创建很多对象,比如ActivityThread,Instrumentation, ContextImpl,LoadedApk,Application等
具体执行过程可查看博主博客
从Activity加载源码深入理解ActivityThrad的工作逻辑
执行完后System Server后续就能用到这些对象了
继续往下看
//创建系统服务管理
mSystemServiceManager = new SystemServiceManager(mSystemContext);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
这里是实例化SystemServiceManager对象,这个类主要是用来对System server中的一些系统服务的创建,启动和其它的一些生命周期事件进行管理;SystemServiceManager内部维护了一个集合
private final ArrayList mServices = new ArrayList();
SystemServer启动的很多服务都保存在这个集合里,这样就可以正式启动其它服务了
//启动各种系统服务
try {
//引导服务
startBootstrapServices();
//核心服务
startCoreServices();
//其它服务
startOtherServices();
} catch (Throwable ex) {
throw ex;
} finally {
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
main方法最后会执行这三个重要的启动服务方法,先看第一个
这个方法将会启动一些引导服务
private PowerManagerService mPowerManagerService;
private ActivityManagerService mActivityManagerService;
private WebViewUpdateService mWebViewUpdateService;
private DisplayManagerService mDisplayManagerService;
private PackageManagerService mPackageManagerService;
private PackageManager mPackageManager;
/**
* 启动一些系统运行必须的关键服务,这些服务具有复杂的相互依赖性,所以就在这里全部初始化
*/
private void startBootstrapServices() {
// 阻塞等待installd完成启动,与其建立socket通道
// 以便它有机会使用适当的权限创建关键目录,例如/ data / user
// 在初始化其他服务之前,我们需要完成此操作
Installer installer = mSystemServiceManager.startService(Installer.class);
// 启动ActivityManagerService
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
// PowerManagerService需要尽早启动,因为其他服务需要它。 本机守护程序可能正在监视它是否已注册
// 因为它要立即准备好处理传入进来的binder调用(包括能够验证这些调用的权限)
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
// 现在电源管理器已经启动,让ActivityManagerService初始化电源管理功能
mActivityManagerService.initPowerManagement();
// 启动服务LightsService 管理LED并显示背光
mSystemServiceManager.startService(LightsService.class);
// 启动服务DisplayManagerService
mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
// 在初始化package manager之前,需要默认的显示
mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);
// 如果我们正在加密设备,则只运行“核心”应用程序.
String cryptState = SystemProperties.get("vold.decrypt");
if (ENCRYPTING_STATE.equals(cryptState)) {
//加密程序正在运行
mOnlyCore = true;
} else if (ENCRYPTED_STATE.equals(cryptState)) {
//已经被加密了
mOnlyCore = true;
}
// 启动PackageManagerService
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
mFirstBoot = mPackageManagerService.isFirstBoot();
mPackageManager = mSystemContext.getPackageManager();
// 没有加密的话进行odex优化
if (!mOnlyCore) {
boolean disableOtaDexopt = SystemProperties.getBoolean("config.disable_otadexopt",false);
if (!disableOtaDexopt) {
traceBeginAndSlog("StartOtaDexOptService");
try {
OtaDexoptService.main(mSystemContext, mPackageManagerService);
} catch (Throwable e) {
reportWtf("starting OtaDexOptService", e);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
}
//启动服务UserManagerService,新建目录/data/user/
mSystemServiceManager.startService(UserManagerService.LifeCycle.class);
//初始化属性缓存用来缓存包资源.
AttributeCache.init(mSystemContext);
// 为系统进程设置Application实例并开始使用
mActivityManagerService.setSystemProcess();
// 启动传感器服务
// 传感器服务需要访问包管理器服务,app ops服务和权限服务,因此我们在它们之后启动它
startSensorService();
}
//这是native方法
private static native void startSensorService();
可以看到这里启动了很多系统关键性服务,比如ActivityManagerService,这就是平时所说的AMS,它就是在system server进程中创建的,它们都是通过SystemServiceManager实例去操作,具体执行方法是其startService方法
SystemServiceManager.startService
/**
* 创建并启动 system service. 且这些服务必须是SystemService子类
*
* @param serviceClass A Java class that implements the SystemService interface.
* @return The service instance, never null.
* @throws RuntimeException if the service fails to start.
*/
@SuppressWarnings("unchecked")
public T startService(Class serviceClass) {
try {
final String name = serviceClass.getName();
// 创建 service.
if (!SystemService.class.isAssignableFrom(serviceClass)) {
throw new RuntimeException("Failed to create " + name
+ ": service must extend " + SystemService.class.getName());
}
final T service;
try {
Constructor constructor = serviceClass.getConstructor(Context.class);
service = constructor.newInstance(mContext);
} catch (InstantiationException ex) {
throw new RuntimeException("Failed to create service " + name
+ ": service could not be instantiated", ex);
} catch (IllegalAccessException ex) {
throw new RuntimeException("Failed to create service " + name
+ ": service must have a public constructor with a Context argument", ex);
} catch (NoSuchMethodException ex) {
throw new RuntimeException("Failed to create service " + name
+ ": service must have a public constructor with a Context argument", ex);
} catch (InvocationTargetException ex) {
throw new RuntimeException("Failed to create service " + name
+ ": service constructor threw an exception", ex);
}
// 添加到list集合
mServices.add(service);
try {
//启动
service.onStart();
} catch (RuntimeException ex) {
throw new RuntimeException("Failed to start service " + name
+ ": onStart threw an exception", ex);
}
return service;
} finally {
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
这里都是通过反射构造出这些服务的实例,然后调用它们的onStart方法启动,以Installer服务为例看一下
Installer.onStart
public final class Installer extends SystemService {
private final InstallerConnection mInstaller;
public Installer(Context context) {
super(context);
mInstaller = new InstallerConnection();
}
@Override
public void onStart() {
//等待installd准备完毕
mInstaller.waitForConnection();
}
}
public class InstallerConnection {
public void waitForConnection() {
for (;;) {
try {
execute("ping");
return;
} catch (InstallerException ignored) {
}
//还没准备好,休息一秒继续尝试
SystemClock.sleep(1000);
}
}
}
其实就是不断的通过ping命令连接Zygote进程(SystemServer和Zygote进程通过socket方式通讯,其他进程通过Binder方式通讯),成功连接之后才会开始启动其他服务
接下来看第二个启动方法
/**
* 启动一些与引导服务没有复杂依赖的基本服务
*/
private void startCoreServices() {
// 启动BatteryService 跟踪电池电量
mSystemServiceManager.startService(BatteryService.class);
// 启动UsageStatsService 跟踪应用程序使用统计信息
mSystemServiceManager.startService(UsageStatsService.class);
mActivityManagerService.setUsageStatsManager(
LocalServices.getService(UsageStatsManagerInternal.class));
// 启动WebViewUpdateService 跟踪可更新的WebView是否处于就绪状态并监视更新安装。
mWebViewUpdateService = mSystemServiceManager.startService(WebViewUpdateService.class);
}
这个方法着实有点长,将近一千行,不过做的事情不复杂,主要是启动服务;这里就不一一列举了
private void startOtherServices() {
final Context context = mSystemContext;
//这里会启动一堆杂七杂八的服务
VibratorService vibrator = null;
IMountService mountService = null;
NetworkManagementService networkManagement = null;
NetworkStatsService networkStats = null;
NetworkPolicyManagerService networkPolicy = null;
ConnectivityService connectivity = null;
NetworkScoreService networkScore = null;
NsdService serviceDiscovery= null;
WindowManagerService wm = null;
SerialService serial = null;
NetworkTimeUpdateService networkTimeUpdater = null;
CommonTimeManagementService commonTimeMgmtService = null;
InputManagerService inputManager = null;
TelephonyRegistry telephonyRegistry = null;
ConsumerIrService consumerIr = null;
MmsServiceBroker mmsService = null;
HardwarePropertiesManagerService hardwarePropertiesService = null;
//读取配置信息
boolean disableStorage = SystemProperties.getBoolean("config.disable_storage", false);
boolean disableBluetooth = SystemProperties.getBoolean("config.disable_bluetooth", false);
boolean disableLocation = SystemProperties.getBoolean("config.disable_location", false);
boolean disableSystemUI = SystemProperties.getBoolean("config.disable_systemui", false);
boolean disableNonCoreServices = SystemProperties.getBoolean("config.disable_noncore", false);
boolean disableNetwork = SystemProperties.getBoolean("config.disable_network", false);
boolean disableNetworkTime = SystemProperties.getBoolean("config.disable_networktime", false);
boolean disableRtt = SystemProperties.getBoolean("config.disable_rtt", false);
boolean disableMediaProjection = SystemProperties.getBoolean("config.disable_mediaproj",
false);
boolean disableSerial = SystemProperties.getBoolean("config.disable_serial", false);
boolean disableSearchManager = SystemProperties.getBoolean("config.disable_searchmanager",
false);
boolean disableTrustManager = SystemProperties.getBoolean("config.disable_trustmanager",
false);
boolean disableTextServices = SystemProperties.getBoolean("config.disable_textservices", false);
boolean disableSamplingProfiler = SystemProperties.getBoolean("config.disable_samplingprof",
false);
boolean isEmulator = SystemProperties.get("ro.kernel.qemu").equals("1");
try {
SystemConfig.getInstance();
ServiceManager.addService("scheduling_policy", new SchedulingPolicyService());
mSystemServiceManager.startService(TelecomLoaderService.class);
telephonyRegistry = new TelephonyRegistry(context);
ServiceManager.addService("telephony.registry", telephonyRegistry);
......
} catch (RuntimeException e) {
Slog.e("System", "************ Failure starting core service", e);
}
StatusBarManagerService statusBar = null;
INotificationManager notification = null;
LocationManagerService location = null;
CountryDetectorService countryDetector = null;
ILockSettings lockSettings = null;
AssetAtlasService atlas = null;
MediaRouterService mediaRouter = null;
......
ActivityManagerNative.getDefault().showBootMessage(...); //显示启动界面
try {
vibrator.systemReady();
} catch (Throwable e) {
reportWtf("making Vibrator Service ready", e);
}
mSystemServiceManager.startBootPhase(SystemService.PHASE_LOCK_SETTINGS_READY);
mSystemServiceManager.startBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY);
try {
wm.systemReady();
} catch (Throwable e) {
reportWtf("making Window Manager Service ready", e);
}
......
mActivityManagerService.systemReady(new Runnable() {
@Override
public void run() {
mSystemServiceManager.startBootPhase(
SystemService.PHASE_ACTIVITY_MANAGER_READY);
......
try {
startSystemUi(context);
} catch (Throwable e) {
reportWtf("starting System UI", e);
}
mSystemServiceManager.startBootPhase(
SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);
......
}
});
}
这里会启动大量的服务,到这里系统服务基本上启动完成,system_server进程随后进入Looper.loop()状态,随时等待消息到来