转自:http://gityuan.com/2016/02/20/android-system-server-2/

基于Android 6.0的源码剖析, 分析Android启动过程的system_server进程

frameworks/base/core/java/android/app/ActivityThread.java
frameworks/base/core/java/android/app/LoadedApk.java
frameworks/base/core/java/android/app/ContextImpl.java
frameworks/base/core/java/com/android/server/LocalServices.java
frameworks/base/services/java/com/android/server/SystemServer.java
frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
frameworks/base/services/core/java/com/android/server/ServiceThread.java
frameworks/base/services/core/java/com/android/server/pm/Installer.java
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

一、启动调用栈

System_server启动函数调用类的栈关系:

SystemServer.mainSystemServer.runcreateSystemContextActivityThread.systemMainActivityThread.attachLoadedApk.makeApplicationActivityThread.getSystemContextContextImpl.createSystemContextstartBootstrapServices(); startCoreServices();    startOtherServices();Looper.loop();

二、 SystemServer分析

上一篇文章Android系统启动-systemServer上篇讲解了从Zygote一路启动到SystemServer的过程,本文重要是讲述system_server所承载的java framework的系统服务框架,是如何一路路启动的。

Step 1. SystemServer.main

public static void main(String[] args) {//先初始化SystemServer对象,再调用对象的run()方法, 【见Step 2】new SystemServer().run();
}

Step 2. SystemServer.run

private void run() {//当系统时间比1970年更早,就设置当前系统时间为1970年if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);}//变更虚拟机的库文件,对于Android 6.0默认采用的是libart.soSystemProperties.set("persist.sys.dalvik.vm.lib.2", VMRuntime.getRuntime().vmLibrary());//isEnabled()为true,则开启采用分析器if (SamplingProfilerIntegration.isEnabled()) {SamplingProfilerIntegration.start();mProfilerSnapshotTimer = new Timer();//system_server每隔1小时采用一次,并保存结果到system_server文件mProfilerSnapshotTimer.schedule(new TimerTask() {@Overridepublic void run() {SamplingProfilerIntegration.writeSnapshot("system_server", null);}}, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);}//清除vm内存增长上限,由于启动过程需要较多的虚拟机内存空间VMRuntime.getRuntime().clearGrowthLimit();//设置内存的可能有效使用率为0.8VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);// 针对部分设备依赖于运行时就产生指纹信息,因此需要在开机完成前已经定义Build.ensureFingerprintProperty();//访问环境变量前,需要明确地指定用户Environment.setUserRequired(true);//确保当前系统进程的binder调用,总是运行在前台优先级(foreground priority)BinderInternal.disableBackgroundScheduling(true);android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);android.os.Process.setCanSelfBackground(false);// 主线程looper就在当前线程运行Looper.prepareMainLooper();//加载android_servers.so库,该库包含的源码在frameworks/base/services/目录下System.loadLibrary("android_servers");//检测上次关机过程是否失败,该方法可能不会返回performPendingShutdown();//初始化系统上下文 【见Step 3】createSystemContext();//创建系统服务管理mSystemServiceManager = new SystemServiceManager(mSystemContext);//将mSystemServiceManager添加到本地服务的成员sLocalServiceObjectsLocalServices.addService(SystemServiceManager.class, mSystemServiceManager);//启动各种系统服务try {startBootstrapServices(); // 启动引导服务【见Step 4】startCoreServices();      // 启动核心服务【见Step 5】startOtherServices();     // 启动其他服务【见Step 6】} catch (Throwable ex) {Slog.e("System", "************ Failure starting system services", ex);throw ex;}//用于debug版本,将log事件不断循环地输出到dropbox(用于分析)if (StrictMode.conditionallyEnableDebugLogging()) {Slog.i(TAG, "Enabled StrictMode for system server main thread.");}//一直循环执行Looper.loop();throw new RuntimeException("Main thread loop unexpectedly exited");
}

LocalServices通过用静态Map变量sLocalServiceObjects,来保存以服务类名为key,以具体服务对象为value的Map结构。

Step 3. SystemServer.createSystemContext

private void createSystemContext() {//创建ActivityThread对象【见Step 3-1】ActivityThread activityThread = ActivityThread.systemMain();//创建ContextImpl、LoadedApk对象【见Step 3-2】mSystemContext = activityThread.getSystemContext();//设置主题mSystemContext.setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar);
}

Step 3-1. ActivityThread.systemMain

public static ActivityThread systemMain() {//对于低内存的设备,禁用硬件加速if (!ActivityManager.isHighEndGfx()) {HardwareRenderer.disable(true);} else {HardwareRenderer.enableForegroundTrimming();}// 创建ActivityThreadActivityThread thread = new ActivityThread();// 创建Application以及调用其onCreate()方法【见Step 3-1-1】thread.attach(true);return thread;
}

Step 3-1-1. ActivityThread.attach

private void attach(boolean system) {sCurrentActivityThread = this;mSystemThread = system;if (!system) {...} else {//system=true,进入此分支android.ddm.DdmHandleAppName.setAppName("system_process",UserHandle.myUserId());try {mInstrumentation = new Instrumentation();// 创建应用上下文ContextImpl context = ContextImpl.createAppContext(this, getSystemContext().mPackageInfo);//创建Application 【见Step 3-1-1-1】mInitialApplication = context.mPackageInfo.makeApplication(true, null);//调用Application.onCreate()方法mInitialApplication.onCreate();} catch (Exception e) {throw new RuntimeException("Unable to instantiate Application():" + e.toString(), e);}}//添加dropbox log信息到libcoreDropBox.setReporter(new DropBoxReporter());// 设置回调方法ViewRootImpl.addConfigCallback(new ComponentCallbacks2() {@Overridepublic void onConfigurationChanged(Configuration newConfig) {synchronized (mResourcesManager) {if (mResourcesManager.applyConfigurationToResourcesLocked(newConfig, null)) {if (mPendingConfiguration == null ||mPendingConfiguration.isOtherSeqNewer(newConfig)) {mPendingConfiguration = newConfig;sendMessage(H.CONFIGURATION_CHANGED, newConfig);}}}}@Overridepublic void onLowMemory() {}@Overridepublic void onTrimMemory(int level) {}});
}

主要工作是创建应用上下文ContextImpl,创建Application以及调用其onCreate()方法,设置DropBox以及ComponentCallbacks2回调方法。

Step 3-1-1-1. LoadedApk.makeApplication

public Application makeApplication(boolean forceDefaultAppClass,Instrumentation instrumentation) {if (mApplication != null) {return mApplication;}Application app = null;String appClass = mApplicationInfo.className;if (forceDefaultAppClass || (appClass == null)) {appClass = "android.app.Application"; //设置class名}try {java.lang.ClassLoader cl = getClassLoader();if (!mPackageName.equals("android")) {initializeJavaContextClassLoader(); //不进入该分支}ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);// 创建Applicationapp = mActivityThread.mInstrumentation.newApplication(cl, appClass, appContext);appContext.setOuterContext(app);} catch (Exception e) {...}// 将前面创建的app添加到应用列表。mActivityThread.mAllApplications.add(app);mApplication = app;...return app;
}

在该方法调用之前,已经创建了LoadedApk对象,该对象的成员变量mPackageName=”android”; mClassLoader = ClassLoader.getSystemClassLoader();

Step 3-2. ActivityThread.getSystemContext

public ContextImpl getSystemContext() {synchronized (this) {if (mSystemContext == null) {//创建ContextImpl对象【见Step 3-2-1】mSystemContext = ContextImpl.createSystemContext(this);}return mSystemContext;}
}

Step 3-2-1. ContextImpl.createSystemContext

static ContextImpl createSystemContext(ActivityThread mainThread) {//创建LoadedApk对象LoadedApk packageInfo = new LoadedApk(mainThread);//创建ContextImpl对象ContextImpl context = new ContextImpl(null, mainThread,packageInfo, null, null, false, null, null, Display.INVALID_DISPLAY);context.mResources.updateConfiguration(context.mResourcesManager.getConfiguration(), context.mResourcesManager.getDisplayMetricsLocked());return context;
}

运行到这里,system_server的准备环境基本完成,接下来开始system_server中最为核心的过程,启动系统服务。通过startBootstrapServices(), startCoreServices(), startOtherServices()3个方法。

Step 4. startBootstrapServices

[–>SystemServer.java]

private void startBootstrapServices() {//阻塞等待与installd建立socket通道Installer installer = mSystemServiceManager.startService(Installer.class);//启动服务ActivityManagerServicemActivityManagerService = mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService();mActivityManagerService.setSystemServiceManager(mSystemServiceManager);mActivityManagerService.setInstaller(installer);//启动服务PowerManagerServicemPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);//初始化power managementmActivityManagerService.initPowerManagement();//启动服务LightsService mSystemServiceManager.startService(LightsService.class);//启动服务DisplayManagerServicemDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);//在初始化package manager之前,需要默认的显示mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);//当设备正在加密时,仅运行核心String cryptState = SystemProperties.get("vold.decrypt");if (ENCRYPTING_STATE.equals(cryptState)) {mOnlyCore = true;} else if (ENCRYPTED_STATE.equals(cryptState)) {mOnlyCore = true;}//启动服务PackageManagerServicemPackageManagerService = PackageManagerService.main(mSystemContext, installer,mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);mFirstBoot = mPackageManagerService.isFirstBoot();mPackageManager = mSystemContext.getPackageManager();//启动服务UserManagerService,新建目录/data/user/ServiceManager.addService(Context.USER_SERVICE, UserManagerService.getInstance());AttributeCache.init(mSystemContext);//设置AMSmActivityManagerService.setSystemProcess();//启动传感器服务startSensorService();
}

该方法所创建的服务:ActivityManagerService, PowerManagerService, LightsService, DisplayManagerService, PackageManagerService, UserManagerService, sensor服务.

Step 5. startCoreServices

private void startCoreServices() {//启动服务BatteryService,用于统计电池电量,需要LightService.mSystemServiceManager.startService(BatteryService.class);//启动服务UsageStatsService,用于统计应用使用情况mSystemServiceManager.startService(UsageStatsService.class);mActivityManagerService.setUsageStatsManager(LocalServices.getService(UsageStatsManagerInternal.class));mPackageManagerService.getUsageStatsIfNoPackageUsageInfo();//启动服务WebViewUpdateServicemSystemServiceManager.startService(WebViewUpdateService.class);
}

启动服务BatteryService,UsageStatsService,WebViewUpdateService。

Step 6. startOtherServices

该方法比较长,有近千行代码,逻辑很简单,主要是启动一系列的服务,这里就不列举源码了,在第四节直接对其中的服务进行一个简单分类。

三、Service启动过程

接下来,开始正式进入启动系统服务的过程。

启动方式

system_server进程中的服务启动方式有两种,

  1. 一种是通过SystemServiceManager的startService(),该方法用于启动继承于SystemService的服务。主要功能:创建serviceClass类的对象,将刚创建对象添加到SystemServiceManager的成员变量mServices,再调用刚创建对象的onStart()方法。对于服务启动到一定阶段,进入相应的Phase时,会调用SystemServiceManager的startBootPhase()回调方法,该方法会循环遍历所有向SystemServiceManager注册过的service的onBootPhase()方法。
  2. 另一种是通过ServiceManager的addService(String name, IBinder service),该方法用于初始化继承于IBinder的服务。主要功能将该服务向Native层的service Manager注册服务。

启动流程

SystemServiceManager的startBootPhase()方法贯穿整个阶段,启动阶段从PHASE_WAIT_FOR_DEFAULT_DISPLAYPHASE_BOOT_COMPLETED,如下图:

启动流程分析:

  1. PHASE_WAIT_FOR_DEFAULT_DISPLAY=100,该阶段等待Display有默认显示;
  2. PHASE_LOCK_SETTINGS_READY=480,进入该阶段服务能获取锁屏设置的数据;
  3. PHASE_SYSTEM_SERVICES_READY=500,进入该阶段服务能安全地调用核心系统服务,如PMS;
  4. PHASE_ACTIVITY_MANAGER_READY=550,进入该阶段服务能广播Intent;
  5. PHASE_THIRD_PARTY_APPS_CAN_START=600,进入该阶段服务能start/bind第三方apps,app能通过BInder调用service;
  6. 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类。

  1. 引导服务:ActivityManagerService、PowerManagerService、LightsService、DisplayManagerService、PackageManagerService、UserManagerService、SensorService共7项服务;
  2. 核心服务:BatteryService、UsageStatsService、WebViewUpdateService共3项服务;
  3. 其他服务:AlarmManagerService、VibratorService等共70多项服务

合计总大约80多个服务,下面只是简单地对所有服务分类(个人划分,便于后期分析):

  1. 重量级服务:ActivityManagerServicePackageManagerServiceWindowManagerService
  2. 功耗相关:PowerManagerService、BatteryService、BatteryStatsService、DreamManagerService
  3. 统计调度相关:DropBoxManagerServiceSamplingProfilerService、UsageStatsService、DiskStatsService、SchedulingPolicyService、DeviceStorageMonitorService、AlarmManagerService、DeviceIdleController、DockObserver、ThermalObserver、JobSchedulerService、AccessibilityManagerService
  4. UI相关:DisplayManagerService、LightsService、GraphicsStatsService、StatusBarManagerService、NotificationManagerService、WallpaperManagerService、UiModeManagerService、AppWidgetService、LauncherAppsService、TextServicesManagerService、ContentService、LockSettingsService、InputManagerService、InputMethodManagerServiceMountService、FingerprintService、TvInputManagerService
  5. 网络相关:NetworkManagementService、NetworkScoreService、NetworkStatsService、NetworkPolicyManagerService、ConnectivityService、BluetoothService、WifiP2pService、WifiService、WifiScanningService、EthernetService、WebViewUpdateService
  6. Media相关:AudioService、MediaRouterService、VoiceInteractionManagerService、MediaProjectionManagerService、MediaSessionService、
  7. 设备相关:DevicePolicyManagerService、PrintManagerService、BackupManagerService、UserManagerService、AccountManagerService、TrustManagerService、SensorService、LocationManagerService、VibratorService、CountryDetectorService、GestureLauncherService、PersistentDataBlockService、ClipboardService
  8. 其他:TelephonyRegistry、TelecomLoaderService、NsdService、UpdateLockService、SerialService、SearchManagerService、CommonTimeManagementService、AssetAtlasService、ConsumerIrService、MidiServiceCameraService、TwilightService、RestrictionsManagerService、MmsServiceBroker、RttService、UsbService。

后续,会针对其中比较重要的服务进行展开详解。

Android系统启动-SystemServer下篇相关推荐

  1. Android 7.1.2(Android N) Android系统启动流程

    Android 7.1.2(Android N) Android系统启动流程 源码: system/core/rootdir/ init.rc init.zygote64.rc system/core ...

  2. Android系统启动-zygote篇

    基于Android 6.0的源码剖析, 分析Android启动过程的Zygote进程 /frameworks/base/cmds/app_process/App_main.cpp (内含AppRunt ...

  3. android 重启app_[Boot]Android系统启动-zygote篇

    本文转载自Gityuan的博客,原文地址为:http://gityuan.com/2016/02/13/android-zygote/ 转载请注明作者及原文链接. 基于Android 6.0的源码剖析 ...

  4. Android系统启动流程—— init进程zygote进程SystemServer进程启动流程

    原文地址:https://blog.csdn.net/qq_30993595/article/details/82714409 Android系统启动流程 Android系统启动过程往细了说可以分为5 ...

  5. 从源码解析-Android系统启动流程概述 init进程zygote进程SystemServer进程启动流程

    Android系统启动流程 启动流程 Loader Kernel Native Framework Application init进程 启动 rc文件规则 Actions Commands Serv ...

  6. Android 系统启动过程

    文章来源于网络,心得来源于整理. 请尊重作者:http://hi.baidu.com/guoxiaoming/blog/item/24e9e9f8c9628f1fd9f9fd89.html/cmtid ...

  7. 深入浅出Android系统启动流程

    转载请标明出处:[顾林海的博客] 本篇文章已授权微信公众号 顾林海 独家发布 init进程启动过程 init进程概述 Android系统基于Linux,init进程是Android系统中用户空间的第一 ...

  8. Android系统启动流程分析之安装应用

    2016六月 21 原 Android系统启动流程分析之安装应用 分类:Android系统源码研究 (295)  (0)  举报  收藏 跟随上一篇博客Android系统的启动流程简要分析继续分析an ...

  9. Android开发——Android系统启动以及APK安装、启动过程

    0. 前言   从Android手机打开开关,到我们可以使用其中的app时,这个启动过程到底是怎么样的? 1.  系统上电 当给Android系统上电,在电源接通的瞬间,CPU内的寄存器和各引脚均会被 ...

最新文章

  1. 邮件发送打印机更改打印机连接的通知
  2. 跨域调用报表展现页面的flash打印方法
  3. VS与SVN的交互VisualSVN
  4. android 信息添加附件功能,Android实现带附件的邮件发送功能
  5. 兄弟连区块链教程Fabric1.0源代码分析Peer peer根命令入口及加载子命令一
  6. 从底层重学 Java 之两大浮点类型 GitChat连接
  7. 一种基于memcache或redis缓存架构的验证码
  8. 检查出某个文件的大小
  9. jsf用于页面判断的标签_用于操作和导航的JSF命令组件标签
  10. Android(安卓)手机变砖复活的三种恢复方法
  11. ABB伺服驱动调试(四)
  12. 用java实现一个简单的网络聊天室
  13. 如何下载网页上的视频和flash的方法
  14. TimestampUtil时间处理工具类
  15. 计算机专业学生社会实践,计算机专业学生社会实践报告
  16. 后台管理页面通过点击左侧导航栏的菜单项实现右边内容的改变
  17. Quartus 平台 FPGA 片内 RAM 使用
  18. ASP.NET MVC 远程请求图片 转化成BASE64然后通过HTTP输出流显示
  19. 下载iCloud照片/文件的正确姿势(亲测好使)
  20. 南宁计算机专业学校排名,学校排名

热门文章

  1. Hbuilder--让手爽,飞一般的编码(二)
  2. linux tomcat配置https
  3. SDUT 2170 The Largest SCC bfs+tarjan
  4. RG-AP220-E
  5. 跪求***基地的邀请码
  6. oracle查询小时差,ORACLE小时段 Connect By的查询,感觉还是有点难度的。
  7. Javascript第五章innerHTML/innerText/创建新节点元素添加内容第八课
  8. python迭代器和生成器_Python迭代器与生成器
  9. html文件vbs病毒,一段病毒常用的VBS代码
  10. 征途服务管理器显示不出启动服务器,征途服务器管理器连接数据库