Framwork源码解析(4)_ActivityManagerService(AMS)启动流程(8.0)

本文详细介绍了Android系统服务ActivityManagerService(AMS)的启动流程,从AMS简介、启动入口开始,逐步剖析创建系统上下文、startBootstrapServices方法以及systemReady处理的各个步骤,揭示了AMS如何在SystemServer进程中初始化并管理Activity的行为和生命周期。
摘要由CSDN通过智能技术生成

ActivityManagerService简介

ActivityManagerService简称AMS,具有管理Activity行为、控制Activity的生命周期、派发消息事件、内存管理等功能。查看AMS源码之前一定要先看一下前文System_Server进程启动过程:https://blog.csdn.net/u010982507/article/details/104123531
以下源码为8.0系统。

AMS启动入口

从上文中的system_server进程启动流程分析中可以得知,在SystemServer.java类(路径是:/frameworks/base/services/java/com/android/server/SystemServer.java)中的run方法中调用了启动引导服务,代码如下:

private void run() {
   
    ...
	// Initialize the system context.
	// 第一步:创建系统上下文
    createSystemContext();
  	// Create the system service manager.
  	// 启动SystemServiceManager管理器
    mSystemServiceManager = new SystemServiceManager(mSystemContext);
    mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
    LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
    // Prepare the thread pool for init tasks that can be parallelized
    SystemServerInitThreadPool.get();
	
    // 第二步:启动引导服务
	startBootstrapServices();
	// 第三步:systemReady处理
	startOtherServices();
	...
}

第一步:创建系统上下文

一、在SystemServer中创建ActivityThread实例
查看createSystemContext()方法,该方法主要用来是初始化 System Context和SystemUi Context,并设置主题。

private void createSystemContext() {
   
	// 1.得到ActivityThread 对象
    ActivityThread activityThread = ActivityThread.systemMain();
    // 获取系统上下文
    mSystemContext = activityThread.getSystemContext();
    // 设置主题
    mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
	// 获取系统ui上下文
    final Context systemUiContext = activityThread.getSystemUiContext();
    // 设置主题
    systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
}

在该方法中调用了ActivityThread类的systemMain方法,这个方法得到了一个ActivityThread对象,它代表当前进程 (此时为系统进程) 的主线程;找到ActivityThread的类,文件路径为:/frameworks/base/core/java/android/app/ActivityThread.java

 public static ActivityThread systemMain() {
   
     // The system process on low-memory devices do not get to use hardware
     // accelerated drawing, since this can add too much overhead to the
     // process.
     if (!ActivityManager.isHighEndGfx()) {
   
         ThreadedRenderer.disable(true);
     } else {
   
         ThreadedRenderer.enableForegroundTrimming();
     }
     // 创建ActivityThread 类
     ActivityThread thread = new ActivityThread();
     // 调用attach函数
     thread.attach(true);
     return thread;
 }

二、ActivityThread类
ActivityThread功能说明

  • ActivityThread是Android Framework中一个非常重要的类,它代表一个应用进程的主线程,其职责就是调度及执行在该线程中运行的四大组件。
  • 注意到此处的ActivityThread创建于SystemServer进程中。
  • 由于SystemServer中也运行着一些系统APK,例如framework-res.apk、SettingsProvider.apk等,因此也可以认为SystemServer是一个特殊的应用进程。
  • AMS负责管理和调度进程,因此AMS需要通过Binder机制和应用进程通信。

为此,Android提供了一个IApplicationThread接口,该接口定义了AMS和应用进程之间的交互函数。

1、从ActivityThreadsystemMain()方法中得知ActivityThread的创建,找到ActivityThread类的构造方法如下:

public final class ActivityThread {
   

    ...
    //定义了AMS与应用通信的接口,拿到ApplicationThread的对象
    final ApplicationThread mAppThread = new ApplicationThread();

    //拥有自己的looper,说明ActivityThread确实可以代表事件处理线程
    final Looper mLooper = Looper.myLooper();

    //H继承Handler,ActivityThread中大量事件处理依赖此Handler
    final H mH = new H();

    //用于保存该进程的ActivityRecord
    final ArrayMap<IBinder, ActivityClientRecord> mActivities = new ArrayMap<>();

    //用于保存进程中的Service
    final ArrayMap<IBinder, Service> mServices = new ArrayMap<>();

    用于保存进程中的Application
    final ArrayList<Application> mAllApplications
        = new ArrayList<Application>();
    //构造函数
    @UnsupportedAppUsage
    ActivityThread() {
   
        mResourcesManager = ResourcesManager.getInstance();
    }
}

构造方法中获取了ResourcesManager类单例模式创建的对象。

2、在ActivityThreadsystemMain()方法中还调用了ActivityThread类的attach方法,对于系统进程而言,ActivityThread的attach函数最重要的工作就是创建了Instrumentation、Application和Context。

private void attach(boolean system) {
   
        sCurrentActivityThread = this;
        mSystemThread = system;
        if (!system) {
   
			// 应用进程
			...
        } else {
   
            // 系统进程的处理流程,该情况只在SystemServer中处理
            android.ddm.DdmHandleAppName.setAppName("system_process",
                    UserHandle.myUserId());
            try {
   
           		//创建ActivityThread中的重要成员:Instrumentation、 Application 和 Context
                mInstrumentation = new Instrumentation();
                // 创建context
                ContextImpl context = ContextImpl.createAppContext(
                        this, getSystemContext().mPackageInfo);
                // 创建Application        
                mInitialApplication = context.mPackageInfo.makeApplication(true, null);
                mInitialApplication.onCreate();
            } catch (Exception e) {
   
                throw new RuntimeException(
                        "Unable to instantiate Application():" + e.toString(), e);
            }
        } 
    }
    ...

(1)、Instrumentation(仪表盘)
Instrumentation是Android中的一个工具类,当该类被启用时,它将优先于应用中其它的类被初始化。
此时,系统先创建它,再通过它创建其它组件。
(2)、Context
Context是Android中的一个抽象类,用于维护应用运行环境的全局信息。
通过Context可以访问应用的资源和类,甚至进行系统级的操作,例如启动Activity、发送广播等。attach方法中通过调用如下方法创建Context:

// 创建context
ContextImpl context = ContextImpl.createAppContext(
        this, getSystemContext().mPackageInfo);

找到ContextImpl类,路径为/frameworks/base/core/java/android/app/ContextImpl.java中的createAppContext方法:

  static ContextImpl createAppContext(ActivityThread mainThread, LoadedApk packageInfo) {
   
        if (packageInfo == null) throw new IllegalArgumentException("packageInfo");
        ContextImpl context = new ContextImpl(null, mainThread, packageInfo, null, null, null, 0,
                null);
        context.setResources(packageInfo.getResources());
        return context;
    }

而这个方法中传入的参数是getSystemContext().mPackageInfo,这里调用了getSystemContext()方法,找到该方法:

public ContextImpl getSystemContext() {
   
      synchronized (this) {
   
          if (mSystemContext == null) {
   
              mSystemContext = ContextImpl.createSystemContext(this);
          }
          return mSystemContext;
      }
}

这里又调用了ContextImpl.createSystemContext(this)方法,找到ContextImpl类的该方法:

static ContextImpl createSystemContext(ActivityThread mainThread) {
   
		//创建LoadedApk类,代表一个加载到系统中的APK
    	//注意此时的LoadedApk只是一个空壳
   		//PKMS还没有启动,无法得到有效的ApplicationInfo
        LoadedApk packageInfo 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ruiurrui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值