Android-AMS(一)-啟動流程分析


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的啟動流程圖:

 

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM