Android SystemServer启动流程详解(基于sdk版本6.0.1)
2018-02-01 11:37
609 查看
本文基于Android系统版本6.0.1,由于系统重构与4.4.4启动过程存在差异。
Java类的入口是main()方法,SystemServer的main()方法代码如下:
由此开始,以SystemServer的run()作为系统启动方法,接下来我们来看run()方法做了哪些事情。
上述就是Android 6.0.1SystemServer启动所做的事情,如果有什么不对的,希望大家能指出。
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启动所做的事情,如果有什么不对的,希望大家能指出。
相关文章推荐
- Android源码(2) --- SystemServer进程启动流程
- Android5 Zygote 与 SystemServer 启动流程分析
- Android应用进程启动流程(Zygote进程与SystemServer进程)
- neutron-server服务启动流程-基于mitaka版本
- Android源码基础解析之SystemServer进程启动流程
- Android源码解析之(九)-->SystemServer进程启动流程
- Android5 Zygote 与 SystemServer 启动流程分析
- android system server 启动流程
- Android启动流程分析(十二) SystemServer
- android systemserver启动详解
- Android SystemServer启动流程源码解析
- (OK) Android应用进程启动流程(Zygote进程与SystemServer进程)
- Android SystemServer启动流程源码解析
- Android SystemServer启动流程源码解析
- android源码解析之(九)-->SystemServer进程启动流程
- Android SystemServer 启动流程
- android system server 启动流程
- android SystemServer详解
- Android启动过程之SystemServer
- Android学习启动篇--eclipse如何调试system_server