AMS是Android中最核心的服務,主要負責系統中四大組件的啟動、切換、調度
及應用進程的管理和調度
等工作,其職責與操作系統中的進程管理和調度模塊相類似,因此它在Android中非常重要。
客戶端使用ActivityManager類。由於AMS是系統核心服務,很多API不能開放供客戶端使用,所以設計者沒有讓ActivityManager直接加入AMS家族。在ActivityManager類內部通過調用AMN的getDefault函數得到一個ActivityManagerProxy對象,通過它可與AMS通信。
源碼分析流程使用Android O 的源碼 即Android8.0
>AMS啟動流程源碼分析
1.AMS由SystemServer的ServerThread線程創建,代碼如下:
由以上代碼分析可得:
AMS的創建是通過ActivityManagerService.java里面的Lifecycle類創建出來的。該LifeCycle的代碼如下:
這個其實很好理解啦,就相當於AMS的生命周期。在后面的源碼分析中我們會經常看到這個類,沒什么好說的,就相當於一個服務的生命周期,從創建到銷毀的整個過程。
我們去看一下AMS的構造方法里面有些什么東西,代碼如下:
1 public ActivityManagerService(Context systemContext) { 2 LockGuard.installLock(this, LockGuard.INDEX_ACTIVITY); 3 mInjector = new Injector(); 4 mContext = systemContext; 5 6 mFactoryTest = FactoryTest.getMode(); 7 mSystemThread = ActivityThread.currentActivityThread(); 8 mUiContext = mSystemThread.getSystemUiContext(); 9 10 Slog.i(TAG, "Memory class: " + ActivityManager.staticGetMemoryClass()); 11 12 mPermissionReviewRequired = mContext.getResources().getBoolean( 13 com.android.internal.R.bool.config_permissionReviewRequired); 14 15 mHandlerThread = new ServiceThread(TAG, 16 THREAD_PRIORITY_FOREGROUND, false /*allowIo*/); 17 mHandlerThread.start(); 18 mHandler = new MainHandler(mHandlerThread.getLooper()); 19 mUiHandler = mInjector.getUiHandler(this); 20 21 mConstants = new ActivityManagerConstants(this, mHandler); 22 23 /* static; one-time init here */ 24 if (sKillHandler == null) { 25 sKillThread = new ServiceThread(TAG + ":kill", 26 THREAD_PRIORITY_BACKGROUND, true /* allowIo */); 27 sKillThread.start(); 28 sKillHandler = new KillHandler(sKillThread.getLooper()); 29 } 30 31 mFgBroadcastQueue = new BroadcastQueue(this, mHandler, 32 "foreground", BROADCAST_FG_TIMEOUT, false); 33 mBgBroadcastQueue = new BroadcastQueue(this, mHandler, 34 "background", BROADCAST_BG_TIMEOUT, true); 35 mBroadcastQueues[0] = mFgBroadcastQueue; 36 mBroadcastQueues[1] = mBgBroadcastQueue; 37 38 mServices = new ActiveServices(this); 39 mProviderMap = new ProviderMap(this); 40 mAppErrors = new AppErrors(mUiContext, this); 41 42 // TODO: Move creation of battery stats service outside of activity manager service. 43 File dataDir = Environment.getDataDirectory(); 44 File systemDir = new File(dataDir, "system"); 45 systemDir.mkdirs(); 46 mBatteryStatsService = new BatteryStatsService(systemDir, mHandler); 47 mBatteryStatsService.getActiveStatistics().readLocked(); 48 mBatteryStatsService.scheduleWriteToDisk(); 49 mOnBattery = DEBUG_POWER ? true 50 : mBatteryStatsService.getActiveStatistics().getIsOnBattery(); 51 mBatteryStatsService.getActiveStatistics().setCallback(this); 52 53 mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats")); 54 55 mAppOpsService = mInjector.getAppOpsService(new File(systemDir, "appops.xml"), mHandler); 56 mAppOpsService.startWatchingMode(AppOpsManager.OP_RUN_IN_BACKGROUND, null, 57 new IAppOpsCallback.Stub() { 58 @Override public void opChanged(int op, int uid, String packageName) { 59 if (op == AppOpsManager.OP_RUN_IN_BACKGROUND && packageName != null) { 60 if (mAppOpsService.checkOperation(op, uid, packageName) 61 != AppOpsManager.MODE_ALLOWED) { 62 runInBackgroundDisabled(uid); 63 } 64 } 65 } 66 }); 67 68 mGrantFile = new AtomicFile(new File(systemDir, "urigrants.xml")); 69 70 mUserController = new UserController(this); 71 72 mVrController = new VrController(this); 73 74 GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version", 75 ConfigurationInfo.GL_ES_VERSION_UNDEFINED); 76 77 if (SystemProperties.getInt("sys.use_fifo_ui", 0) != 0) { 78 mUseFifoUiScheduling = true; 79 } 80 81 mTrackingAssociations = "1".equals(SystemProperties.get("debug.track-associations")); 82 mTempConfig.setToDefaults(); 83 mTempConfig.setLocales(LocaleList.getDefault()); 84 mConfigurationSeq = mTempConfig.seq = 1; 85 mStackSupervisor = createStackSupervisor(); 86 mStackSupervisor.onConfigurationChanged(mTempConfig); 87 mKeyguardController = mStackSupervisor.mKeyguardController; 88 mCompatModePackages = new CompatModePackages(this, systemDir, mHandler); 89 mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler); 90 mTaskChangeNotificationController = 91 new TaskChangeNotificationController(this, mStackSupervisor, mHandler); 92 mActivityStarter = new ActivityStarter(this, mStackSupervisor); 93 mRecentTasks = new RecentTasks(this, mStackSupervisor); 94 95 mProcessCpuThread = new Thread("CpuTracker") { 96 @Override 97 public void run() { 98 synchronized (mProcessCpuTracker) { 99 mProcessCpuInitLatch.countDown(); 100 mProcessCpuTracker.init(); 101 } 102 while (true) { 103 try { 104 try { 105 synchronized(this) { 106 final long now = SystemClock.uptimeMillis(); 107 long nextCpuDelay = (mLastCpuTime.get()+MONITOR_CPU_MAX_TIME)-now; 108 long nextWriteDelay = (mLastWriteTime+BATTERY_STATS_TIME)-now; 109 //Slog.i(TAG, "Cpu delay=" + nextCpuDelay 110 // + ", write delay=" + nextWriteDelay); 111 if (nextWriteDelay < nextCpuDelay) { 112 nextCpuDelay = nextWriteDelay; 113 } 114 if (nextCpuDelay > 0) { 115 mProcessCpuMutexFree.set(true); 116 this.wait(nextCpuDelay); 117 } 118 } 119 } catch (InterruptedException e) { 120 } 121 updateCpuStatsNow(); 122 } catch (Exception e) { 123 Slog.e(TAG, "Unexpected exception collecting process stats", e); 124 } 125 } 126 } 127 }; 128 129 Watchdog.getInstance().addMonitor(this); 130 Watchdog.getInstance().addThread(mHandler); 131 }
主要內容包括:
1>.主線程mHandlerThread創建並啟動(Android UI線程)
2>.創建了一個工作目錄:/data/system (AMS的活動目錄)
3>.ActiveService,ActivityStackSupervisor的創建(專門用於管理Activity)
4>.AMS的守護進程Watchdog(俗稱 “看門狗”)
2.AMS的啟動流程分析:
AMS的啟動流程主要分為三個階段:
1>.startService()階段
2>.setSystemProcess()階段
3>.startOtherServices()階段
我們先看看startService()階段的相關代碼:
由上面的兩段代碼分析AMS的啟動流程主要做了那些事情可知:
1>.添加到mServices集合中(收集所有的系統服務,AMS,WMS,PKMS這些,方便於拿到這些服務並與之通信)
2>.移除所有的進程組removeAllProcessGroups()
3>.啟動CpuTracker線程 mProcessCpuThread
4>.啟動電池電量統計服務BatteryStatsService
5>.創建LocalServices,並添加到LocalServices
2>.第二階段:setSystemProcess()階段
由源碼得知:這個階段主要做了以下幾件事情:
1>.添加各種系統服務。
2>.安裝所有的系統APP並創建用於性能分析的Profile對象
3>.創建ProcessRecord對象
3>.第三階段:startOtherServices()階段
startOtherServices()與AMS相關的代碼,主要是:
1>.mActivityManagerService.installSystemProviders(); 安裝系統的Providers,並創建系統核心Setting Observer 用於監控系統Setting的改變
2>.mActivityManagerService.setWindowManager(wm); 與WMS窗口管理服務相關聯
3>.mActivityManagerService.systemReady()
3.1>.啟動SystemUI
3.2>.一系列服務的systemReady
3.3>.啟動桌面應用:startHomeActivityLocked()
到這里整個AMS服務就啟動完成了。
總結:
AMS的啟動流程圖: