System Server
System Server是Zygote fork的第一个Java进程,这个进程非常重要因为它提供很多的系统线程,提供android是什么手机牌子所有核心的系统服务,其实包括大事务性工作名鼎鼎的WindowManager, ActivityManager,它们都是运行在system_server的进程里。还有很多“Binder-x”的线程,它们是各个Service为了响应应用程序远程调用请求而创建的。除此之外,还有很多内部的线程,比如 ”UI thread”线程池核心参数,“InputReader”,“InputDispatch” 等等。
System Server启动
//Zygote通过forkSystemServer最终会执行到这里
public static void main(String[] args) {
new SystemServer().run();
}
run()
方法执行过程
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", "");
}
//Binder事务发生阻塞时发出警告
Binder.setWarnOnBlocking(true);
//设置安全标签
PackageItemInfo.setForceSafeLabels(true);
SQLiteCompatibilityWalFlags.init(null);
//系统时钟时间戳
int uptimeMillis = (int) SystemClock.elapsedRealtime(); uptimeMillis);
....
//设置虚拟机执行路径
SystemProperties.set("persist.sys.dalvik.vm.lib.2", VMRuntime.getRuntime().vmLibrary());
//清除虚拟机内存增长限制
VMRuntime.getRuntime().clearGrowthLimit();
//设置内存的可能有效使用率为0.8
VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
//定义指纹信息
Build.ensureFingerprintProperty();
//明确指定用户
Environment.setUserRequired(true);
//防止Bundle解析崩溃
BaseBundle.setShouldDefuse(true);
//设置Parcel异常追踪
Parcel.setStackTraceParceling(true);
//设置系统Binder运行在前台优先级
BinderInternal.disableBackgroundScheduling(true);
//设置最大的binder线程数(31个)
BinderInternal.setMaxThreads(sMaxBinderThreads);
//设置线程优先级、开始执行Looper
android.os.Process.setThreadPriority(
android.os.Process.THREAD_PRIORITY_FOREGROUND);
android.os.Process.setCanSelfBackground(false);
Looper.prepareMainLooper();
Looper.getMainLooper().setSlowLogThresholdMs(
SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);
//加载android_servers.so库
System.loadLibrary("android_servers");
//检测上次关机过程是否失败,该方法可能不会返回
performPendingShutdown();
//初始化系统context
createSystemContext();
//创建系统服务管理类,SystemServerManager主要进行服务的管理和启动
mSystemServiceManager = new SystemServiceManager(mSystemContext);
mSystemServiceManager.setStartInfo(mRuntimeRestart,
mRuntimeStartElapsedTime, mRuntimeStartUptime);
//将mSystemServiceManager添加到本地服务的成员sLocalServiceObjects
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
//初始化执行各种系统服务的线程池
SystemServerInitThreadPool.get();
} finally {
traceEnd(); // InitBeforeStartServices
}
//前面都是一些准备工作,这里开始启动各种服务
try {
startBootstrapServices();//启动引导服务
startCoreServices(); //启动系统核心服务
startOtherServices(); //启动其他服务
SystemServerInitThreadPool.shutdown(); //关闭线程池
} catch (Throwable ex) {
....
} finally {
traceEnd();
}
StrictMode.initVmDefaults(null);
....
Looper.loop(); //开启looper循环
....
}
creatGoeSystemContext
private void createSystemContext() {
//systemMain方法完成ActivityThread的创建和attach
ActivityThread activityThread = ActivityThread.systemMain();
//获取系统上下文、设置主题
mSystemContext = activityThread.getSystemContext();
mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
final Context systemUiContext = activityThread.getSystemUiContext();
systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
}
createSystemContext方法是进行ActivityThread的创建和attach并设置主题。
star事务的四个特性tBootstrapServices
private void startBootstrapServices() {
....
//阻塞等待与installd建立socket通道
Installer installer = mSystemServiceManager.startService(Installer.class);
....
// 启动 DeviceIdentifiersPolicyService,该服务定义了访问设备标识符的策略
mSystemServiceManager.startService(DeviceIdentifiersPolicyService.class);
....
//启动AMS
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
....
//启动PowerManagerService
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
//初始化power management
mActivityManagerService.initPowerManagement();
//启动RecoverySystemService
mSystemServiceManager.startService(RecoverySystemService.class);
....
RescueParty.noteBoot(mSystemContext);
....
//启动LightsService
mSystemServiceManager.startService(LightsService.class);
....
//启动DisplayManagerService
mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
....
//设置BootPhase为100,BootPhase将启动阶段进行了分类
mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);
....
//启动PackageManagerService
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
mFirstBoot = mPackageManagerService.isFirstBoot();
mPackageManager = mSystemContext.getPackageManager();
....
//启动UserManagerService
mSystemServiceManager.startService(UserManagerService.LifeCycle.class);
AttributeCache.init(mSystemContext);
//设置AMS
mActivityManagerService.setSystemProcess();
mDisplayManagerService.setupSchedulerPolicies();
//启动OverlayManagerService
mSystemServiceManager.startService(new OverlayManagerService(mSystemContext, installer));
//通过单独的线程执行SensorService
mSensorServiceStart = SystemServerInitThreadPool.get().submit(() -> {
....
startSensorService();
....
}, START_SENSOR_SERVICE);
}
startBootstrapServices方法是来启动系统的各种关键服务,包线程池的工作原理括Installer
DeviceIdentifiersPolicyService
ActivityManagerService
PowerManagerService
RecoverySystemService
LightsService
StartSidekickService
Display事务所所长npcManagerService``PackageManagerService
UserManagerService
OverlayManagerServicewebview2控件
SensorService
,同时设置了BootPhase
为100来标记服务的启动阶段。
startCoreServices
private void startCoreServices() {
//启动BatteryService
mSystemServiceManager.startService(BatteryService.class);
//启动UsageStatsService
mSystemServiceManager.startService(UsageStatsService.class);
mActivityManagerService.setUsageStatsManager(
LocalServices.getService(UsageStatsManagerInternal.class));
//根据条件判断是否要启动WebView更新服务
if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_WEBVIEW)) {
mWebViewUpdateService = mSystemServiceManager.startService(WebViewUpdateService.class);
}
//启动BinderCallsStatsService
BinderCallsStatsService.start();
}
sgoogletartCoreServices方法启动了BatteryService
UsageStatsService
WebViewUpd线程池的使用ateService
和BinderCallsStatsService
四个服务。
startOtherSe枸杞rvices
sta事务所是干什么的rtOtherServices方法涉及到很多的服务,代线程池码量也比较大,这里指列举几个我们平时了解的比较多的线程池面试题。
private void startOtherServices() {
....
//AlarmManagerService,定闹钟的
mSystemServiceManager.startService(AlarmManagerService.class);
//InputManagerService,处理点击事件的
inputManager = new InputManagerService(context);
//WindowManagerService,并且与InputManagerService建立关联
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);
//AMS再与WindowManagerService(WMS)建立关联
mActivityManagerService.setWindowManager(wm);
//启动InputManagerService
inputManager.setWindowManagerCallbacks(wm.getInputMonitor());
inputManager.start();
....
// 480
mSystemServiceManager.startBootPhase(SystemService.PHASE_LOCK_SETTINGS_READY);
// 500
mSystemServiceManager.startBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY);
// 准备好window, power, package, display服务 wm.systemReady();
mPowerManagerService.systemReady(...);
mPackageManagerService.systemReady();
mDisplayManagerService.systemReady(...);
....
}
startOtherServices方法启动了各种各样龚俊的服务,启动服务的过程中设置了多个阶段信息。
SystemService.PHASE_LOCK_SETTINGS_READY // 480
SystemService.PHASE_SYSTEM_SERVICES_READY // 500
SystemService.PHASE_DEVICE_SPECIFIC_SERVICES_READY // 520
SystemService.PHASE_ACTIVITY_MANAGER_READY // 550
SystemService.PHASE_THIRD_PARTY_APPS_CAN_START // 600
整体可归纳为Gityuan大神画的这张webview更新图
到此为止,system_seandroid平板电脑价格rver
进程的主要工作就算完成了,之后会进入 Looper.loop() 状态,等待其他android什么意思线程通过 Handler 发送消息到主线程并处理。
总结
System Server启动会涉及大量的系统服务来支持系统的运行,这其中就包括我们常见的AMS、事务所WMS、IMS等服务,各种系统服务共同维持着系统和app的运行。
参考文章
gityuan.com/2016/02/20/…
/事务所所长npcpost/684490…