ATM和AMS启动流程

AMS 即 ActivityManagerService,负责 Activy、Service、Broadcast、ContentProvider 四大组件的生命周期管理。本文主要介绍 AMS 的启动流程和初始化过程。AMS 在初始化的过程中,也伴随着了ATMS(ActivityTaskManagerService)的初始化

记得我们在system_server进程启动流程这一篇讲过,里面其中包括了创建SystemServerManager,再看下源码,在SystemServer类中run方法中:

startBootstrapServices:

 跳转到startBootstrapServices中去看:

注:10.0之后添加了ActivityTaskManagerService这个服务 ,简称ATM,这里启动了ATM服务

接下来看ActivityTaskManagerService Lifecyle这个类

 public static final class Lifecycle extends SystemService {
1006          private final ActivityTaskManagerService mService;
1007  
1008          public Lifecycle(Context context) {
1009              super(context);
1010              mService = new ActivityTaskManagerService(context);
1011          }
1012  
1013          @Override
1014          public void onStart() {
1015              publishBinderService(Context.ACTIVITY_TASK_SERVICE, mService);
1016              mService.start();
1017          }
1018  
1019          @Override
1020          public void onUnlockUser(int userId) {
1021              synchronized (mService.getGlobalLock()) {
1022                  mService.mStackSupervisor.onUserUnlocked(userId);
1023              }
1024          }
1025  
1026          @Override
1027          public void onCleanupUser(int userId) {
1028              synchronized (mService.getGlobalLock()) {
1029                  mService.mStackSupervisor.mLaunchParamsPersister.onCleanupUser(userId);
1030              }
1031          }
1032  
1033          public ActivityTaskManagerService getService() {
1034              return mService;
1035          }
1036      }
1037  

构造函数中创建了ATM这个服务,

     @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
723      public ActivityTaskManagerService(Context context) {
724          mContext = context;
725          mFactoryTest = FactoryTest.getMode();
726          mSystemThread = ActivityThread.currentActivityThread();
727          mUiContext = mSystemThread.getSystemUiContext();
728          mLifecycleManager = new ClientLifecycleManager();
729          mInternal = new LocalService();
730          GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version", GL_ES_VERSION_UNDEFINED);
731          mWindowOrganizerController = new WindowOrganizerController(this);
732          mTaskOrganizerController = mWindowOrganizerController.mTaskOrganizerController;
733      }

在 ATM构造函数中,有其中这样一段代码:

mLifecycleManager = new ClientLifecleManager();创建了Activity生命周期管理类。

回过头来看ActivityTaskManagerService Lifecycle类中的onStart方法里面publishBinderService,这个方法做了什么呢

看SystemService中的这个方法:

最终调用的是ServiceManager addService,也就是将ATM这个服务添加到ServiceManager中。

ATM创建完成,接着就是AMS创建

调用的是AMS中Lifecycle中的startService

 public static final class Lifecycle extends SystemService {
2324          private final ActivityManagerService mService;
2325          private static ActivityTaskManagerService sAtm;
2326  
2327          public Lifecycle(Context context) {
2328              super(context);
2329              mService = new ActivityManagerService(context, sAtm);
2330          }
2331  
2332          public static ActivityManagerService startService(
2333                  SystemServiceManager ssm, ActivityTaskManagerService atm) {
2334              sAtm = atm;
2335              return ssm.startService(ActivityManagerService.Lifecycle.class).getService();
2336          }
2337  
2338          @Override
2339          public void onStart() {
2340              mService.start();
2341          }
2342  
2343          @Override
2344          public void onBootPhase(int phase) {
2345              mService.mBootPhase = phase;
2346              if (phase == PHASE_SYSTEM_SERVICES_READY) {
2347                  mService.mBatteryStatsService.systemServicesReady();
2348                  mService.mServices.systemServicesReady();
2349              } else if (phase == PHASE_ACTIVITY_MANAGER_READY) {
2350                  mService.startBroadcastObservers();
2351              } else if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) {
2352                  mService.mPackageWatchdog.onPackagesReady();
2353              }
2354          }
2355  
2356          @Override
2357          public void onCleanupUser(int userId) {
2358              mService.mBatteryStatsService.onCleanupUser(userId);
2359          }
2360  
2361          public ActivityManagerService getService() {
2362              return mService;
2363          }
2364      }

再调用的是ServiceManager里面的startService。Lifecycle构造函数中初始化了AMS,和在ATM中的Lifecycle类似,创建了ATM服务。

看ATM的这个构造函数

 

代码很多,我这边很多就截个图,具体的小伙伴们自己可以去源码中去看。

到ActivityTaskManager中的initialize方法里面去看下哈,

 public void initialize(IntentFirewall intentFirewall, PendingIntentController intentController,
837              Looper looper) {
838          mH = new H(looper);
839          mUiHandler = new UiHandler();
840          mIntentFirewall = intentFirewall;
841          final File systemDir = SystemServiceManager.ensureSystemDir();
842          mAppWarnings = createAppWarnings(mUiContext, mH, mUiHandler, systemDir);
843          mCompatModePackages = new CompatModePackages(this, systemDir, mH);
844          mPendingIntentController = intentController;
845          mStackSupervisor = createStackSupervisor();
846  
847          mTaskChangeNotificationController =
848                  new TaskChangeNotificationController(mGlobalLock, mStackSupervisor, mH);
849          mLockTaskController = new LockTaskController(mContext, mStackSupervisor, mH);
850          mActivityStartController = new ActivityStartController(this);
851          setRecentTasks(new RecentTasks(this, mStackSupervisor));
852          mVrController = new VrController(mGlobalLock);
853          mKeyguardController = mStackSupervisor.getKeyguardController();
854      }

其中mStackSupervisor = createStackSupervisor() 创建了Activity栈管理对象。

setRecentTask:设置当前任务栈

AMS和ATM是相关联的,那么代码中哪一块设置了它们之间的关系呢?

我们再次回到SystemServer中去,看代码,如下图红色框线中所示

SystemServer中startBootstrapService 后接着有比较重要的一些方法,比如setSystemProcess

  public void setSystemProcess() {
2100          try {
2101              ServiceManager.addService(Context.ACTIVITY_SERVICE, this, /* allowIsolated= */ true,
2102                      DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO);
2103              ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
2104              ServiceManager.addService("meminfo", new MemBinder(this), /* allowIsolated= */ false,
2105                      DUMP_FLAG_PRIORITY_HIGH);
2106              ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
2107              ServiceManager.addService("dbinfo", new DbBinder(this));
2108              if (MONITOR_CPU_USAGE) {
2109                  ServiceManager.addService("cpuinfo", new CpuBinder(this),
2110                          /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
2111              }
2112              ServiceManager.addService("permission", new PermissionController(this));
2113              ServiceManager.addService("processinfo", new ProcessInfoService(this));
2114              ServiceManager.addService("cacheinfo", new CacheBinder(this));
2115  
2116              ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(
2117                      "android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);
2118              mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());
2119  
2120              synchronized (this) {
2121                  ProcessRecord app = mProcessList.newProcessRecordLocked(info, info.processName,
2122                          false,
2123                          0,
2124                          new HostingRecord("system"));
2125                  app.setPersistent(true);
2126                  app.pid = MY_PID;
2127                  app.getWindowProcessController().setPid(MY_PID);
2128                  app.maxAdj = ProcessList.SYSTEM_ADJ;
2129                  app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);
2130                  addPidLocked(app);
2131                  mProcessList.updateLruProcessLocked(app, false, null);
2132                  updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE);
2133              }
2134          } catch (PackageManager.NameNotFoundException e) {
2135              throw new RuntimeException(
2136                      "Unable to find android system package", e);
2137          }
2138  
2139          // Start watching app ops after we and the package manager are up and running.
2140          mAppOpsService.startWatchingMode(AppOpsManager.OP_RUN_IN_BACKGROUND, null,
2141                  new IAppOpsCallback.Stub() {
2142                      @Override public void opChanged(int op, int uid, String packageName) {
2143                          if (op == AppOpsManager.OP_RUN_IN_BACKGROUND && packageName != null) {
2144                              if (getAppOpsManager().checkOpNoThrow(op, uid, packageName)
2145                                      != AppOpsManager.MODE_ALLOWED) {
2146                                  runInBackgroundDisabled(uid);
2147                              }
2148                          }
2149                      }
2150                  });
2151  
2152          final int[] cameraOp = {AppOpsManager.OP_CAMERA};
2153          mAppOpsService.startWatchingActive(cameraOp, new IAppOpsActiveCallback.Stub() {
2154              @Override
2155              public void opActiveChanged(int op, int uid, String packageName, boolean active) {
2156                  cameraActiveChanged(uid, active);
2157              }
2158          });
2159      }

主要做的就是添加一些service。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/356238.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QT使用QFileSystemModel实现的文件资源管理器(开源)

文章目录 效果图现实的功能总体框架功能介绍视图双击进入处理复制与剪切粘贴重命名,新建显示文件详细信息文件路径导航栏 总结 效果图 现实的功能 支持文件/文件夹复制,粘贴,剪切,删除,重命名的基本操作支持打开图片&…

一键部署私有化的思维导图SimpleMindMap

简介 SimpleMindMap 是一个可私有部署的web思维导图工具。它提供了丰富的功能和特性,包含插件化架构、多种结构类型(逻辑结构图、思维导图、组织结构图等)、节点内容支持文本、图片、图标、超链接等,支持拖拽、导入导出功能、快捷…

windows消息循环之手撸一个Win32窗口程序

Windows消息循环(Windows Message Loop) 在Windows操作系统中,一个程序通过不断地接收和处理消息来保持活动状态的一种机制。在Windows编程中,消息循环是处理用户输入、操作系统事件和其他消息的关键部分。 在Windows应用程序中…

join | join_any | join_none之间的区别

文章目录 前言一、join/join_any/join_none之间的区别总结 前言 本文主要记录一下,与fork想匹配的三个选项,join/join_any/join_none之间的区别。 一、join/join_any/join_none之间的区别 join,等到所有的子进程全部结束,才能继…

软件测试|Python自动化测试实现的思路

Python自动化测试常用于Web应用、移动应用、桌面应用等的测试 Python自动化实现思路通常分为以下几步: 1. 确定自动化测试的范围和目标: 首先需要明确需要进行自动化测试的范围和目标,包括测试场景、测试用例、测试数据等。 2. 选择自动化…

【代码随想录-链表】移除链表元素

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

shell脚本——条件语句

目录 一、条件语句 1、test命令测试条件表达式 2、整数数值比较 3、字符串比较 4、逻辑测试(短路运算) 5、双中括号 二、if语句 1、 分支结构 1.1 单分支结果 1.2 双分支 1.3 多分支 2、case 一、条件语句 条件测试:判断某需求是…

《Linux C编程实战》笔记:管道

从这节开始涉及进程间的通信,本节是管道。 管道是一种两个进程间进行单向通信的机制。因为管道传递数据的单向性,管道又称之为半双工管道。。管道的这一特点决定了其使用的局限性。 数据只能由一个进程刘翔另一个进程;如果要进行全双工通信…

快速掌握PHP:用这个网站,让学习变得简单有趣!

介绍:PHP是一种广泛使用的开源服务器端脚本语言,特别适合Web开发。 PHP,全称为Hypertext Preprocessor,即超文本预处理器,是一种嵌入在HTML中的服务器端脚本语言。它主要用于管理动态内容和数据库交互,使得…

双非本科准备秋招(9.3)—— JVM2

学这个JVM还是挺抽象的,不理解的东西我尽量记忆了,毕竟刚接触两天,也没遇到过实际应用场景,所以学起来还是挺费劲的,明天再补完垃圾回收这块的知识点。U•ェ•*U 先补一下JVM运行时的栈帧结构。 线程调用一个方法的执…

【并发编程】volatile原理

📝个人主页:五敷有你 🔥系列专栏:并发编程⛺️稳重求进,晒太阳 volatile原理实现是内存屏障,Memory Barrier 对volatile变量的写指令后会加入写屏障。对volatile变量的读指令前会加入读屏障 如何保…

Spring - 基本用法参考

Spring 官方文档 Spring容器启动流程(源码解读) BeanFactoryPostProcessor vs BeanPostProcessor vs BeanDefinitionRegistryPostProcessor: From java doc: BeanFactoryPostProcessor may interact with and modify bean defin…

网工内推 | 申通快递急招网安、测试工程师,包食宿,30k*13薪

01 申通快递 招聘岗位:信息安全工程师 职责描述: 1、 负责集团数据安全风险的识别、协同、跟踪、改进优化及事后评估; 2、 负责集团数据安全专项风险的治理及系统上线前的数据安全评审; 3、 负责集团信息安全、合规等方面制度的编…

限时回归!!!3D版《空洞骑士》!!!

空洞骑士是一款基于横板平台跳跃的传统风格2D动作冒险游戏。庞大的游戏世界交错相通,玩家控制小虫子去探索幽深黑暗的洞穴,成为了一代人茶余饭后的惦念,深受广大玩家们的喜爱。 这类平台跳跃游戏一般是游戏开发初学者以及独立游戏开发者们比…

React一学就会(7): 细说redux及其应用

不知不觉一个星期结束了,很快就要过年了,中间休息了两天,小孩生病,我也有点感冒了,还好,我的这个 React 基础教学课程也基本结束了。大家有不明白的可以留言问我,我一定竭尽所能的帮助你。后面几…

D3703F——应用于音响系统的静音检测电路 当音响系统在放音或快进 / 退时进行静音检测,输出控制信号。

D3703F 是 一 块 汽 车 音 响 静 音 检 测 电 路 。 用 于 音 响 系 统 检 测 在 放 音 或 快 进 / 退 时 进 行 静 音 检 测 。 D3703F 的 的 电 压 范 围 : 3.2V ~ 16V , 信 号 检 测 和 静 音 时 间 可 通 过 外 围 电 阻 、 电 容 来 …

中小型企业知识库建设的秘诀来啦,赶紧收藏起来

知识库是企业的智慧宝库,其中的信息和知识的整合,可以极大地提高工作效率和团队协作能力。尤其对中小企业来说,知识库的建设更是关系企业未来发展的重要因素。那么,怎样有效地构建高效的知识库系统呢?下面这些秘诀值得…

Arthas的使用

1. 简介 官网 线上debug神器,就不过多介绍 2. 环境搭建 win11环境 ,jdk11 2.1 安装 下载地址 2.2 启动 cmd java -jar arthas-boot.jar启动之后会自动检测启动的java服务 1~4 ,springboot是启动类名,所以我选择了3 3. 常用操作 3.…

Hadoop3.x基础(1)

来源:B站尚硅谷 这里写目录标题 大数据概论大数据概念大数据特点(4V)大数据应用场景 Hadoop概述Hadoop是什么Hadoop发展历史(了解)Hadoop三大发行版本(了解)Hadoop优势(4高)Hadoop组成&#xf…

非阿里云注册域名如何在云解析DNS设置解析?

概述 非阿里云注册域名使用云解析DNS,按照如下步骤: 添加域名。 添加解析记录。 修改DNS服务器。 DNS服务器变更全球同步,等待48小时。 添加解析记录 登录云解析DNS产品控制台。 在 域名解析 页面中,单击 添加域名 。 在 …