Android framework ATMS启动流程

目录
  • 1 前言
    • (1)ATMS 创建流程
    • (2)ATMS 初始化
  • 2 ATMS 启动流程
    • (1)main
    • (2)run
    • (3)startBootstrapServices
    • (4)startService
    • (5)ATMS.Lifecycle
  • 3 ATMS 初始化
    • (1)ATMS 的构造方法
    • (2)start
    • (3)initialize
    • (4)onActivityManagerInternalAdded
    • (5)ActivityStartController
    • (6)DefaultFactory

1 前言

ATMS 即 ActivityTaskManagerService,用于管理 Activity 及其容器(任务、堆栈、显示等)。ATMS 在 Android 10 中才出现,由原来的 AMS(ActivityManagerService)分离而来,承担了 AMS 的部分职责。因此,在 AMS初始化过程中(AMS启动流程),也伴随着了 ATMS 的初始化。本文主要介绍 ATMS 的启动流程和初始化过程。

(1)ATMS 创建流程

  • SystemServer:依次调用 main()、run()、startBootstrapServices(),再调用 SystemServiceManager 的 startService() 方法,并将 Lifecyle.class 传入;
  • SystemServiceManager :startService() 方法通过反射调用 Lifecyle 的构造方法,生成 Lifecyle 对象;
  • Lifecyle:构造方法中调用 ATMS 的构造方法创建 ATMS 对象,并通过 getService() 方法返回 ATMS 对象。

(2)ATMS 初始化

如图,ATMS 在初始化时创建了图中蓝色类的对象。

2 ATMS 启动流程

(1)main

/frameworks/base/services/java/com/android/server/SystemServer.java

public static void main(String[] args) {
    new SystemServer().run();
}

(2)run

/frameworks/base/services/java/com/android/server/SystemServer.java

private void run() {
	try {
		...
		// 创建Looper
		Looper.prepareMainLooper();
		// 加载libandroid_servers.so
		System.loadLibrary("android_servers");
		// 创建系统的 Context:ContextImpl.createSystemContext(new ActivityThread())
		createSystemContext();
		// 创建 SystemServiceManager
		mSystemServiceManager = new SystemServiceManager(mSystemContext);
		LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
		...
	}
	...
	try {
		//启动引导服务,ActivityManagerService、ActivityTaskManagerService、PackageManagerService、PowerManagerService、DisplayManagerService 等
		startBootstrapServices();
		//启动核心服务,BatteryService、UsageStatusService 等
		startCoreServices();
		//启动其他服务,InputManagerService、WindowManagerService、CameraService、AlarmManagerService 等
		startOtherServices();
		...
	}
	...
	// 开启消息循环
	Looper.loop();
}

(3)startBootstrapServices

/frameworks/base/services/java/com/android/server/SystemServer.java

private void startBootstrapServices() {
	...
    //启动 ATMS
	ActivityTaskManagerService atm = mSystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class).getService();
    //启动 AMS,并将 ATMS 注入
	mActivityManagerService = ActivityManagerService.Lifecycle.startService(mSystemServiceManager, atm);
	...
}

(4)startService

/frameworks/base/services/core/java/com/android/server/SystemServiceManager.java

public <T extends SystemService> T startService(Class<T> serviceClass) {
	try {
		final String name = serviceClass.getName();
		...
		final T service;
		try { //通过反射调用 serviceClass 的构造方法 创建 Lifecycle 对象
			Constructor<T> constructor = serviceClass.getConstructor(Context.class);
			service = constructor.newInstance(mContext);
		}
		...
		startService(service);
		return service;
	}
	...
}

public void startService(SystemService service) {
	mServices.add(service); //mServices: ArrayList<SystemService>
	...
	try {
		service.onStart(); //调用 Lifecycle 的 onStart 方法
	}
	...
}

(5)ATMS.Lifecycle

/frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.Lifecycle.java

public static final class Lifecycle extends SystemService {
	private final ActivityTaskManagerService mService;

	public Lifecycle(Context context) {//被 SystemServiceManager 的 startService() 方法调用
		super(context);
		mService = new ActivityTaskManagerService(context);
	}

	public void onStart() {
        //添加 ATMS 服务,方便跨进程调用:ServiceManager.addService(Context.ACTIVITY_TASK_SERVICE, mService, false, DUMP_FLAG_PRIORITY_DEFAULT)
		publishBinderService(Context.ACTIVITY_TASK_SERVICE, mService);
		mService.start(); //调用 ATMS 的 start() 方法
	}

	...

	public ActivityTaskManagerService getService() {
		return mService;
	}
}

注意:onStart() 方法中调用 ATMS 的 start() 方法初始化(下文还会介绍)。 已通过 ServiceManager.addService() 将 Context.ACTIVITY_TASK_SERVICE 与 ATMS 绑定,因此在其他进程中可以通过如下方式获取 ATMS。

IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);
IActivityTaskManager atm = IActivityTaskManager.Stub.asInterface(b);

3 ATMS 初始化

(1)ATMS 的构造方法

/frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java

public ActivityTaskManagerService(Context context) {
	mContext = context;
	...
	mSystemThread = ActivityThread.currentActivityThread();
	mUiContext = mSystemThread.getSystemUiContext(); //ContextImpl.createSystemUiContext(getSystemContext())
	mLifecycleManager = new ClientLifecycleManager();
	mInternal = new LocalService(); //ActivityTaskManagerInternal 的子类
	...
}

(2)start

start() 方法被 Lifecycle 的 onStart() 方法调用,onStart() 方法又被 SystemServiceManager 的 startService() 方法调用。

/frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java

private void start() {
	LocalServices.addService(ActivityTaskManagerInternal.class, mInternal);
}

mInternal 属于 LocalService 类(ActivityTaskManagerInternal 的子类),在 ATMS 的构造方法中创建。

(3)initialize

在 AMS 的构造方法中,调用了 ATMS 的 initialize() 方法进一步初始化。

/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) {
	...
	mHandlerThread = new ServiceThread(TAG, THREAD_PRIORITY_FOREGROUND, false);
    ...
    mUserController = new UserController(this);
	mPendingIntentController = new PendingIntentController(mHandlerThread.getLooper(), mUserController);
	...
	mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler);
	mActivityTaskManager = atm;
	//进一步初始化 ATMS
	mActivityTaskManager.initialize(mIntentFirewall, mPendingIntentController, DisplayThread.get().getLooper());
	...
}

/frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java

public void initialize(IntentFirewall intentFirewall, PendingIntentController intentController, Looper looper) {
	mH = new H(looper);
	mUiHandler = new UiHandler();
	mIntentFirewall = intentFirewall;
	...
	mPendingIntentController = intentController;
	mTempConfig.setToDefaults(); //定义时即被创建:mTempConfig = new Configuration()
	...
	//new ActivityStackSupervisor(this, mH.getLooper())
	mStackSupervisor = createStackSupervisor();
	mRootActivityContainer = new RootActivityContainer(this);
	mRootActivityContainer.onConfigurationChanged(mTempConfig);
	...
	mLockTaskController = new LockTaskController(mContext, mStackSupervisor, mH);
	mActivityStartController = new ActivityStartController(this);
	mRecentTasks = createRecentTasks(); //new RecentTasks(this, mStackSupervisor)
	mStackSupervisor.setRecentTasks(mRecentTasks);
	...
}

(4)onActivityManagerInternalAdded

在 AMS 的 start() 方法中,调用了 ATMS 的 onActivityManagerInternalAdded() 方法进一步初始化。

/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

private void start() {
	...
	LocalServices.addService(ActivityManagerInternal.class, new LocalService());
    //调用 ATMS 的 onActivityManagerInternalAdded 方法进一步初始化
	mActivityTaskManager.onActivityManagerInternalAdded();
	mUgmInternal.onActivityManagerInternalAdded();
	mPendingIntentController.onActivityManagerInternalAdded();
	...
}

/frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java

public void onActivityManagerInternalAdded() {
	synchronized (mGlobalLock) {
		mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
		mUgmInternal = LocalServices.getService(UriGrantsManagerInternal.class);
	}
}

(5)ActivityStartController

ActivityStartController 作为 ATMS 的一个重要成员,控制了 Activity 的启动,因此我们继续跟进 ActivityStartController 的构造方法。

/frameworks/base/services/core/java/com/android/server/am/ActivityStartController.java

ActivityStartController(ActivityTaskManagerService service) {
	this(service, service.mStackSupervisor,
			new DefaultFactory(service, service.mStackSupervisor,
				new ActivityStartInterceptor(service, service.mStackSupervisor)));
}

ActivityStartController(ActivityTaskManagerService service, ActivityStackSupervisor supervisor,
		Factory factory) {
	mService = service;
	mSupervisor = supervisor;
	mHandler = new StartHandler(mService.mH.getLooper());
	mFactory = factory;
	mFactory.setController(this);
	...
}

(6)DefaultFactory

DefaultFactory 是 ActivityStarter 的静态内部类,负责 ActivityStarter 的创建和回收。因此我们继续跟进 DefaultFactory 类。

/frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.DefaultFactory.java

static class DefaultFactory implements Factory {
	...
	private ActivityStartController mController;
	private ActivityTaskManagerService mService;
	private ActivityStackSupervisor mSupervisor;
	private ActivityStartInterceptor mInterceptor;

	//MAX_STARTER_COUNT = 3
	private SynchronizedPool<ActivityStarter> mStarterPool = new SynchronizedPool<>(MAX_STARTER_COUNT);

	DefaultFactory(ActivityTaskManagerService service, ActivityStackSupervisor supervisor, ActivityStartInterceptor interceptor) {
		mService = service;
		mSupervisor = supervisor;
		mInterceptor = interceptor;
	}

	public ActivityStarter obtain() {
		ActivityStarter starter = mStarterPool.acquire();
		if (starter == null) {
			starter = new ActivityStarter(mController, mService, mSupervisor, mInterceptor);
		}
		return starter;
	}

	@Override
	public void recycle(ActivityStarter starter) {
		mStarterPool.release(starter);
	}
}

以上就是Android framework ATMS启动流程的详细内容,更多关于Android framework ATMS启动的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android10 App 启动分析进程创建源码解析

    目录 正文 RootActivityContainer ActivityStartController 调用startActivityUnchecked方法 ActivityStackSupervisor 启动进程 RuntimeInit.applicationInit这个方法 正文 从前文# Android 10 启动分析之SystemServer篇 (四)中可以得知,系统在完成所有的初始化工作后,会通过 mAtmInternal.startHomeOnAllDisplays(currentU

  • Android 应用程序的启动流程示例详解

    目录 应用进程的启动流程 1.ActivityStackSupervisor.startSpecificActivity 2.ATMS.startProcessAsync 3.LocalService.startProcess 4.startProcessLocked函数 5.ProcessList.startProcessLocked 6.ProcessList.startProcessLocked重载 7.ProcessList.startProcess 8.ZygoteState.star

  • 详解Android广播Broadcast的启动流程

    目录 正文 广播的注册 广播的解注册 广播的发送 总结 正文 本文整体阅读下来相对Activity和Service的启动流程较容易,比较贴近我们日常代码开发习惯.我们曾经有个整机项目,多个APP跨进程交互,本来想采用AIDL进行的,但最终考虑到项目工期和其他同事的能力,最终在采用广播方式进行IPC. 那时,自己也在想,这么多个APP相互发信息,数据量也大,对整机性能有影响么?会不会存在丢失和内存问题.一脸茫然,网上也不会有类似信息告诉总结这种情况,本文也不会总结这个答案,因为看完之后心中自然有数

  • Android基准配置文件Baseline Profile方案提升启动速度

    目录 引言 测量工具 生成基准配置文件 验证优化效果 引言 偶然在Youtube上看到一名国外安卓开发者分享了一个提升应用性能的视频,其中使用到了macro benchmark来进行性能测量,包括启动速度和列表帧率,方法是生成一个baseline-prof.txt文件放于app/src/main/下.查阅google的官方文档,其背后原理如下: 通过在应用或库中分发基准配置文件,Android 运行时 (ART) 可以通过预先 (AOT) 编译来优化包含的代码路径,从而针对每位新用户以及每个应用

  • Android10 App启动Activity源码分析

    目录 正文 ActivityThread的main方法 Application Context对象 LaunchActivityItem ClientLifecycleManager ClientTransaction TransactionExecutor executeLifecycleState方法 正文 上一篇: Android 10 App启动分析之进程创建篇(一) 上一篇文章,我们探讨了App启动过程中进程创建及初始化的流程,这篇文章我们接着上篇的内容,继续探讨App的Applica

  • Android Service启动绑定流程详解

    目录 前言 一.Service 的启动流程 二.Service的绑定 三.Service的Context 总结 前言 本文基于Android 11,参考<Android进阶解密>一书资料.了解Service的启动和绑定流程,以及Service的Context创建过程. 由于基于分析流程,忽略很多细节分支.各位在看源码的时候,要尽可能忽略细节,分析整体流程之后,还有精力的话再去看细节.例如有些属性是在后面赋值的,如果在前面追究,难哦. 另:阅读这种流程需要很大的耐心和毅力.建议在心情愉悦想要学习

  • Android开发InputManagerService创建与启动流程

    目录 前言 启动流程 创建输入系统 启动输入系统 输入系统就绪 结束 前言 之前写过几篇关于输入系统的文章,但是还没有写完,后来由于工作的变动,这个事情就一直耽搁了.而现在,在工作中,遇到输入系统相关的事情也越来越多,其中有一个非常有意思的需求,因此是时候继续分析 InputManagerService. InputManagerService 系统文章,基于 Android 12 进行分析. 本文将以 IMS 简称 InputManagerService. 启动流程 InputManagerS

  • Android framework ATMS启动流程

    目录 1 前言 (1)ATMS 创建流程 (2)ATMS 初始化 2 ATMS 启动流程 (1)main (2)run (3)startBootstrapServices (4)startService (5)ATMS.Lifecycle 3 ATMS 初始化 (1)ATMS 的构造方法 (2)start (3)initialize (4)onActivityManagerInternalAdded (5)ActivityStartController (6)DefaultFactory 1 前

  • 全面解析Android系统指纹启动流程

    本章主要整理Android 指纹启动流程,侧重于hal和framework部分. 一.从Android系统启动流程看指纹启动流程 下图图片出处  → 第一阶段 Boot ROM,Android设备上电后,首先会从处理器片上ROM的启动引导代码开始执行,片上ROM会寻找Bootloader代码,并加载到内存.主要就是上电让系统启动. 第二阶段 Bootloader开始执行,首先负责完成硬件的初始化,然后找到Linux内核代码,并加载到内存. 启动过程中,bootloader(默认是bootable

  • Android okhttp的启动流程及源码解析

    前言 这篇文章主要讲解了okhttp的主要工作流程以及源码的解析. 什么是OKhttp 简单来说 OkHttp 就是一个客户端用来发送 HTTP 消息并对服务器的响应做出处理的应用层框架. 那么它有什么优点呢? 易使用.易扩展. 支持 HTTP/2 协议,允许对同一主机的所有请求共用同一个 socket 连接. 如果 HTTP/2 不可用, 使用连接池复用减少请求延迟. 支持 GZIP,减小了下载大小. 支持缓存处理,可以避免重复请求. 如果你的服务有多个 IP 地址,当第一次连接失败,OkHt

  • 详解Android Activity的启动流程

    前言 activity启动的流程分为两部分:一是在activity中通过startActivity(Intent intent)方法启动一个Activity:二是我们在桌面通过点击应用图标启动一个App然后显示Activity:第二种方式相较于第一种方式更加全面,所以本文会以第二种流程来分析. 简要 我们手机的桌面是一个叫做Launcher的Activity,它罗列了手机中的应用图标,图标中包含安装apk时解析的应用默认启动页等信息.在点击应用图标时,即将要启动的App和Launcher.AMS

  • Android开发App启动流程与消息机制详解

    目录 引言 1.第一步了解 ThreadLocal 2.App的启动流程 3.Activity中创建Handler 引言 相信很多人对这个问题不陌生,但是大家回答的都比较简单,如谈到app启动流程有人就会是app的生命周期去了,谈到消息机制有人就会说looper循环消息进行分发,如果是面试可能面试官不会满意,今天我们搞一篇完善的源码解析来进行阐述上面的问题 1.第一步了解 ThreadLocal 什么是ThreadLocal呢,专业的来讲,ThreadLocal 是一个线程内部的数据存储类,通过

  • Android蓝牙服务启动流程分析探索

    目录 1.SystemServer 2.BluetoothService 3.BluetoothManagerService 首先我们要知道,主要系统服务都是在 SystemServer 启动的,蓝牙也是如此: 1.SystemServer 源码路径:/frameworks/base/services/java/com/android/server/SystemServer.java private void startOtherServices(@NonNull TimingsTraceAnd

  • Framework源码面试之activity启动流程

    目录 引言 Framework源码面试:activity启动流程 1.1面试连环炮之说说 Android 的四种启动模式 1.2.面试连环炮之说说 Intent标签起什么作用呢? 简单说一说 1.2.Android 的启动原理,他的流程是什么样的 1.2.1.进程A与AMS的交互过程 引言 今天在电脑上翻出了很久之前整理笔记Framework源码面试,Flutter,以及一部分面试专题.拿出来温习一下. 今天先讲Framework源码篇: 1.Framework源码面试:Activity启动流程

  • 分析Android中应用的启动流程

    前言 在我们开始之前,希望您能最好已经满足以下条件: 1.有一份编译后的Android源码(亲自动手实践才会有更深入的理解) 2.对Binder机制有一定的了解 本文启动流程分析基于Android 5.1的源码.为什么是5.1的源码呢?因为手边编译完的代码只有这个版本-另外,用什么版本的源码并不重要,大体的流程并无本质上的区别,仅仅是实现细节的调整,找一个你熟悉的版本就好. 1.启动时序图 作为一个轻微强迫症的人,整理的时序图,相信大家按图索骥,一定能搞明白整个启动流程: 说明:为了让大家更清楚

  • Android Service启动流程刨析

    强调一下阅读系统源码,起码要对进程间通信要了解,对binder机制非常非常清楚,binder就是指南针,要不然你会晕头转向:强行阅读,就容易睡着. Service启动先来一张图感受一下 这张图能够说明一个大致的流程,但是服务的启动肯定不是这么简单,但是我们先简单的总结一下,逐渐深入.服务的启动形式有两种,startService()和 binderService(),我们看startService()这一种.startService是ContextWrapper里面的方法. ContextWra

随机推荐