Android系统启动-SystemServer下篇
来源:互联网 发布:使命召唤11优化补丁 编辑:程序博客网 时间:2024/05/18 02:30
Android系统启动-SystemServer下篇
目录(?)[+]
基于Android 6.0的源码剖析, 分析Android启动过程的system_server进程
<code class="hljs cs" style="display: block; padding: 0.5em; color: rgb(0, 0, 0); background: rgb(255, 255, 255);">frameworks/<span class="hljs-keyword" style="color: rgb(0, 0, 136);">base</span>/core/java/android/app/ActivityThread.javaframeworks/<span class="hljs-keyword" style="color: rgb(0, 0, 136);">base</span>/core/java/android/app/LoadedApk.javaframeworks/<span class="hljs-keyword" style="color: rgb(0, 0, 136);">base</span>/core/java/android/app/ContextImpl.javaframeworks/<span class="hljs-keyword" style="color: rgb(0, 0, 136);">base</span>/core/java/com/android/server/LocalServices.javaframeworks/<span class="hljs-keyword" style="color: rgb(0, 0, 136);">base</span>/services/java/com/android/server/SystemServer.javaframeworks/<span class="hljs-keyword" style="color: rgb(0, 0, 136);">base</span>/services/core/java/com/android/server/SystemServiceManager.javaframeworks/<span class="hljs-keyword" style="color: rgb(0, 0, 136);">base</span>/services/core/java/com/android/server/ServiceThread.javaframeworks/<span class="hljs-keyword" style="color: rgb(0, 0, 136);">base</span>/services/core/java/com/android/server/pm/Installer.javaframeworks/<span class="hljs-keyword" style="color: rgb(0, 0, 136);">base</span>/services/core/java/com/android/server/am/ActivityManagerService.java</code>
一、启动调用栈
System_server启动函数调用类的栈关系:
<code class="hljs css" style="display: block; padding: 0.5em; color: rgb(0, 0, 0); background: rgb(255, 255, 255);"><span class="hljs-selector-tag">SystemServer</span><span class="hljs-selector-class">.main</span><span class="hljs-selector-tag">SystemServer</span><span class="hljs-selector-class">.run</span><span class="hljs-selector-tag">createSystemContext</span><span class="hljs-selector-tag">ActivityThread</span><span class="hljs-selector-class">.systemMain</span><span class="hljs-selector-tag">ActivityThread</span><span class="hljs-selector-class">.attach</span><span class="hljs-selector-tag">LoadedApk</span><span class="hljs-selector-class">.makeApplication</span><span class="hljs-selector-tag">ActivityThread</span><span class="hljs-selector-class">.getSystemContext</span><span class="hljs-selector-tag">ContextImpl</span><span class="hljs-selector-class">.createSystemContext</span><span class="hljs-selector-tag">startBootstrapServices</span>(); <span class="hljs-selector-tag">startCoreServices</span>(); <span class="hljs-selector-tag">startOtherServices</span>();<span class="hljs-selector-tag">Looper</span><span class="hljs-selector-class">.loop</span>();</code>
二、 SystemServer分析
上一篇文章Android系统启动-systemServer上篇讲解了从Zygote一路启动到SystemServer的过程,本文重要是讲述system_server所承载的java framework的系统服务框架,是如何一路路启动的。
Step 1. SystemServer.main
<code class="hljs java" style="display: block; padding: 0.5em; color: rgb(0, 0, 0); background: rgb(255, 255, 255);"><span class="hljs-function"><span class="hljs-keyword" style="color: rgb(0, 0, 136);">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136);">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136);">void</span> <span class="hljs-title">main</span><span class="hljs-params" style="color: rgb(102, 0, 102);">(String[] args)</span> </span>{ <span class="hljs-comment" style="color: rgb(136, 0, 0);">//先初始化SystemServer对象,再调用对象的run()方法, 【见Step 2】</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136);">new</span> SystemServer().run(); }</code>
Step 2. SystemServer.run
<code class="hljs java" style="display: block; padding: 0.5em; color: rgb(0, 0, 0); background: rgb(255, 255, 255);"><span class="hljs-function"><span class="hljs-keyword" style="color: rgb(0, 0, 136);">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136);">void</span> <span class="hljs-title">run</span><span class="hljs-params" style="color: rgb(102, 0, 102);">()</span> </span>{ <span class="hljs-comment" style="color: rgb(136, 0, 0);">//当系统时间比1970年更早,就设置当前系统时间为1970年</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136);">if</span> (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) { SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME); } <span class="hljs-comment" style="color: rgb(136, 0, 0);">//变更虚拟机的库文件,对于Android 6.0默认采用的是libart.so</span> SystemProperties.set(<span class="hljs-string" style="color: rgb(0, 136, 0);">"persist.sys.dalvik.vm.lib.2"</span>, VMRuntime.getRuntime().vmLibrary()); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//isEnabled()为true,则开启采用分析器</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136);">if</span> (SamplingProfilerIntegration.isEnabled()) { SamplingProfilerIntegration.start(); mProfilerSnapshotTimer = <span class="hljs-keyword" style="color: rgb(0, 0, 136);">new</span> Timer(); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//system_server每隔1小时采用一次,并保存结果到system_server文件</span> mProfilerSnapshotTimer.schedule(<span class="hljs-keyword" style="color: rgb(0, 0, 136);">new</span> TimerTask() { <span class="hljs-meta">@Override</span> <span class="hljs-function"><span class="hljs-keyword" style="color: rgb(0, 0, 136);">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136);">void</span> <span class="hljs-title">run</span><span class="hljs-params" style="color: rgb(102, 0, 102);">()</span> </span>{ SamplingProfilerIntegration.writeSnapshot(<span class="hljs-string" style="color: rgb(0, 136, 0);">"system_server"</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136);">null</span>); } }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL); } <span class="hljs-comment" style="color: rgb(136, 0, 0);">//清除vm内存增长上限,由于启动过程需要较多的虚拟机内存空间</span> VMRuntime.getRuntime().clearGrowthLimit(); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//设置内存的可能有效使用率为0.8</span> VMRuntime.getRuntime().setTargetHeapUtilization(<span class="hljs-number" style="color: rgb(0, 102, 102);">0.8f</span>); <span class="hljs-comment" style="color: rgb(136, 0, 0);">// 针对部分设备依赖于运行时就产生指纹信息,因此需要在开机完成前已经定义</span> Build.ensureFingerprintProperty(); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//访问环境变量前,需要明确地指定用户</span> Environment.setUserRequired(<span class="hljs-keyword" style="color: rgb(0, 0, 136);">true</span>); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//确保当前系统进程的binder调用,总是运行在前台优先级(foreground priority)</span> BinderInternal.disableBackgroundScheduling(<span class="hljs-keyword" style="color: rgb(0, 0, 136);">true</span>); android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND); android.os.Process.setCanSelfBackground(<span class="hljs-keyword" style="color: rgb(0, 0, 136);">false</span>); <span class="hljs-comment" style="color: rgb(136, 0, 0);">// 主线程looper就在当前线程运行</span> Looper.prepareMainLooper(); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//加载android_servers.so库,该库包含的源码在frameworks/base/services/目录下</span> System.loadLibrary(<span class="hljs-string" style="color: rgb(0, 136, 0);">"android_servers"</span>); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//检测上次关机过程是否失败,该方法可能不会返回</span> performPendingShutdown(); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//初始化系统上下文 【见Step 3】</span> createSystemContext(); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//创建系统服务管理</span> mSystemServiceManager = <span class="hljs-keyword" style="color: rgb(0, 0, 136);">new</span> SystemServiceManager(mSystemContext); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//将mSystemServiceManager添加到本地服务的成员sLocalServiceObjects</span> LocalServices.addService(SystemServiceManager.class, mSystemServiceManager); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//启动各种系统服务</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136);">try</span> { startBootstrapServices(); <span class="hljs-comment" style="color: rgb(136, 0, 0);">// 启动引导服务【见Step 4】</span> startCoreServices(); <span class="hljs-comment" style="color: rgb(136, 0, 0);">// 启动核心服务【见Step 5】</span> startOtherServices(); <span class="hljs-comment" style="color: rgb(136, 0, 0);">// 启动其他服务【见Step 6】</span> } <span class="hljs-keyword" style="color: rgb(0, 0, 136);">catch</span> (Throwable ex) { Slog.e(<span class="hljs-string" style="color: rgb(0, 136, 0);">"System"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0);">"************ Failure starting system services"</span>, ex); <span class="hljs-keyword" style="color: rgb(0, 0, 136);">throw</span> ex; } <span class="hljs-comment" style="color: rgb(136, 0, 0);">//用于debug版本,将log事件不断循环地输出到dropbox(用于分析)</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136);">if</span> (StrictMode.conditionallyEnableDebugLogging()) { Slog.i(TAG, <span class="hljs-string" style="color: rgb(0, 136, 0);">"Enabled StrictMode for system server main thread."</span>); } <span class="hljs-comment" style="color: rgb(136, 0, 0);">//一直循环执行</span> Looper.loop(); <span class="hljs-keyword" style="color: rgb(0, 0, 136);">throw</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136);">new</span> RuntimeException(<span class="hljs-string" style="color: rgb(0, 136, 0);">"Main thread loop unexpectedly exited"</span>);}</code>
LocalServices通过用静态Map变量sLocalServiceObjects,来保存以服务类名为key,以具体服务对象为value的Map结构。
Step 3. SystemServer.createSystemContext
<code class="hljs java" style="display: block; padding: 0.5em; color: rgb(0, 0, 0); background: rgb(255, 255, 255);"><span class="hljs-function"><span class="hljs-keyword" style="color: rgb(0, 0, 136);">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136);">void</span> <span class="hljs-title">createSystemContext</span><span class="hljs-params" style="color: rgb(102, 0, 102);">()</span> </span>{ <span class="hljs-comment" style="color: rgb(136, 0, 0);">//创建ActivityThread对象【见Step 3-1】</span> ActivityThread activityThread = ActivityThread.systemMain(); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//创建ContextImpl、LoadedApk对象【见Step 3-2】</span> mSystemContext = activityThread.getSystemContext(); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//设置主题</span> mSystemContext.setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar);}</code>
Step 3-1. ActivityThread.systemMain
<code class="hljs java" style="display: block; padding: 0.5em; color: rgb(0, 0, 0); background: rgb(255, 255, 255);"><span class="hljs-function"><span class="hljs-keyword" style="color: rgb(0, 0, 136);">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136);">static</span> ActivityThread <span class="hljs-title">systemMain</span><span class="hljs-params" style="color: rgb(102, 0, 102);">()</span> </span>{ <span class="hljs-comment" style="color: rgb(136, 0, 0);">//对于低内存的设备,禁用硬件加速</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136);">if</span> (!ActivityManager.isHighEndGfx()) { HardwareRenderer.disable(<span class="hljs-keyword" style="color: rgb(0, 0, 136);">true</span>); } <span class="hljs-keyword" style="color: rgb(0, 0, 136);">else</span> { HardwareRenderer.enableForegroundTrimming(); } <span class="hljs-comment" style="color: rgb(136, 0, 0);">// 创建ActivityThread</span> ActivityThread thread = <span class="hljs-keyword" style="color: rgb(0, 0, 136);">new</span> ActivityThread(); <span class="hljs-comment" style="color: rgb(136, 0, 0);">// 创建Application以及调用其onCreate()方法【见Step 3-1-1】</span> thread.attach(<span class="hljs-keyword" style="color: rgb(0, 0, 136);">true</span>); <span class="hljs-keyword" style="color: rgb(0, 0, 136);">return</span> thread;}</code>
Step 3-1-1. ActivityThread.attach
<code class="hljs java" style="display: block; padding: 0.5em; color: rgb(0, 0, 0); background: rgb(255, 255, 255);"><span class="hljs-function"><span class="hljs-keyword" style="color: rgb(0, 0, 136);">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136);">void</span> <span class="hljs-title">attach</span><span class="hljs-params" style="color: rgb(102, 0, 102);">(<span class="hljs-keyword" style="color: rgb(0, 0, 136);">boolean</span> system)</span> </span>{ sCurrentActivityThread = <span class="hljs-keyword" style="color: rgb(0, 0, 136);">this</span>; mSystemThread = system; <span class="hljs-keyword" style="color: rgb(0, 0, 136);">if</span> (!system) { ... } <span class="hljs-keyword" style="color: rgb(0, 0, 136);">else</span> { <span class="hljs-comment" style="color: rgb(136, 0, 0);">//system=true,进入此分支</span> android.ddm.DdmHandleAppName.setAppName(<span class="hljs-string" style="color: rgb(0, 136, 0);">"system_process"</span>, UserHandle.myUserId()); <span class="hljs-keyword" style="color: rgb(0, 0, 136);">try</span> { mInstrumentation = <span class="hljs-keyword" style="color: rgb(0, 0, 136);">new</span> Instrumentation(); <span class="hljs-comment" style="color: rgb(136, 0, 0);">// 创建应用上下文</span> ContextImpl context = ContextImpl.createAppContext( <span class="hljs-keyword" style="color: rgb(0, 0, 136);">this</span>, getSystemContext().mPackageInfo); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//创建Application 【见Step 3-1-1-1】</span> mInitialApplication = context.mPackageInfo.makeApplication(<span class="hljs-keyword" style="color: rgb(0, 0, 136);">true</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136);">null</span>); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//调用Application.onCreate()方法</span> mInitialApplication.onCreate(); } <span class="hljs-keyword" style="color: rgb(0, 0, 136);">catch</span> (Exception e) { <span class="hljs-keyword" style="color: rgb(0, 0, 136);">throw</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136);">new</span> RuntimeException( <span class="hljs-string" style="color: rgb(0, 136, 0);">"Unable to instantiate Application():"</span> + e.toString(), e); } } <span class="hljs-comment" style="color: rgb(136, 0, 0);">//添加dropbox log信息到libcore</span> DropBox.setReporter(<span class="hljs-keyword" style="color: rgb(0, 0, 136);">new</span> DropBoxReporter()); <span class="hljs-comment" style="color: rgb(136, 0, 0);">// 设置回调方法</span> ViewRootImpl.addConfigCallback(<span class="hljs-keyword" style="color: rgb(0, 0, 136);">new</span> ComponentCallbacks2() { <span class="hljs-meta">@Override</span> <span class="hljs-function"><span class="hljs-keyword" style="color: rgb(0, 0, 136);">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136);">void</span> <span class="hljs-title">onConfigurationChanged</span><span class="hljs-params" style="color: rgb(102, 0, 102);">(Configuration newConfig)</span> </span>{ <span class="hljs-keyword" style="color: rgb(0, 0, 136);">synchronized</span> (mResourcesManager) { <span class="hljs-keyword" style="color: rgb(0, 0, 136);">if</span> (mResourcesManager.applyConfigurationToResourcesLocked(newConfig, <span class="hljs-keyword" style="color: rgb(0, 0, 136);">null</span>)) { <span class="hljs-keyword" style="color: rgb(0, 0, 136);">if</span> (mPendingConfiguration == <span class="hljs-keyword" style="color: rgb(0, 0, 136);">null</span> || mPendingConfiguration.isOtherSeqNewer(newConfig)) { mPendingConfiguration = newConfig; sendMessage(H.CONFIGURATION_CHANGED, newConfig); } } } } <span class="hljs-meta">@Override</span> <span class="hljs-function"><span class="hljs-keyword" style="color: rgb(0, 0, 136);">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136);">void</span> <span class="hljs-title">onLowMemory</span><span class="hljs-params" style="color: rgb(102, 0, 102);">()</span> </span>{ } <span class="hljs-meta">@Override</span> <span class="hljs-function"><span class="hljs-keyword" style="color: rgb(0, 0, 136);">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136);">void</span> <span class="hljs-title">onTrimMemory</span><span class="hljs-params" style="color: rgb(102, 0, 102);">(<span class="hljs-keyword" style="color: rgb(0, 0, 136);">int</span> level)</span> </span>{ } });}</code>
主要工作是创建应用上下文ContextImpl,创建Application以及调用其onCreate()方法,设置DropBox以及ComponentCallbacks2回调方法。
Step 3-1-1-1. LoadedApk.makeApplication
<code class="hljs java" style="display: block; padding: 0.5em; color: rgb(0, 0, 0); background: rgb(255, 255, 255);"><span class="hljs-function"><span class="hljs-keyword" style="color: rgb(0, 0, 136);">public</span> Application <span class="hljs-title">makeApplication</span><span class="hljs-params" style="color: rgb(102, 0, 102);">(<span class="hljs-keyword" style="color: rgb(0, 0, 136);">boolean</span> forceDefaultAppClass, Instrumentation instrumentation)</span> </span>{ <span class="hljs-keyword" style="color: rgb(0, 0, 136);">if</span> (mApplication != <span class="hljs-keyword" style="color: rgb(0, 0, 136);">null</span>) { <span class="hljs-keyword" style="color: rgb(0, 0, 136);">return</span> mApplication; } Application app = <span class="hljs-keyword" style="color: rgb(0, 0, 136);">null</span>; String appClass = mApplicationInfo.className; <span class="hljs-keyword" style="color: rgb(0, 0, 136);">if</span> (forceDefaultAppClass || (appClass == <span class="hljs-keyword" style="color: rgb(0, 0, 136);">null</span>)) { appClass = <span class="hljs-string" style="color: rgb(0, 136, 0);">"android.app.Application"</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0);">//设置class名</span> } <span class="hljs-keyword" style="color: rgb(0, 0, 136);">try</span> { java.lang.ClassLoader cl = getClassLoader(); <span class="hljs-keyword" style="color: rgb(0, 0, 136);">if</span> (!mPackageName.equals(<span class="hljs-string" style="color: rgb(0, 136, 0);">"android"</span>)) { initializeJavaContextClassLoader(); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//不进入该分支</span> } ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, <span class="hljs-keyword" style="color: rgb(0, 0, 136);">this</span>); <span class="hljs-comment" style="color: rgb(136, 0, 0);">// 创建Application</span> app = mActivityThread.mInstrumentation.newApplication( cl, appClass, appContext); appContext.setOuterContext(app); } <span class="hljs-keyword" style="color: rgb(0, 0, 136);">catch</span> (Exception e) {... } <span class="hljs-comment" style="color: rgb(136, 0, 0);">// 将前面创建的app添加到应用列表。</span> mActivityThread.mAllApplications.add(app); mApplication = app; ... <span class="hljs-keyword" style="color: rgb(0, 0, 136);">return</span> app;}</code>
在该方法调用之前,已经创建了LoadedApk对象,该对象的成员变量mPackageName=”android”; mClassLoader = ClassLoader.getSystemClassLoader();
Step 3-2. ActivityThread.getSystemContext
<code class="hljs java" style="display: block; padding: 0.5em; color: rgb(0, 0, 0); background: rgb(255, 255, 255);"><span class="hljs-function"><span class="hljs-keyword" style="color: rgb(0, 0, 136);">public</span> ContextImpl <span class="hljs-title">getSystemContext</span><span class="hljs-params" style="color: rgb(102, 0, 102);">()</span> </span>{ <span class="hljs-keyword" style="color: rgb(0, 0, 136);">synchronized</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136);">this</span>) { <span class="hljs-keyword" style="color: rgb(0, 0, 136);">if</span> (mSystemContext == <span class="hljs-keyword" style="color: rgb(0, 0, 136);">null</span>) { <span class="hljs-comment" style="color: rgb(136, 0, 0);">//创建ContextImpl对象【见Step 3-2-1】</span> mSystemContext = ContextImpl.createSystemContext(<span class="hljs-keyword" style="color: rgb(0, 0, 136);">this</span>); } <span class="hljs-keyword" style="color: rgb(0, 0, 136);">return</span> mSystemContext; }}</code>
Step 3-2-1. ContextImpl.createSystemContext
<code class="hljs java" style="display: block; padding: 0.5em; color: rgb(0, 0, 0); background: rgb(255, 255, 255);"><span class="hljs-function"><span class="hljs-keyword" style="color: rgb(0, 0, 136);">static</span> ContextImpl <span class="hljs-title">createSystemContext</span><span class="hljs-params" style="color: rgb(102, 0, 102);">(ActivityThread mainThread)</span> </span>{ <span class="hljs-comment" style="color: rgb(136, 0, 0);">//创建LoadedApk对象</span> LoadedApk packageInfo = <span class="hljs-keyword" style="color: rgb(0, 0, 136);">new</span> LoadedApk(mainThread); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//创建ContextImpl对象</span> ContextImpl context = <span class="hljs-keyword" style="color: rgb(0, 0, 136);">new</span> ContextImpl(<span class="hljs-keyword" style="color: rgb(0, 0, 136);">null</span>, mainThread, packageInfo, <span class="hljs-keyword" style="color: rgb(0, 0, 136);">null</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136);">null</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136);">false</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136);">null</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136);">null</span>, Display.INVALID_DISPLAY); context.mResources.updateConfiguration(context.mResourcesManager.getConfiguration(), context.mResourcesManager.getDisplayMetricsLocked()); <span class="hljs-keyword" style="color: rgb(0, 0, 136);">return</span> context;}</code>
运行到这里,system_server的准备环境基本完成,接下来开始system_server中最为核心的过程,启动系统服务。通过startBootstrapServices()
, startCoreServices()
, startOtherServices()
3个方法。
Step 4. startBootstrapServices
[–>SystemServer.java]
<code class="hljs cpp" style="display: block; padding: 0.5em; color: rgb(0, 0, 0); background: rgb(255, 255, 255);"><span class="hljs-function"><span class="hljs-keyword" style="color: rgb(0, 0, 136);">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136);">void</span> <span class="hljs-title">startBootstrapServices</span><span class="hljs-params" style="color: rgb(102, 0, 102);">()</span> </span>{ <span class="hljs-comment" style="color: rgb(136, 0, 0);">//阻塞等待与installd建立socket通道</span> Installer installer = mSystemServiceManager.startService(Installer.class); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//启动服务ActivityManagerService</span> mActivityManagerService = mSystemServiceManager.startService( ActivityManagerService.Lifecycle.class).getService(); mActivityManagerService.setSystemServiceManager(mSystemServiceManager); mActivityManagerService.setInstaller(installer); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//启动服务PowerManagerService</span> mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//初始化power management</span> mActivityManagerService.initPowerManagement(); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//启动服务LightsService </span> mSystemServiceManager.startService(LightsService.<span class="hljs-keyword" style="color: rgb(0, 0, 136);">class</span>); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//启动服务DisplayManagerService</span> mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//在初始化package manager之前,需要默认的显示</span> mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//当设备正在加密时,仅运行核心</span> String cryptState = SystemProperties.get(<span class="hljs-string" style="color: rgb(0, 136, 0);">"vold.decrypt"</span>); <span class="hljs-keyword" style="color: rgb(0, 0, 136);">if</span> (ENCRYPTING_STATE.equals(cryptState)) { mOnlyCore = <span class="hljs-literal" style="color: rgb(0, 102, 102);">true</span>; } <span class="hljs-keyword" style="color: rgb(0, 0, 136);">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136);">if</span> (ENCRYPTED_STATE.equals(cryptState)) { mOnlyCore = <span class="hljs-literal" style="color: rgb(0, 102, 102);">true</span>; } <span class="hljs-comment" style="color: rgb(136, 0, 0);">//启动服务PackageManagerService</span> mPackageManagerService = PackageManagerService.main(mSystemContext, installer, mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore); mFirstBoot = mPackageManagerService.isFirstBoot(); mPackageManager = mSystemContext.getPackageManager(); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//启动服务UserManagerService,新建目录/data/user/</span> ServiceManager.addService(Context.USER_SERVICE, UserManagerService.getInstance()); AttributeCache.init(mSystemContext); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//设置AMS</span> mActivityManagerService.setSystemProcess(); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//启动传感器服务</span> startSensorService();}</code>
该方法所创建的服务:ActivityManagerService, PowerManagerService, LightsService, DisplayManagerService, PackageManagerService, UserManagerService, sensor服务.
Step 5. startCoreServices
<code class="hljs cpp" style="display: block; padding: 0.5em; color: rgb(0, 0, 0); background: rgb(255, 255, 255);"><span class="hljs-function"><span class="hljs-keyword" style="color: rgb(0, 0, 136);">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136);">void</span> <span class="hljs-title">startCoreServices</span><span class="hljs-params" style="color: rgb(102, 0, 102);">()</span> </span>{ <span class="hljs-comment" style="color: rgb(136, 0, 0);">//启动服务BatteryService,用于统计电池电量,需要LightService.</span> mSystemServiceManager.startService(BatteryService.<span class="hljs-keyword" style="color: rgb(0, 0, 136);">class</span>); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//启动服务UsageStatsService,用于统计应用使用情况</span> mSystemServiceManager.startService(UsageStatsService.<span class="hljs-keyword" style="color: rgb(0, 0, 136);">class</span>); mActivityManagerService.setUsageStatsManager( LocalServices.getService(UsageStatsManagerInternal.class)); mPackageManagerService.getUsageStatsIfNoPackageUsageInfo(); <span class="hljs-comment" style="color: rgb(136, 0, 0);">//启动服务WebViewUpdateService</span> mSystemServiceManager.startService(WebViewUpdateService.<span class="hljs-keyword" style="color: rgb(0, 0, 136);">class</span>);}</code>
启动服务BatteryService,UsageStatsService,WebViewUpdateService。
Step 6. startOtherServices
该方法比较长,有近千行代码,逻辑很简单,主要是启动一系列的服务,这里就不列举源码了,在第四节直接对其中的服务进行一个简单分类。
三、Service启动过程
接下来,开始正式进入启动系统服务的过程。
启动方式
system_server进程中的服务启动方式有两种,
- 一种是通过SystemServiceManager的
startService()
,该方法用于启动继承于SystemService的服务。主要功能:创建serviceClass类的对象,将刚创建对象添加到SystemServiceManager的成员变量mServices,再调用刚创建对象的onStart()方法。对于服务启动到一定阶段,进入相应的Phase时,会调用SystemServiceManager的startBootPhase()
回调方法,该方法会循环遍历所有向SystemServiceManager
注册过的service的onBootPhase()
方法。 - 另一种是通过ServiceManager的
addService(String name, IBinder service)
,该方法用于初始化继承于IBinder的服务。主要功能将该服务向Native层的service Manager注册服务。
启动流程
SystemServiceManager的startBootPhase()
方法贯穿整个阶段,启动阶段从PHASE_WAIT_FOR_DEFAULT_DISPLAY
到PHASE_BOOT_COMPLETED
,如下图:
启动流程分析:
PHASE_WAIT_FOR_DEFAULT_DISPLAY=100
,该阶段等待Display有默认显示;PHASE_LOCK_SETTINGS_READY=480
,进入该阶段服务能获取锁屏设置的数据;PHASE_SYSTEM_SERVICES_READY=500
,进入该阶段服务能安全地调用核心系统服务,如PMS;PHASE_ACTIVITY_MANAGER_READY=550
,进入该阶段服务能广播Intent;PHASE_THIRD_PARTY_APPS_CAN_START=600
,进入该阶段服务能start/bind第三方apps,app能通过BInder调用service;PHASE_BOOT_COMPLETED=1000
,该阶段是发生在Boot完成和home应用启动完毕。系统服务更倾向于监听该阶段,而不是注册广播ACTION_BOOT_COMPLETED,从而降低系统延迟。
Phase 100
创建ActivityManagerService、PowerManagerService、LightsService、DisplayManagerService共4项服务;
接着则进入阶段100
,该阶段调用DisplayManagerService的onBootPhase()
方法。
Phase 480&&500
创建PackageManagerService、WindowManagerService、InputManagerService、NetworkManagerService、DropBoxManagerService/FingerprintService等服务
接着则进入阶段480
,该阶段调用DevicePolicyManagerService的onBootPhase()
方法;紧接着进入阶段500
,实现该阶段的回调方法的服务较多。
Phase 550
WindowManagerService、PowerManagerService、PackageManagerService、DisplayManagerService分别依次执行systemReady()
方法;然后ActivityManagerService进入systemReady()
方法;
接着则进入阶段550
,实现该阶段的回调方法的服务较多。
Phase 600
AMS启动native crash监控,,加载WebView,启动SystemUi;然后是NetworkScoreService、NetworkManagementService、NetworkStatsService、NetworkPolicyManagerService、ConnectivityService、AudioService分别依次执行systemReady()
方法,然后是启动Watchdog。
接着则进入阶段600
,实现该阶段的回调方法的服务较多。
Phase 1000
WallpaperManagerService、InputMethodManagerService、LocationManagerService、CountryDetectorService、NetworkTimeUpdateService、CommonTimeManagementService、TextServicesManagerService、AssetAtlasService、InputManagerService、TelephonyRegistry、MediaRouterService、MmsServiceBroker这些服务依次执行其systemRunning()
方法。经过一定流程,当ActivityManagerServer进入finishBooting()
时,则启动流程进入阶段PHASE_BOOT_COMPLETED=1000
。
到此所有服务启动完成,system_server进程启动完成,则进入Looper.loop()
状态,随时待命,等待MessageQueue中的消息到来,则马上进入执行状态。
四、服务分类
system_server进程,从源码角度划分为引导服务、核心服务、其他服务3类。
- 引导服务:ActivityManagerService、PowerManagerService、LightsService、DisplayManagerService、PackageManagerService、UserManagerService、SensorService共7项服务;
- 核心服务:BatteryService、UsageStatsService、WebViewUpdateService共3项服务;
- 其他服务:AlarmManagerService、VibratorService等共70多项服务
合计总大约80多个服务,下面只是简单地对所有服务分类(个人划分,便于后期分析):
- 重量级服务:ActivityManagerService、PackageManagerService、WindowManagerService
- 功耗相关:PowerManagerService、BatteryService、BatteryStatsService、DreamManagerService
- 统计调度相关:DropBoxManagerService、SamplingProfilerService、UsageStatsService、DiskStatsService、SchedulingPolicyService、DeviceStorageMonitorService、AlarmManagerService、DeviceIdleController、DockObserver、ThermalObserver、JobSchedulerService、AccessibilityManagerService
- UI相关:DisplayManagerService、LightsService、GraphicsStatsService、StatusBarManagerService、NotificationManagerService、WallpaperManagerService、UiModeManagerService、AppWidgetService、LauncherAppsService、TextServicesManagerService、ContentService、LockSettingsService、InputManagerService、InputMethodManagerServiceMountService、FingerprintService、TvInputManagerService
- 网络相关:NetworkManagementService、NetworkScoreService、NetworkStatsService、NetworkPolicyManagerService、ConnectivityService、BluetoothService、WifiP2pService、WifiService、WifiScanningService、EthernetService、WebViewUpdateService
- Media相关:AudioService、MediaRouterService、VoiceInteractionManagerService、MediaProjectionManagerService、MediaSessionService、
- 设备相关:DevicePolicyManagerService、PrintManagerService、BackupManagerService、UserManagerService、AccountManagerService、TrustManagerService、SensorService、LocationManagerService、VibratorService、CountryDetectorService、GestureLauncherService、PersistentDataBlockService、ClipboardService
- 其他:TelephonyRegistry、TelecomLoaderService、NsdService、UpdateLockService、SerialService、SearchManagerService、CommonTimeManagementService、AssetAtlasService、ConsumerIrService、MidiServiceCameraService、TwilightService、RestrictionsManagerService、MmsServiceBroker、RttService、UsbService。
后续,会针对其中比较重要的服务进行展开详解。
- Android系统启动-SystemServer下篇
- Android系统启动-SystemServer下篇
- Android系统启动-SystemServer下篇
- (OK) Android系统启动-SystemServer下篇
- Android系统启动-SystemServer
- Android系统启动-SystemServer上篇
- Android系统启动-SystemServer上篇
- (OK) Android系统启动-SystemServer上篇
- Android系统启动——SystemServer进程启动
- Android SystemServer
- Android SystemServer学习
- Android SystemServer学习
- Android SystemServer学习
- Android SystemServer 启动流程
- Android SystemServer总结
- Android SystemServer 解析
- android L 之 SystemServer
- android L 之SystemServer
- 矩阵相乘快速幂
- Yii2.0 场景的使用
- 基于Windows8与Visual Studio11开发第一个USB内核驱动程序
- 程序员的乐园
- 用Microsoft Chart Controls(MSChart)实现曲线图,并支持拖动放大到秒
- Android系统启动-SystemServer下篇
- ARM概念梳理:Architecture, Core, CPU,SOC
- (一)JavaScript基本了解
- php对象接口
- WINDOWS7(vs2012+wdk7.6) 配置驱动开发环境
- iOS 获取系统时间
- 自定义控件之RoundView
- R语言-时间序列函数整理
- bit与Byte