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的启动流程图:

 

    

 

posted @   Android技术  阅读(1174)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示