(七)AMS解析

(七)AMS解析


文章目录

  • (七)AMS解析
  • 前言
  • 一、AMS启动流程
  • 二、AMS功能
    • 2.1 AMS是什么?
    • 4.Binder2 就是我们的ViewRoot.W对象,他也是实现了IBinder接口,就是用于我们的应用程序和 wms通信的工具。
    • 2.2 AMS重要数据结构
        • 2.2.1 ActivityRecord
        • 2.2.2 TaskRecord
        • 2.2.3 ActivityStack
        • 2.2.4 ActivityStackSupervisor


前言

ActivityManagerService是Android系统中一个特别重要的系统服务,AMS与APP互动最多的系统服务之一。ActivityManagerService(以下简称AMS) 主要负责四大组件的启动、切换、调度以及应用进程的管理和调度工作,所有的APP应用都需要 与AMS互动。AMS服务架构几个重要组成部分:

  • 服务代理:由ActivityManagerProxy实现,用于与Server端提供的系统服务进行进程间通信;
  • 服务中枢:ActivityManagerNative继承自Binder并实现IActivityManager,它提供了服务接口和Binder接口的相互转化功能,并在内部存储服务代理对像,并提供了getDefault方法返回服务代理 ;
  • Client:由ActivityManager封装一部分服务接口供Client调用。ActivityManager内部通过调用ActivityManagerNative的getDefault方法,可以得到一个ActivityManagerProxy对像的引用,进而通过该代理对像调用远程服务的方法 ;
  • Server:由ActivityManagerService实现,提供Server端的系统服务;

一、AMS启动流程

AMS在system_server进程中启动SystemServer.java #startBootstrapServices()

public final class SystemServer {
    
    ...
  public SystemServer() {
        // Check for factory test mode.
        mFactoryTestMode = FactoryTest.getMode();
        // Remember if it's runtime restart(when sys.boot_completed is already set) or reboot
        mRuntimeRestart = "1".equals(SystemProperties.get("sys.boot_completed"));

        mRuntimeStartElapsedTime = SystemClock.elapsedRealtime();
        mRuntimeStartUptime = SystemClock.uptimeMillis();
    }

    private void run() {
         ...
        // Start services.
        try {
            traceBeginAndSlog("StartServices");
            startBootstrapServices();
            startCoreServices();
            startOtherServices();
            SystemServerInitThreadPool.shutdown();
        } catch (Throwable ex) {
            Slog.e("System", "******************************************");
            Slog.e("System", "************ Failure starting system services", ex);
            throw ex;
        } finally {
            traceEnd();
        }

      ...
    }

startBootstrapServices(加载核心服务)中加载的,加载后就startCoreServices启动核心服务,然后startOtherServices启动其他服务,最后Looper.loop进入循环,在startBootstrapServices中,通过SystemServiceManager.startservice,在通过反射创建的LifeCycle中真正创建了AMS服务

  private void startBootstrapServices() {
        ...
        // Activity manager runs the show.
        traceBeginAndSlog("StartActivityManager");
        mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);
        traceEnd();

       ...
    }

二、AMS功能

2.1 AMS是什么?

  • 从java角度来看,ams就是一个java对象,实现了Ibinder接口,所以它是一个用于进程之间通信的接口

  • AMS是一个服务: ActivityManagerService从名字就可以看出,它是一个服务,用来管理Activity,而且是一个系统服务,就是包管理服务,电池管理服务,震动管理服务等。

  • AMS是一个Binder ams实现了Ibinder接口,所以它是一个Binder,这意味着他不但可以用于进程间通信,还是一个线程,因为一个Binder就是一个线程。

4.Binder2 就是我们的ViewRoot.W对象,他也是实现了IBinder接口,就是用于我们的应用程序和 wms通信的工具。

Android的ActivityManagerService(简称AMS) 源码分析
https://blog.51cto.com/u_15375308/4996247

2.2 AMS重要数据结构

2.2.1 ActivityRecord
  • Activity管理的最小单位,它对应着一个用户界面
  • ActivityRecord是应用层Activity组件在AMS中的代表,每一个在应用中启动的Activity,在AMS中都有一个ActivityRecord实例来与之对应,这个ActivityRecord伴随着Activity的启动而创建,也伴随着Activity的终止而销毁。
2.2.2 TaskRecord

TaskRecord即任务栈,每一个TaskRecord都可能存在一个或多个ActivityRecord,栈顶的ActivityRecord表示当前可见的界面。一个App是可能有多个TaskRecord存在的,一般情况下,启动App的第一个activity时,AMS为其创建一个TaskRecord任务栈特殊情况,启动singleTask的Activity,而且为该Activity指定了和包名不同的taskAffiffiffinity,也会为该activity创建一个新的TaskRecord。
(七)AMS解析_第1张图片

2.2.3 ActivityStack

ActivityStack是系统中用于管理TaskRecord的,内部维护了一个ArrayList。ActivityStackSupervisor内部有两个不同的ActivityStack对象:mHomeStack、mFocusedStack,用来管理不同的任务。我们启动的App对应的TaskRecord由非Launcher ActivityStack管理,它是在系统启动第一个app时创建的。
(七)AMS解析_第2张图片

2.2.4 ActivityStackSupervisor

ActivityStackSupervisor管理着多个ActivityStack,但当前只会有一个获取焦点(Focused)的ActivityStack;
AMS对象只会存在一个,在初始化的时候,会创建一个唯一的ActivityStackSupervisor对象

(七)AMS解析_第3张图片

你可能感兴趣的:(Android,framework学习笔记,java,android,开发语言)