AMS作用、流程 与 AMS相关

1.  AMS是如何管理进程的

        AMS - ProcessList - ProcessRecord - AppThread     AMS是记录了一个Application进程的binder(ApplicationThread-)的列表

2. ActvityManagerServcie的重要功能:

        start()函数知道: 1)启动 CPU 监控线程; 2) 注册电池状态和权限管理服务         

        startObservingNativeCrashes()函数知道: 监听所有的crash事件         

        setSystemProcess()函数知道: 添加各种管理app状态信息的服务还有进程等等信息

3. Application 启动流程

        

        简单理解:launcher进程的ActivityManagerProxy代理类发送请求到SystemServer,systemServer请求zygote去fork新进程,从system_server的AMS中取出对应的binder-ApplicationThreadProxy,然后启动app的Activity。

4. SystemServer关系图和流程图

5.Activity Manager的组成

        ActivityManagerService是 Android 系统中一个特别重要的系统服务,也是我们上层 APP 打交道最多的系 统服务之一。ActivityManagerService (以下简称 AMS ) 主要负责四大组件的启动、切换、调度以及应 用进程的管理和调度工作。所有的APP 应用都需要 与AMS 打交道。        
1.服务代理:由ActivityManagerProxy实现,用于与Server端提供的系统服务进行进程间通信
2.服务中枢:ActivityManagerNative继承自Binder并实现IActivityManager,它提供了服务接口和
Binder接口的相互转化功能,并在内部存储服务代理对像,并提供了getDefault方法返回服务代理
3.Client:由ActivityManager封装一部分服务接口供Client调用。ActivityManager内部通过调用
ActivityManagerNative的getDefault方法,可以得到一个ActivityManagerProxy对像的引用,进而通过
该代理对像调用远程服务的方法
4.Server:由ActivityManagerService实现,提供Server端的系统服务

------ActivityManagerProxy--Service/server
6. ActivityManagerService 的启动过程
    SystemServer类:
AMS是在SystemServer中被添加的, 所以先到SystemServer中查看初始化
SystemServer.run(){startBootTraceServices()}  ----->

        //启动了AMS
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
        //设置systemServiceManager - 由SystemServer管理
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);


    SystemServiceManager类:
//AMS是通过SystemServiceManager.startService去启动的,参数是
ActivityManagerService.Lifecycle.class, 首先看看startService方法
    startService方法很简单,是通过传进来的class然后反射创建对应的service服务。所以此处创建的是
Lifecycle的实例, 然后通过startService启动了AMS服务
        //ActivityManagerService.Lifecycle类  继承自SystemService,启动ActivityManagerService

    ActivityManagerService类        AMS做了什么
//赋值mContext	mContext = systemContext;
//获取当前的ActivityThread	mSystemThread = ActivityThread.currentActivityThread();
//赋值mUiContext		mUiContext = mSystemThread.getSystemUiContext();
//创建Handler线程,用来处理handler消息	mHandlerThread = new ServiceThread(TAG,THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
//管理AMS的一些常量,厂商定制系统就可能修改此处	mConstants = new ActivityManagerConstants(this, mHandler);

//初始化管理前台、后台广播的队列, 系统会优先遍历发送前台广播	mFgBroadcastQueue = new BroadcastQueue(this,mHandler,"foreground", BROADCAST_FG_TIMEOUT, false);
//初始化管理Service的 ActiveServices对象	mServices = new ActiveServices(this);
//初始化Provider的管理者	mProviderMap = new ProviderMap(this);
//初始化APP错误日志的打印器	mAppErrors = new AppErrors(mUiContext, this);

//创建电池统计服务, 并输出到指定目录	File dataDir = Environment.getDataDirectory();
//创建进程统计分析服务,追踪统计哪些进程有滥用或不良行为 :	mBatteryStatsService.getActiveStatistics().getIsOnBattery();
//加载Uri的授权文件	mGrantFile = new AtomicFile(new File(systemDir, "urigrants.xml"),"uri-grants");
//负责管理多用户	mUserController = new UserController(this);
//vr功能的控制器	mVrController = new VrController(this);
//初始化OpenGL版本号	GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version",ConfigurationInfo.GL_ES_VERSION_UNDEFINED);
//管理ActivityStack的重要类,这里面记录着activity状态信息,是AMS中的核心类	mStackSupervisor = createStackSupervisor();
.....
//启动一个线程专门跟进cpu当前状态信息,AMS对当前cpu状态了如指掌,可以更加高效的安排其他工作	mProcessCpuThread = new Thread("CpuTracker")
//看门狗,监听进程。这个类每分钟调用一次监视器。 如果进程没有任何返回就杀掉	Watchdog.getInstance().addMonitor(this);



        //ActivityManagerService类
    1. 在SystemServer中,在startBootstrapServices()中去启动了AMS,调用了mActivityManagerService.setSystemProcess();
    2. set()方法中调用了ServiceManager.addService(..)..
        注册服务。首先将ActivityManagerService注册到ServiceManager中,其次将几个与系统性能调试相关的服务注册到ServiceManager。
        •查询并处理ApplicationInfo。首先调用PackageManagerService的接口,查询包名为android的应用程序的ApplicationInfo信息,对应于framework-res.apk。然后以该信息为参数调用ActivityThread上的installSystemApplicationInfo方法。
        •创建并处理ProcessRecord。调用ActivityManagerService上的newProcessRecordLocked,创建一个ProcessRecord类型的对象,并保存该对象的信息
  

7. AMS是什么?

1. java 角度来看, ams 就是一个 java 对象,实现了 Ibinder 接口,所以它是一个用于进程之间通信的 接口,这个对象初始化是在systemServer.java run() 方法里面
2. AMS 是一个服务
        ActivityManagerService从名字就可以看出,它是一个服务,用来管理 Activity ,而且是一个系统服 务,就是包管理服务,电池管理服务,震动管理服务等。
3. AMS 是一个 Binder
        ams实现了 Ibinder 接口,所以它是一个 Binder ,这意味着他不但可以用于进程间通信,还是一个 线程,因为一个Binder 就是一个线程。 如果我们启动一个hello World 安卓用于程序,里面不另外启动其他线程,这个里面最少要启动 4 个 线程
        1 main线程,只是程序的主线程,也是日常用到的最多的线程,也叫 UI 线程,因为 android 的组 件是非线程安全的,所以只允许UI/MAIN 线程来操作。
        2 GC线程, java 有垃圾回收机制,每个 java 程序都有一个专门负责垃圾回收的线程,
        3 Binder1 就是我们的 ApplicationThread ,这个类实现了 Ibinder 接口,用于进程之间通信,具体 来说,就是我们程序和AMS 通信的工具
        4 Binder2 就是我们的 ViewRoot.W 对象,他也是实现了 IBinder接口,就是用于我们的应用程序和 wms通信的工具。         wms就是WindowManagerServicer ,和 ams 差不多的概念,不过他是管理窗口的系统服务。
        public class ActivityManagerService extends IActivityManager . Stub implements Watchdog . Monitor , BatteryStatsImpl . BatteryCallback {}
8.  AMS 相关重要类-需细
ProcessRecord 数据结构
    第一类数据:描述身份的数据
    第二类数据:描述进程中组件的数据
    第三类数据:描述进程状态的数据
    第四类数据:和pss相关的数据
    第五类数据:和时间相关的数据
    第六类数据:crash和anr相关的数据
    第七类数据:和instrumentation相关的数据
    第八类数据:电源信息和调试信息
    第九类数据:31个boolean值
        1.进程声明周期相关的
        2.组件状态影响进程行为的
        3.其他
进程主要占用的资源:ProcessRecord容器 和 组件记录表的容器
    ...
    ...
    内部四大组件记录表的容器
组件运行才是进程存在的意义,由于android系统进程间的无缝结合,所以系统需要控制到组件级别,
所有的组件信息都需要映射到系统,一个ActivityRecord记录对应一个Activity的信息,一个
ServiceRecord记录对应一个Service的信息,一个ConnectionRecord记录对应一个bind service的客户
端信息,一个ReceiverList对应处理同一事件的一组广播,一个ContentProviderRecord记录对应一个
ContentProvider信息,一个ContentProviderConnection对应一个进程中的所有ContentProvider客户
端
    activity记录
1. activities:ActivityRecord的容器,进程启动的所有的activity组件记录表
    service记录
1.services:ServiceRecord的容器,进程启动的所有的service组件记录表
2.executingServices:正在运行(executing)的ServiceRecord是怎么定义的?首先需要明确的是
系统是怎么控制组件的?发送消息给apk进程,apk进程处理消息,上报消息完成,这被定义为一
个完整的执行过程,因此正在执行(executing)被定义为发送消息到上报完成这段时间
3.connections:ConnectionRecord容器,绑定service的客户端记录表

    广播接收器记录
1.receivers:ReceiverList容器,广播接收器的记录表
    ContentProvider记录
1.pubProviders:名字到ContentProviderRecord的映射容器,pub是publish(发布)的意思,
ContentProvider需要安装然后把自己发布到系统(AMS)中后,才能使用,安装指的是apk进程
加载ContentProvider子类、初始化、创建数据库等过程,发布是将ContentProvider的binder客
户端注册到AMS中
2.conProviders:ContentProviderConnection容器,使用ContentProvider的客户端记录表
与Activity管理有关的数据结构
    ActivityRecord
ActivityRecord,源码中的注释介绍:An entry in the history stack, representing an activity.
翻译:历史栈中的一个条目,代表一个activity。
    
    ActivityRecord中存在着大量的成员变量,包含了一个Activity的所有信息。
ActivityRecord中的成员变量task表示其所在的TaskRecord,由此可以看出:ActivityRecord与
TaskRecord建立了联系
    \frameworks\base\services\core\java\com\android\server\am\ActivityStarter.java

    TaskRecord
TaskRecord,内部维护一个 ArrayList<ActivityRecord> 用来保存ActivityRecord。
    \frameworks\base\services\core\java\com\android\server\am\TaskRecord.java
    可以看到TaskRecord中使用了一个ArrayList来保存所有的ActivityRecord。   同样,TaskRecord中的mStack表示其所在的ActivityStack。   startActivity()时也会创建一个TaskRecord

    ActivityStarter
frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java
    ActivityStack
ActivityStack,内部维护了一个 ArrayList<TaskRecord> ,用来管理`TaskRecord
    可以看到ActivityStack使用了一个ArrayList来保存TaskRecord。    另外,ActivityStack中还持有ActivityStackSupervisor对象,这个是用来管理ActivityStacks的。ActivityStack是由ActivityStackSupervisor来创建的,实际ActivityStackSupervisor就是用来管理

    ActivityStackSupervisor
ActivityStackSupervisor,顾名思义,就是用来管理ActivityStack的
frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java
        ActivityStackSupervisor内部有两个不同的ActivityStack对象:mHomeStack、mFocusedStack,用来管理不同的任务。
        ActivityStackSupervisor内部包含了创建ActivityStack对象的方法。AMS初始化时会创建一个ActivityStackSupervisor对象

9. Activity启动流程相关

Launcher 请求 AMS 阶段

AMS ApplicationThread 阶段
ApplicationThread Activity 阶段
API28重构之后

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值