您的位置:首页 > 移动开发 > Android开发

Android SystemServer启动流程详解(基于sdk版本6.0.1)

2018-02-01 11:37 609 查看
本文基于Android系统版本6.0.1,由于系统重构与4.4.4启动过程存在差异。

Java类的入口是main()方法,SystemServer的main()方法代码如下:

new SystemServer().run();


由此开始,以SystemServer的run()作为系统启动方法,接下来我们来看run()方法做了哪些事情。

private void run() {
//修复时间,避免系统时间呈现负数
if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
Slog.w(TAG, "System clock is before 1970; setting to 1970.");
SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
}

//如果系统中设置了系统语言,则设置到persist.sys.locale中
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系统服务开始启动,并记录启动时间
Slog.i(TAG, "Entered the Android system server!");
EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN, SystemClock.uptimeMillis());

//防止runtime被删除,例如系统ota升级,设置虚拟机属性以同步,防止lib库找不到
SystemProperties.set("persist.sys.dalvik.vm.lib.2", VMRuntime.getRuntime().vmLibrary());

// 如果样本采集器是可用的,就启动
if (SamplingProfilerIntegration.isEnabled()) {
SamplingProfilerIntegration.start();
mProfilerSnapshotTimer = new Timer();
mProfilerSnapshotTimer.schedule(new TimerTask() {
@Override
public void run() {
SamplingProfilerIntegration.writeSnapshot("system_server", null);
}
}, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);
}

// 虚拟机释放更多的内存
VMRuntime.getRuntime().clearGrowthLimit();

//为了保证SystemServer一直运行和虚拟机高效流畅的运行,将内存堆可使用设置为80%。
VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);

//向设备系统属性中写入当前设备的指纹信息
Build.ensureFingerprintProperty();

//在系统服务中,操作环境路径必须要有一个系统账户
Environment.setUserRequired(true);

//确保进入系统调用binder通信的时候,是以前台的优先级来运行
BinderInternal.disableBackgroundScheduling(true);

//准备主循环线程
android.os.Process.setThreadPriority(
android.os.Process.THREAD_PRIORITY_FOREGROUND);
android.os.Process.setCanSelfBackground(false);
Looper.prepareMainLooper();

//初始化系统本地c++ so库
System.loadLibrary("android_servers");

//检查上次关闭的状态,控制电源管理和手机振动传感器
performPendingShutdown();

// 初始化系统上下文对象,在其中初始化了ActivityThread对象,并判断是否使用硬件加速器
createSystemContext();

// 创建系统服务管理器,并添加到本地服务(只在相同进程中使用,没有binder接口对象)中
mSystemServiceManager = new SystemServiceManager(mSystemContext);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);

// 开始各种服务
try {
//开始启动服务,包含Installer程序安装服务,ActivityManagerService服务,PowerManagerService管理服务,LightsService屏幕亮度管理服务,DisplayManagerService显示管理服务,PackageManager管理器,UserManagerService用户管理服务,开启各种传感器服务(调用C层开启),初始化缓存资源
startBootstrapServices();
//开启内核服务,包含BatteryService电量服务,UsageStatsService应用使用状态监测服务,WebViewUpdateService网页控件更新服务,初始化应用使用状态
startCoreServices();
//开启其他服务,包含AccountManagerService账户管理服务,VibratorService震动服务,IAlarmManager闹钟服务,IMountService挂载服务,NetworkManagementService网络管理服务,CameraService相机服务,AudioService音频服务,WindowManagerService窗口管理服务,InputManagerService输入管理服务...等
startOtherServices();
} catch (Throwable ex) {
Slog.e("System", "******************************************");
Slog.e("System", "************ Failure starting system services", ex);
throw ex;
}

// 调试模式时,将日志挂起用于分析
if (StrictMode.conditionallyEnableDebugLogging()) {
Slog.i(TAG, "Enabled StrictMode for system server main thread.");
}

//循环器开始循环
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}


上述就是Android 6.0.1SystemServer启动所做的事情,如果有什么不对的,希望大家能指出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息