android framework之AMS的启动管理与职责

  • AMS是什么?

AMS管理着activity,Service, Provide, BroadcastReceiver
android10后:出现ATMS,ActivityTaskManagerService:ATMS是从AMS中抽出来,单独管理着原来AMS中的Activity组件 。
现在我们对AMS的分析,也就包含对ATMS的分析了。

  • AMS如何被别人管理?---被SystemServer的SystemServiceManager所管理
  • AMS如何被人使用?  ---通过将自己的Binder对象公布给ServiceManager,供APP使用
  • AMS如何启动? ----通过SystemServer中的SystemServiceManager的startService进行启动

这些涉及到SystemServer进程,专用门于管理AMS等各种服务的。

SystemServer.java->main():
  startBootStrap();
    //启动atms.
    -->atm = mSystemServiceManager.startService(ActivityTaskManagerService.LiftCycle.className).getService();

SystemServer->借助SystemServiceManager辅助类来管理90个多Services,所以不同的Services均需要封装成统一的父类即SystemService,这样一来方便让SystemServiceManager对它们进行统一管理 。(具体细节可以查看安卓启动流程关于SystemServer启动运行部分)
 

AMS、ATMS是给Application使用的, 怎么给Application使用的。通过Binder给到Application使用,我们需要将这些ATMS\AMS等服务的Binder注册进ServiceManager. Application要使用它们的时候,会去公共的ServiceManager中去查找对应的ATMS或AMS的binder,通过他们提供的Binder接口来使用这些服务的。为了完成这些服务,所以这些在SystemServer中的Service在进行类定义时必须将自己extends 成IBinder(Stub类),这样他们才能把自己的服务公布到ServiceManager中。

然后SystemServiceManager如何管理这些Services呢?是通过SystemService这个类(即LifeCycle)中的统一的接口如start(), stop(),restart()等
去间接管理各类Service.

  • 补充:关于类结构设计启发:

如果需要让一个类继承多个父类时,java语言做不到,怎么办?
解决办法:可以在类里面创建一个内部类(LiftCycle),内部类去继承需要的父类SystemService,在这个内部类里面与我们的外部类(ATMS)结合来完成所有的功能。

  • 下面聊聊AMS的职责:

以ATMS为例,ATMS的onStart()服务做了以下动作:

publishBinderService();//公布服务
mService.start();//调用atms服务的start接口。
  -->atms在这个接口中只做一件事:
     //将ATMS自已添加到LocalServices中,这个比较重要,除了让别人使用ATMS这个服务之外,
     //SystemServer进程自己有时也需要获取使用这些服务,所以需要添加到LocalServices中。
     LocalServices.addService(); 

上面的逻辑可以看出ATMS启动的时候没做什么事情。

  • 下面看看AMS启动:
ActivityManagerService.java->start():
  mProcessCpuThread.start(); //cpu监控线程
  mBatteryStatsService.publish(); //注册 电池状态及权限管理

SystemServer在启动完AMS后,会通过AMS启动电池管理等各种处理,AMS要做的任务太多了
如下所示:

mAMS->initPowerManagement();
mAMS->setSystemProcess(); //为app进程安排后期的各种进程的监控。
  -->注册Activity至AMS内的ServiceManager类中
     注册服务的ProcStats,进程状态
     注册服务的meminfo,内存信息
     注册服务的gfxinfo,图像信息
     注册服务的dbinfo,数据库信息
     注册服务的cpuinfo,cpu信息
     注册服务的processinfo,进程信息等,还有缓存,权限等

以上工作是为了后期可以通过adb命令去收集这些信息,adb去调用dump接口(),
把这些关键的信息收集起来。因此AMS要做非常多的事情,所以将ATMS(只管理Activity部分)剥离出去。

 

你可能感兴趣的:(Android系统,android,AMS)