文章目录
之前介绍过Zygote的启动流程,然后这里会forkSystemServer(),然后通过一系列最终找到SystemServer的main函数入口。
今天就进入看看SystemServer.java中干了啥。
PS: 这里只是走走流程,细节暂不分析
涉及文件
frameworks\base\services\java\com\android\server\SystemServer.java frameworks\base\services\core\jni\com_android_server_SystemServer.cpp
正文
从《》可以知道
Runnable r = forkSystemServer(abiList, socketName, zygoteServer); handleSystemServerProcess() zygoteInit() RuntimeInit.applicationInit() findStaticMain() new MethodAndArgsCaller() r.run();
findStaticMain()就是找com.android.server.SystemServer中的main(),因此,我们进入了SystemServer.java的main()。
直入main()
main()
public static void main(String[] args) { //匿名创建SystemServer对象,并调用run() new SystemServer().run(); }
run()
这里主要做了如下工作。
初始化环境,比如时间,时区,语言等
准备主线程Looper
加载libandroid_servers.so库
初始化系统Context
进入Looper循环
private void run() { try { //获取当前时间,如果小于最早支持时间1970,就设置为1970 if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) { SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME); } //设置系统时区:GMT String timezoneProperty = SystemProperties.get("persist.sys.timezone"); if (timezoneProperty == null || timezoneProperty.isEmpty()) { SystemProperties.set("persist.sys.timezone", "GMT"); } //设置系统默认语言和环境等 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", ""); } //略 //设置当前虚拟机的运行库路径 SystemProperties.set("persist.sys.dalvik.vm.lib.2", VMRuntime.getRuntime().vmLibrary()); // Mmmmmm... more memory! VMRuntime.getRuntime().clearGrowthLimit(); //设置虚拟机堆内存 VMRuntime.getRuntime().setTargetHeapUtilization(0.8f); //略 //设置做大的线程数 BinderInternal.setMaxThreads(sMaxBinderThreads); //设置线程优先级 android.os.Process.setThreadPriority( android.os.Process.THREAD_PRIORITY_FOREGROUND); android.os.Process.setCanSelfBackground(false); //初始化主线程Looper Looper.prepareMainLooper(); Looper.getMainLooper().setSlowLogThresholdMs( SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS); //加载libandroid_servers.so库 SystemServerInitThreadPool.get().submit(() -> { System.loadLibrary("android_servers"); }, "android_servers"); // Check whether we failed to shut down last time we tried. // This call may not return. //检测是否启动异常,如果有就是会shutdown performPendingShutdown(); //创建System的context createSystemContext(); //创建SystemServiceManager,负责服务的启动 mSystemServiceManager = new SystemServiceManager(mSystemContext); mSystemServiceManager.setStartInfo(mRuntimeRestart, mRuntimeStartElapsedTime, mRuntimeStartUptime); //LocalServices用于存储和管理Service LocalServices.addService(SystemServiceManager.class, mSystemServiceManager); } finally { traceEnd(); } try { //开启引导服务 startBootstrapServices(); //开启核心服务 startCoreServices(); //开启其他服务 startOtherServices(); //关闭之前启动的线程池 SystemServerInitThreadPool.shutdown(); } catch (Throwable ex) { throw ex; } finally { traceEnd(); } // 进入Loop循环,处理消息循环 Looper.loop(); throw new RuntimeException("Main thread loop unexpectedly exited"); }
初始化环境
最早时间设置
Android支持最早时间1970,如果当前时间还比这个早,那就把时间设置为1970
if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) { SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME); }
时区设置
如果没有设置定过时区,就这只默认时区GMT
String timezoneProperty = SystemProperties.get("persist.sys.timezone"); if (timezoneProperty == null || timezoneProperty.isEmpty()) { SystemProperties.set("persist.sys.timezone", "GMT"); }
语言环境设置
如果没有设置过语言,就设置默认的
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", ""); }
虚拟机设置
//设置当前虚拟机的运行库路径 SystemProperties.set("persist.sys.dalvik.vm.lib.2", VMRuntime.getRuntime().vmLibrary()); VMRuntime.getRuntime().clearGrowthLimit(); //设置虚拟机堆内存 VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
Looper初始化
主线程Looper准备,这个都很熟悉了,这种Looper是不允许退出的,除非异常!
Looper.prepareMainLooper();
prepareMainLooper()
public static void prepareMainLooper() {
//传入false,不允许退出
prepare(false);
synchronized (Looper.class) {
if (sMainLooper != null) {
throw new IllegalStateException("The main Looper has already been prepared.");
}
sMainLooper = myLooper();
}
}
具体细节看《》。
最后会进入Looper循环中。
// 进入Loop循环,处理消息循环
Looper.loop();
//如果退出了loop,就抛出异常。
throw new RuntimeException("Main thread loop unexpectedly exited");
加载so库
通过子线程加载了libandroid_servers.so
SystemServerInitThreadPool.get().submit(() -> {
System.loadLibrary("android_servers");
}, "android_servers");
这里是通过线程加载so库的。
SystemServerInitThreadPool
SystemServerInitThreadPool这里是启动了线程池,后面还会用的。
//单例模式
public static synchronized SystemServerInitThreadPool get() {
if (sInstance == null) {
sInstance = new SystemServerInitThreadPool();
}
Preconditions.checkState(sInstance.mService != null, "Cannot get " + TAG
+ " - it has been shut down");
return sInstance;
}
初始化Context
这里初始化了mSystemContext和systemUiContext
createSystemContext()
private void createSystemContext() {
//创建activityThread对象
ActivityThread activityThread = ActivityThread.systemMain();
//获取系统上下文
mSystemContext = activityThread.getSystemContext();
mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
//获取SystemUI上下文
final Context systemUiContext = activityThread.getSystemUiContext();
systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
}
细节暂不深入。
创建SystemServiceManager
//创建SystemServiceManager,负责服务的启动
mSystemServiceManager = new SystemServiceManager(mSystemContext);
mSystemServiceManager.setStartInfo(mRuntimeRestart,
mRuntimeStartElapsedTime, mRuntimeStartUptime);
//LocalServices用于存储和管理Service
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
SystemServiceManager
这里重点介绍一下是启动服务的,后面的服务启动都是通过这个的。
这里以Installer启动为例。
Installer installer = mSystemServiceManager.startService(Installer.class);
这里的startService()查看是否能找到传入的className类么。
@SuppressWarnings("unchecked")
public SystemService startService(String className) {
final Class<SystemService> serviceClass;
try {
//返回className类对象
serviceClass = (Class<SystemService>)Class.forName(className);
} catch (ClassNotFoundException ex) {
}
//启动服务
return startService(serviceClass);
}
接着的startService()主要作用:
判断serviceClass是否继承SystemService
获取构造函数初始化Service
调用真正启动服务的startService()
@SuppressWarnings("unchecked")
public <T extends SystemService> T startService(Class<T> serviceClass) {
try {
final String name = serviceClass.getName();
//isAssignableFrom是用来判断子类和父类的关系的,或者接口的实现类和接口的关系的。
//serviceClass继承于SystemService
//比如Installer extends SystemService
if (!SystemService.class.isAssignableFrom(serviceClass)) {
throw new RuntimeException("Failed to create " + name
+ ": service must extend " + SystemService.class.getName());
}
final T service;
try {
//获取到构造函数
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
//Service对象初始化
service = constructor.newInstance(mContext);
} catch (InstantiationException ex) {
throw new RuntimeException("Failed to create service " + name
+ ": service could not be instantiated", ex);
}
//这里才真正启动启动Service
startService(service);
return service;
} finally {
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
真正启动服务的是在这个startService(),这里的工作是。
添加创建的service到mServices列表中,方便后续获取和查询
调用服务中的onStart()
public void startService(@NonNull final SystemService service) {
//添加到服务列表,后面可以通过getService获取服务。
mServices.add(service);
try {
//调用服务中的onStart()
service.onStart();
} catch (RuntimeException ex) {
throw new RuntimeException("Failed to start service " + service.getClass().getName()
+ ": onStart threw an exception", ex);
}
}
LocalServices
LocalServices很简单就是记录一下启动的服务。
public final class LocalServices {
private LocalServices() {}
private static final ArrayMap<Class<?>, Object> sLocalServiceObjects =
new ArrayMap<Class<?>, Object>();
@SuppressWarnings("unchecked")
public static <T> T getService(Class<T> type) {
synchronized (sLocalServiceObjects) {
return (T) sLocalServiceObjects.get(type);
}
}
//添加服务
public static <T> void addService(Class<T> type, T service) {
synchronized (sLocalServiceObjects) {
if (sLocalServiceObjects.containsKey(type)) {
throw new IllegalStateException("Overriding service registration");
}
sLocalServiceObjects.put(type, service);
}
}
//异常服务
@VisibleForTesting
public static <T> void removeServiceForTest(Class<T> type) {
synchronized (sLocalServiceObjects) {
sLocalServiceObjects.remove(type);
}
}
}
启动服务
启动服务分三步
引导服务
核心服务
其他服务
try {
//引导服务
startBootstrapServices();
//核心服务
startCoreServices();
//其他服务
startOtherServices();
//关闭线程池
SystemServerInitThreadPool.shutdown();
} catch (Throwable ex) {
throw ex;
} finally {
traceEnd();
}
引导服务
引导服务都是比较重要的,也是后面服务需要用的。
这里主要启动了如下引导服务
安装服务(Installer)
设备认证服务(DeviceIdentifiersPolicyService)
Activity管理服务(ActivityManagerService)
电源管理服务(PowerManagerService)
系统重启服务(RecoverySystemService)
LED和屏幕背光管理服务(LightsService)
显示管理器服务(DisplayManagerService)
程序包管理服务(PackageManagerService)
多用户管理服务(UserManagerService)
OverlayManagerService(不太懂,看字面意思层级管理服务)
传感器服务(这个主要native层)
private void startBootstrapServices() {
//子线程初始化SystemConfig
SystemServerInitThreadPool.get().submit(SystemConfig::getInstance, TAG_SYSTEM_CONFIG);
//启动Installer
Installer installer = mSystemServiceManager.startService(Installer.class);
//启动DeviceIdentifiersPolicyService
mSystemServiceManager.startService(DeviceIdentifiersPolicyService.class);
//子线程初始化mActivityManagerService
mActivityManagerServiceStart = SystemServerInitThreadPool.get().submit(() -> {
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
},"StartActivityManager");
//启动PowerManagerService
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
mActivityManagerService.initPowerManagement();
//启动RecoverySystemService
mSystemServiceManager.startService(RecoverySystemService.class);
//启动LightsService
mSystemServiceManager.startService(LightsService.class);
// 启动SidekickService(这个根据条件启动)
if (SystemProperties.getBoolean("config.enable_sidekick_graphics", false)) {
mSystemServiceManager.startService(WEAR_SIDEKICK_SERVICE_CLASS);
}
//启动DisplayManagerService
mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
//启动PackageManagerService
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
mFirstBoot = mPackageManagerService.isFirstBoot();
//启动UserManagerService
mSystemServiceManager.startService(UserManagerService.LifeCycle.class);
//mActivityManagerService设置系统进程
mActivityManagerService.setSystemProcess();
//启动OverlayManagerService
mSystemServiceManager.startService(new OverlayManagerService(mSystemContext, installer));
//启动传感器服务
mSensorServiceStart = SystemServerInitThreadPool.get().submit(() -> {
//native层启动传感器服务
startSensorService();
}, START_SENSOR_SERVICE);
}
核心服务
核心服务启动的个数就相对比较少了
电池管理服务(BatteryService)
跟踪应用使用情况(UsageStatsManagerInternal)
WebView更新服务(WebViewUpdateService)
Binder调用状态服务(BinderCallsStatsService)
private void startCoreServices() {
//启动BatteryService
mSystemServiceManager.startService(BatteryService.class);
//启动UsageStatsService。收集用户使用每一个APP的频率、使用时常
mSystemServiceManager.startService(UsageStatsService.class);
mActivityManagerService.setUsageStatsManager(
LocalServices.getService(UsageStatsManagerInternal.class));
//启动WebViewUpdateService
if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_WEBVIEW)) {
mWebViewUpdateService = mSystemServiceManager.startService(WebViewUpdateService.class);
}
//启动BinderCallsStatsService
BinderCallsStatsService.start();
}
其他服务
这里启动的服务超级多,下面只简单介绍几个。
震动服务
ServiceManager.addService("vibrator", vibrator);
闹钟管理服务
mSystemServiceManager.startService(AlarmManagerService.class);
输入管理服务
inputManager = new InputManagerService(context);
窗口管理服务
wm = WindowManagerService.main(context, inputManager,
mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
!mFirstBoot, mOnlyCore, new PhoneWindowManager());
ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false,
DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO);
ServiceManager.addService(Context.INPUT_SERVICE, inputManager,
/* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
mActivityManagerService.setWindowManager(wm);
wm.onInitReady();
HIDL服务
startHidlServices();
蓝牙服务
mSystemServiceManager.startService(BluetoothService.class);
存储管理器服务
storageManager = IStorageManager.Stub.asInterface(
ServiceManager.getService("mount"));
WIFI相关服务
mSystemServiceManager.startService(WIFI_SERVICE_CLASS);
mSystemServiceManager.startService(
"com.android.server.wifi.rtt.RttService");
mSystemServiceManager.startService(WIFI_AWARE_SERVICE_CLASS);
mSystemServiceManager.startService(WIFI_P2P_SERVICE_CLASS);
mSystemServiceManager.startService(LOWPAN_SERVICE_CLASS);
mSystemServiceManager.startService(ETHERNET_SERVICE_CLASS);
connectivity = new ConnectivityService(
context, networkManagement, networkStats, networkPolicy);
ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity,
/* allowIsolated= */ false,
DUMP_FLAG_PRIORITY_HIGH | DUMP_FLAG_PRIORITY_NORMAL);
networkStats.bindConnectivityManager(connectivity);
networkPolicy.bindConnectivityManager(connectivity);
定位管理服务
ServiceManager.addService(Context.LOCATION_SERVICE, location);
参考文章
《》
《
