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的启动流程图:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架