当前位置:   article > 正文

Android 10.0 系统服务之ActivityMnagerService-AMS启动流程-[Android取经之路]_android 10.0 activitymanagerservice

android 10.0 activitymanagerservice

[Android取经之路] 的源码都基于Android-Q(10.0) 进行分析

[Android取经之路] 系列文章:

《系统启动篇》

Android系统架构
Android是怎么启动的
Android 10.0系统启动之init进程
Android10.0系统启动之Zygote进程
Android 10.0 系统启动之SystemServer进程
Android 10.0 系统服务之ActivityMnagerService
Android10.0系统启动之Launcher(桌面)启动流程
Android10.0应用进程创建过程以及Zygote的fork流程
Android 10.0 PackageManagerService(一)工作原理及启动流程
Android 10.0 PackageManagerService(二)权限扫描
Android 10.0 PackageManagerService(三)APK扫描
Android 10.0 PackageManagerService(四)APK安装流程
《日志系统篇》

Android10.0 日志系统分析(一)-logd、logcat 指令说明、分类和属性
Android10.0 日志系统分析(二)-logd、logcat架构分析及日志系统初始化
Android10.0 日志系统分析(三)-logd、logcat读写日志源码分析
Android10.0 日志系统分析(四)-selinux、kernel日志在logd中的实现​
《Binder通信原理》:

Android10.0 Binder通信原理(一)Binder、HwBinder、VndBinder概要
Android10.0 Binder通信原理(二)-Binder入门篇
Android10.0 Binder通信原理(三)-ServiceManager篇
Android10.0 Binder通信原理(四)-Native-C\C++实例分析
Android10.0 Binder通信原理(五)-Binder驱动分析
Android10.0 Binder通信原理(六)-Binder数据如何完成定向打击
Android10.0 Binder通信原理(七)-Framework binder示例
Android10.0 Binder通信原理(八)-Framework层分析
Android10.0 Binder通信原理(九)-AIDL Binder示例
Android10.0 Binder通信原理(十)-AIDL原理分析-Proxy-Stub设计模式
Android10.0 Binder通信原理(十一)-Binder总结

《HwBinder通信原理》

HwBinder入门篇-Android10.0 HwBinder通信原理(一)
 HIDL详解-Android10.0 HwBinder通信原理(二)
HIDL示例-C++服务创建Client验证-Android10.0 HwBinder通信原理(三)
HIDL示例-JAVA服务创建-Client验证-Android10.0 HwBinder通信原理(四)
HwServiceManager篇-Android10.0 HwBinder通信原理(五)
Native层HIDL服务的注册原理-Android10.0 HwBinder通信原理(六)
Native层HIDL服务的获取原理-Android10.0 HwBinder通信原理(七)
JAVA层HIDL服务的注册原理-Android10.0 HwBinder通信原理(八)
JAVA层HIDL服务的获取原理-Android10.0 HwBinder通信原理(九)
HwBinder驱动篇-Android10.0 HwBinder通信原理(十)
HwBinder原理总结-Android10.0 HwBinder通信原理(十一)
《编译原理》

编译系统入门篇-Android10.0编译系统(一)
编译环境初始化-Android10.0编译系统(二)
make编译过程-Android10.0编译系统(三)
Image打包流程-Android10.0编译系统(四
Kati详解-Android10.0编译系统(五)
Blueprint简介-Android10.0编译系统(六)
Blueprint代码详细分析-Android10.0编译系统(七)
Android.bp 语法浅析-Android10.0编译系统(八)
Ninja简介-Android10.0编译系统(九)
Ninja提升编译速度的方法-Android10.0编译系统(十)
Android10.0编译系统(十一)

上一节讲解了SystemServer的架构、启动流程以及被Zygote 进程fork的流程,这一节重点讲解ActivityManagerService -AMS 服务是如何启动的。

 

1.概述
上一节我们讲完了SystemServer的启动过程,这一节接着上一节的步骤,来讲解ActivityManagerService的启动过程。

ActivityManagerService简称AMS,具有管理Activity行为、控制activity的生命周期、派发消息事件、内存管理等功能。

 

2.核心源码
 

  1. /frameworks/base/services/java/com/android/server/SystemServer.java
  2. /frameworks/base/core/java/android/app/ActivityThread.java
  3. /frameworks/base/core/java/android/app/Instrumentation.java
  4. /frameworks/base/core/java/android/app/ContextImpl.java
  5. /frameworks/base/core/java/android/app/LoadedApk.java
  6. /frameworks/base/core/java/android/app/Application.java
  7. /frameworks/base/core/java/com/android/server/LocalServices.java
  8. /frameworks/base/services/core/java/com/android/server/ServiceThread.java
  9. /frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
  10. /frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
  11. /frameworks/base/services/core/java/com/android/server/wm/RootActivityContainer.java
  12. /frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

3.架构

ActivityManagerService启动共分为以下4个阶段:

阶段1:为SystemSerer进程创建Android运行环境。AMS运行与SystemServer进程中,它的许多工作依赖于该运行环境

createSystemContext() -> new ActvityThread()-->attach ->getSystemContext ->createSystemContext

阶段2:启动AMS,主要进行一些初始化工作

  1. new ActivityManagerService()
  2. start()

阶段3:将SystemServer进程纳入到AMS的进程管理体系中

  1. setSystemProcess() //将framework-res.apk的信息加入到SystemServer进程的LoadedApk中;构建SystemServer进程的ProcessRecord,保存到AMS中,以便AMS进程统一管理
  2. installSystemProvider() //安装SystemServer进程中的SettingsProvider.apk

阶段4:AMS启动完成,通知服务或应用完成后续的工作,或直接启动一些进程

AMS.systemReady() //许多服务或应用进程必须等待AMS完成启动工作后,才能启动或进行一些后续工作;AMS就是在systemReady中,通知或者启动这些等待的服务和应用进程,例如启动桌面等。

 

ActivityManagerService时序图如下:

4. ActivityManagerService启动流程-源码分析

 

4.1 SystemServer启动
Zygote进行启动后,第一个Fork出SystemServer进程,SystemServer的启动流程可以参考我之前的文章,这里只分析与AMS相关的启动流程:

初始化 SystemContext
创建SystemServiceManager 对象,用来启动后面的服务
启动系统服务,共分为三种系统服务:系统引导服务(Boot Service)、核心服务(Core Service)和其他服务(Other Service)
在引导服务(Boot Service)中启动ATM、AMS服务
在其他服务(Other Service)中完成AMS的最后工作systemReady
源码:

[SystemServer.java]
 

  1. public static void main(String[] args) {
  2. new SystemServer().run();
  3. }
  4. private void run() {
  5. ...
  6. //1.初始化 System Context
  7. createSystemContext(); //参考[4.2]
  8. //2.创建 SystemServiceManager 对象,用来启动后面的服务
  9. mSystemServiceManager = new SystemServiceManager(mSystemContext);
  10. //参考[4.3]
  11. mSystemServiceManager.setStartInfo(mRuntimeRestart,
  12. mRuntimeStartElapsedTime, mRuntimeStartUptime);
  13. LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
  14. ...
  15. //3.启动服务
  16. startBootstrapServices(); //启动引导服务,参考[4.1.1]
  17. startCoreServices(); //启动核心服务
  18. startOtherServices(); //启动其他服务,参考[4.1.2]
  19. ...
  20. }

4.1.1 [SystemServer.java] startBootstrapServices()

说明:启动引导服务,在其中启动了ATM和AMS服务,通过AMS安装Installer、初始化Power,设置系统进程等。

源码:

  1. private void startBootstrapServices() {
  2. ...
  3. //启动ActivityTaskManagerService服务,简称ATM,Android10新引入功能,用来管理Activity的启动、调度等功能
  4. //参考[4.4]
  5. atm = mSystemServiceManager.startService(
  6. ActivityTaskManagerService.Lifecycle.class).getService();
  7. //参考[4.5]
  8. //启动服务 ActivityManagerService,简称AMS
  9. mActivityManagerService = ActivityManagerService.Lifecycle.startService(
  10. mSystemServiceManager, atm);
  11. //安装Installer
  12. mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
  13. mActivityManagerService.setInstaller(installer);
  14. //初始化PowerManager
  15. mActivityManagerService.initPowerManagement();
  16. //设置系统进程,参考4.6
  17. mActivityManagerService.setSystemProcess();
  18. }

4.1.2 [SystemServer.java] startOtherServices

说明:启动其他服务,AMS启动后,完成后续桌面启动等操作

源码:

  1. private void startOtherServices() {
  2. ...
  3. //安装SettingsProvider.apk
  4. mActivityManagerService.installSystemProviders();
  5. mActivityManagerService.setWindowManager(wm);
  6. //AMS启动完成,完成后续的工作,例如启动桌面等
  7. //参考[4.7]
  8. mActivityManagerService.systemReady(() -> {
  9. ...
  10. }, BOOT_TIMINGS_TRACE_LOG);
  11. ...
  12. }

4.2 System Context初始化
说明: 在SystemServer的run函数中,在启动AMS之前,调用了createSystemContext函,主要用来是初始化 System Context和SystemUi Context,并设置主题

当SystemServer 调用createSystemContext()完毕后,完成以下两个内容:

得到了一个ActivityThread对象,它代表当前进程 (此时为系统进程) 的主线程; 
得到了一个Context对象,对于SystemServer而言,它包含的Application运行环境与framework-res.apk有关。
源码:

[SystemServer.java]
 

  1. private void createSystemContext() {
  2. ActivityThread activityThread = ActivityThread.systemMain(); //参考[4.2.1]
  3. //获取system context
  4. mSystemContext = activityThread.getSystemContext();
  5. //设置系统主题
  6. mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
  7. //获取systemui context
  8. final Context systemUiContext = activityThread.getSystemUiContext();
  9. //设置systemUI 主题
  10. systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
  11. }

4.2.1 [ActivityThread.java] systemMain()

说明:systemMain函数主要作用是: 创建ActivityThread对象,然后调用该对象的attach函数。

源码:

[ActivityThread.java]

  1. public static ActivityThread systemMain() {
  2. // The system process on low-memory devices do not get to use hardware
  3. // accelerated drawing, since this can add too much overhead to the
  4. // process.
  5. if (!ActivityManager.isHighEndGfx()) {
  6. ThreadedRenderer.disable(true);
  7. } else {
  8. ThreadedRenderer.enableForegroundTrimming();
  9. }
  10. //获取ActivityThread对象
  11. ActivityThread thread = new ActivityThread(); //参考[4.2.2]
  12. thread.attach(true, 0); 参考[4.2.3]
  13. return thread;
  14. }

4.2.2 ActivityThread 对象创建
说明:ActivityThread是Android Framework中一个非常重要的类,它代表一个应用进程的主线程,其职责就是调度及执行在该线程中运行的四大组件。 

注意到此处的ActivityThread创建于SystemServer进程中。 

由于SystemServer中也运行着一些系统APK,例如framework-res.apk、SettingsProvider.apk等,因此也可以认为SystemServer是一个特殊的应用进程。

AMS负责管理和调度进程,因此AMS需要通过Binder机制和应用进程通信。 

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

ActivityThread的构造函数比较简单,获取ResourcesManager的单例对象,比较关键的是它的成员变量:

源码:
 

  1. public final class ActivityThread extends ClientTransactionHandler {
  2. ...
  3. //定义了AMS与应用通信的接口,拿到ApplicationThread的对象
  4. final ApplicationThread mAppThread = new ApplicationThread();
  5. //拥有自己的looper,说明ActivityThread确实可以代表事件处理线程
  6. final Looper mLooper = Looper.myLooper();
  7. //H继承Handler,ActivityThread中大量事件处理依赖此Handler
  8. final H mH = new H();
  9. //用于保存该进程的ActivityRecord
  10. final ArrayMap<IBinder, ActivityClientRecord> mActivities = new ArrayMap<>();
  11. //用于保存进程中的Service
  12. final ArrayMap<IBinder, Service> mServices = new ArrayMap<>();
  13. 用于保存进程中的Application
  14. final ArrayList<Application> mAllApplications
  15. = new ArrayList<Application>();
  16. //构造函数
  17. @UnsupportedAppUsage
  18. ActivityThread() {
  19. mResourcesManager = ResourcesManager.getInstance();
  20. }
  21. }

4.2.3 [ActivityThread.java] attach
说明:对于系统进程而言,ActivityThread的attach函数最重要的工作就是创建了Instrumentation、Application和Context

调用:attach(true, 0),传入的system为0

源码:
 

  1. private void attach(boolean system, long startSeq) {
  2. mSystemThread = system;
  3. //传入的system为0
  4. if (!system) {
  5. //应用进程的处理流程
  6. ...
  7. } else {
  8. //系统进程的处理流程,该情况只在SystemServer中处理
  9. //创建ActivityThread中的重要成员:Instrumentation、 Application 和 Context
  10. mInstrumentation = new Instrumentation();
  11. mInstrumentation.basicInit(this);
  12. //创建系统的Context,参考[4.2.4]
  13. ContextImpl context = ContextImpl.createAppContext(
  14. this, getSystemContext().mPackageInfo);
  15. //调用LoadedApk的makeApplication函数
  16. mInitialApplication = context.mPackageInfo.makeApplication(true, null);
  17. mInitialApplication.onCreate();
  18. }
  19. }

Instrumentation 

Instrumentation是Android中的一个工具类,当该类被启用时,它将优先于应用中其它的类被初始化。 

此时,系统先创建它,再通过它创建其它组件。

mInstrumentation = new Instrumentation();
mInstrumentation.basicInit(this);
Context

Context是Android中的一个抽象类,用于维护应用运行环境的全局信息。

通过Context可以访问应用的资源和类,甚至进行系统级的操作,例如启动Activity、发送广播等。

ActivityThread的attach函数中,通过下面的代码创建出系统应用对应的Context:

ContextImpl context = ContextImpl.createAppContext(this, getSystemContext().mPackageInfo);
Application:

Android中Application类用于保存应用的全局状态。

在ActivityThread中,针对系统进程,通过下面的代码创建了初始的Application:

mInitialApplication = context.mPackageInfo.makeApplication(true, null);
mInitialApplication.onCreate();
 

4.2.4 [ContextImpl.java] getSystemContext()
说明:创建并返回System Context

源码:


public ContextImpl getSystemContext() {
    synchronized (this) {
        if (mSystemContext == null) {
            //调用ContextImpl的静态函数createSystemContext
            mSystemContext = ContextImpl.createSystemContext(this);
        }
        return mSystemContext;
    }
}
说明:createSystemContext的内容就是创建一个LoadedApk,然后初始化一个ContextImpl对象。 
注意到createSystemContext函数中,创建的LoadApk对应packageName为”android”,也就是framwork-res.apk。 
由于该APK仅供SystemServer进程使用,因此创建的Context被定义为System Context。 
现在该LoadedApk还没有得到framwork-res.apk实际的信息。
当PKMS启动,完成对应的解析后,AMS将重新设置这个LoadedApk。

static ContextImpl createSystemContext(ActivityThread mainThread) {
    //创建LoadedApk类,代表一个加载到系统中的APK
    //注意此时的LoadedApk只是一个空壳
    //PKMS还没有启动,无法得到有效的ApplicationInfo
    LoadedApk packageInfo = new LoadedApk(mainThread);
 
    //拿到ContextImpl 的对象
    ContextImpl context = new ContextImpl(null, mainThread, packageInfo, null, null, null, 0,
            null, null);
     //初始化资源信息
    context.setResources(packageInfo.getResources());
    context.mResources.updateConfiguration(context.mResourcesManager.getConfiguration(),
            context.mResourcesManager.getDisplayMetrics());
    return context;
}
4.3 SystemServiceManager 创建
说明: 通过 SystemServiceManager 的构造方法创建一个 SystemServiceManager 对象,并将该对象添加到 LocalServices 中。

源码:

private void run() {
    ...
    //1.创建SystemServiceManager对象,参考 [4.3.1]
    mSystemServiceManager = new SystemServiceManager(mSystemContext);
    mSystemServiceManager.setStartInfo(mRuntimeRestart,
            mRuntimeStartElapsedTime, mRuntimeStartUptime);
    //2.启动SystemServiceManager服务,参考[4.3.2]
    LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
    ...
}
 

4.3.1 [SystemServiceManager.java] SystemServiceManager()
说明:SystemServiceManager 对象主要用于管理 SystemService 的创建、启动等生命周期,SystemService 类是一个抽象类

在 SystemServiceManager 中都是通过反射创建 SystemService 中对象的,而且在 startService(@NonNull final SystemService service) 方法中,会将 SystemService 添加到 mServices 中,并调用 onStart() 方法

SystemServiceManager构造函数没有多少内容,主要是把传进来的system Context赋值给 mContext,供后续服务创建使用

源码:

  1. public class SystemServiceManager {
  2. ...
  3. private final Context mContext;
  4. private final ArrayList<SystemService> mServices = new ArrayList<SystemService>();
  5. ...
  6. SystemServiceManager(Context context) {
  7. mContext = context;
  8. }
  9. public SystemService startService(String className) {
  10. final Class<SystemService> serviceClass;
  11. try {
  12. //通过反射根据类名,拿到类对象
  13. serviceClass = (Class<SystemService>)Class.forName(className);
  14. } catch (ClassNotFoundException ex) {
  15. Slog.i(TAG, "Starting " + className);
  16. ...
  17. }
  18. return startService(serviceClass);
  19. }
  20. public <T extends SystemService> T startService(Class<T> serviceClass) {
  21. try {
  22. final String name = serviceClass.getName();
  23. // Create the service.
  24. final T service;
  25. ...
  26. service = constructor.newInstance(mContext);
  27. ...
  28. startService(service);
  29. return service;
  30. } finally {
  31. Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
  32. }
  33. }
  34. public void startService(@NonNull final SystemService service) {
  35. // Register it.
  36. mServices.add(service);
  37. // Start it.
  38. long time = SystemClock.elapsedRealtime();
  39. try {
  40. service.onStart(); //调用各个服务中的onStart()方法完成服务启动
  41. } catch (RuntimeException ex) {
  42. throw new RuntimeException("Failed to start service " + service.getClass().getName()
  43. + ": onStart threw an exception", ex);
  44. }
  45. }
  46. }

4.3.2 [LocalServices.java] addService(SystemServiceManager.class, mSystemServiceManager);

说明:把SystemServiceManager的对象加入到本地服务的全局注册表中

源码:

  1. public final class LocalServices {
  2. private LocalServices() {}
  3. private static final ArrayMap<Class<?>, Object> sLocalServiceObjects =
  4. new ArrayMap<Class<?>, Object>();
  5. //返回实现指定接口的本地服务实例对象
  6. @SuppressWarnings("unchecked")
  7. public static <T> T getService(Class<T> type) {
  8. synchronized (sLocalServiceObjects) {
  9. return (T) sLocalServiceObjects.get(type);
  10. }
  11. }
  12. //将指定接口的服务实例添加到本地服务的全局注册表中
  13. public static <T> void addService(Class<T> type, T service) {
  14. synchronized (sLocalServiceObjects) {
  15. if (sLocalServiceObjects.containsKey(type)) {
  16. throw new IllegalStateException("Overriding service registration");
  17. }
  18. sLocalServiceObjects.put(type, service);
  19. }
  20. }
  21. //删除服务实例,只能在测试中使用。
  22. public static <T> void removeServiceForTest(Class<T> type) {
  23. synchronized (sLocalServiceObjects) {
  24. sLocalServiceObjects.remove(type);
  25. }
  26. }
  27. }

4.4 ActivityTaskManagerService 服务启动
说明:ActivityTaskManagerService简称ATM,Android10中引入新功能,用来管理Activity的启动、调度等功能

源码:

private void startBootstrapServices() {
    ...
    //启动ATM
    atm = mSystemServiceManager.startService(
                ActivityTaskManagerService.Lifecycle.class).getService();
    ...
}
4.4.1 ATM服务启动过程
说明:从4.3.1 中我们知道SystemServiceManager.startService最终调用的是启动对象中的onStart方法

因此ATM启动,最终会调用ActivityTaskManagerService.Lifecycle.onStart()来启动ATM服务

源码:

 

public static final class Lifecycle extends SystemService {
        private final ActivityTaskManagerService mService;
 
        public Lifecycle(Context context) {
            super(context);
            //1.创建ActivityTaskManagerService,得到对象,参考[4.4.2]
            mService = new ActivityTaskManagerService(context);
        }
 
        @Override
        public void onStart() {
            publishBinderService(Context.ACTIVITY_TASK_SERVICE, mService);
            //2.启动ATM服务,,参考[4.4.3]
            mService.start();
        }
        ...
        public ActivityTaskManagerService getService() {
            return mService;
        }
    }
4.4.2 ActivityTaskManagerService 对象创建
说明:ActivityTaskManagerService简称ATM, Android10新引入功能,用来管理Activity的启动、调度等功能

Android10 中把原先在AMS中activity的管理移动到ATM中

从Android 10的代码路径可以看出,管理Activity的ATM被放入到的wm路径中,这个路径原先归WindowManagerService -WMS控制,谷歌的目的也是希望在将来把activity和window融合在一起,减少冗余代码以及AMS和WMS的协调工作

ATM的路径为:frameworks\base\services\core\java\com\android\server\wm

AMS的路径为:frameworks\base\services\core\java\com\android\server\am

ATM服务提供了AIDL接口供
 

  1. public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
  2. final Context mUiContext;
  3. final ActivityThread mSystemThread;
  4. final ActivityTaskManagerInternal mInternal;
  5. //ActivityStackSupervisor 是ATM中用来管理Activity启动和调度的核心类
  6. public ActivityStackSupervisor mStackSupervisor;
  7. //Activity 容器的根节点
  8. RootActivityContainer mRootActivityContainer;
  9. //WMS 负责窗口的管理
  10. WindowManagerService mWindowManager;
  11. //这是我们目前认为是"Home" Activity的过程
  12. WindowProcessController mHomeProcess;
  13. public ActivityTaskManagerService(Context context) {
  14. //拿到System Context
  15. mContext = context;
  16. mFactoryTest = FactoryTest.getMode();
  17. //取出的是ActivityThread的静态变量sCurrentActivityThread
  18. //这意味着mSystemThread与SystemServer中的ActivityThread一致
  19. mSystemThread = ActivityThread.currentActivityThread();
  20. //拿到System UI Context
  21. mUiContext = mSystemThread.getSystemUiContext();
  22. mLifecycleManager = new ClientLifecycleManager();
  23. //拿到LocalService的对象
  24. mInternal = new LocalService();
  25. GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version", GL_ES_VERSION_UNDEFINED);
  26. }
  27. }

4.4.3 [ActivityTaskManagerService.java] start()
说明:将 ActivityTaskManagerInternal添加到本地服务的全局注册表中,ActivityTaskManagerInternal为抽象类

源码:

private void start() {
    LocalServices.addService(ActivityTaskManagerInternal.class, mInternal);
}
4.5 ActivityManagerService 服务启动
说明:ActivityManagerService简称AMS,在Android 10的版本中,Activity的管理和调度移到ATM中,AMS负责 service,broadcast,provider的管理和调度

源码:

private void startBootstrapServices() {
    ...
    //启动AMS
    mActivityManagerService = ActivityManagerService.Lifecycle.startService(mSystemServiceManager, atm);
    ...
}
 

4.5.1 AMS服务启动过程
说明:从4.3.1 中我们知道SystemServiceManager.startService最终调用的是启动对象中的onStart方法

因此AMS服务启动,最终会调用ActivityManagerService.Lifecycle.onStart()来启动ATM服务

源码:
 

  1. public static final class Lifecycle extends SystemService {
  2. private final ActivityManagerService mService;
  3. private static ActivityTaskManagerService sAtm;
  4. public Lifecycle(Context context) {
  5. super(context);
  6. //1.创建ActivityManagerService,得到对象,传入ATM的对象,参考[4.5.2]
  7. mService = new ActivityManagerService(context, sAtm);
  8. }
  9. @Override
  10. public void onStart() {
  11. mService.start();
  12. }
  13. ...
  14. public ActivityManagerService getService() {
  15. return mService;
  16. }
  17. }

4.5.2 AMS 对象创建
说明:Android10中,Activity的管理和调度放入到ATM中执行,AMS中保留 service,broadcast,provider的管理和调度

构造函数初始化主要工作就是初始化一些变量,供之后的service,broadcast,provider的管理和调度

源码:
 

  1. public class ActivityManagerService extends IActivityManager.Stub
  2. implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
  3. public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) {
  4. ...
  5. //AMS的运行上下文与SystemServer一致
  6. mContext = systemContext;
  7. ...
  8. //取出的是ActivityThread的静态变量sCurrentActivityThread
  9. //这意味着mSystemThread与SystemServer中的ActivityThread一致
  10. mSystemThread = ActivityThread.currentActivityThread();
  11. mUiContext = mSystemThread.getSystemUiContext();
  12. mHandlerThread = new ServiceThread(TAG,
  13. THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
  14. mHandlerThread.start();
  15. //处理AMS中消息的主力
  16. mHandler = new MainHandler(mHandlerThread.getLooper());
  17. //UiHandler对应于Android中的UiThread
  18. mUiHandler = mInjector.getUiHandler(this);
  19. //创建 BroadcastQueue 前台广播对象,处理超时时长是 10s
  20. mFgBroadcastQueue = new BroadcastQueue(this, mHandler,
  21. "foreground", foreConstants, false);
  22. //创建 BroadcastQueue 后台广播对象,处理超时时长是 60s
  23. mBgBroadcastQueue = new BroadcastQueue(this, mHandler,
  24. "background", backConstants, true);
  25. //创建 BroadcastQueue 分流广播对象,处理超时时长是 60s
  26. mOffloadBroadcastQueue = new BroadcastQueue(this, mHandler,
  27. "offload", offloadConstants, true);
  28. mBroadcastQueues[0] = mFgBroadcastQueue;
  29. mBroadcastQueues[1] = mBgBroadcastQueue;
  30. mBroadcastQueues[2] = mOffloadBroadcastQueue;
  31. // 创建 ActiveServices 对象,用于管理 ServiceRecord 对象
  32. mServices = new ActiveServices(this);
  33. // 创建 ProviderMap 对象,用于管理 ContentProviderRecord 对象
  34. mProviderMap = new ProviderMap(this);
  35. //得到ATM的对象,调用ATM.initialize
  36. mActivityTaskManager = atm;
  37. mActivityTaskManager.initialize(mIntentFirewall, mPendingIntentController,
  38. DisplayThread.get().getLooper());
  39. //得到ATM的服务信息
  40. mAtmInternal = LocalServices.getService(
  41. ActivityTaskManagerInternal.class);
  42. //加入Watchdog的监控
  43. Watchdog.getInstance().addMonitor(this);
  44. Watchdog.getInstance().addThread(mHandler);
  45. }
  46. }

4.5.3 [ActivityManagerService.java] start()

说明:start中做了两件事

1)启动 CPU 监控线程,在启动 CPU 监控线程之前,首先将进程复位

2)注册电池状态服务和权限管理服务

源码:

  1. private void start() {
  2. //1.移除所有的进程组
  3. removeAllProcessGroups();
  4. //启动 CPU 监控线程
  5. mProcessCpuThread.start();
  6. //2.注册电池状态和权限管理服务
  7. mBatteryStatsService.publish();
  8. mAppOpsService.publish(mContext);
  9. Slog.d("AppOps", "AppOpsService published");
  10. LocalServices.addService(ActivityManagerInternal.class, new LocalService());
  11. mActivityTaskManager.onActivityManagerInternalAdded();
  12. mUgmInternal.onActivityManagerInternalAdded();
  13. mPendingIntentController.onActivityManagerInternalAdded();
  14. // Wait for the synchronized block started in mProcessCpuThread,
  15. // so that any other access to mProcessCpuTracker from main thread
  16. // will be blocked during mProcessCpuTracker initialization.
  17. try {
  18. mProcessCpuInitLatch.await();
  19. } catch (InterruptedException e) {
  20. Slog.wtf(TAG, "Interrupted wait during start", e);
  21. Thread.currentThread().interrupt();
  22. throw new IllegalStateException("Interrupted wait during start");
  23. }
  24. }

4.6 [SystemServer.java] setSystemProcess()
说明:为系统进程设置应用程序实例并开始

源码:

private void startOtherServices() {
     //参考[4.6.1]
     Set up the Application instance for the system process and get started.
     mActivityManagerService.setSystemProcess();
 }
4.6.1 [ActivityManagerService.java] setSystemProcess()
说明:AMS的setSystemProcess主要有五个主要的功能: 

注册一些服务:包括 activity、procstats、meminfo、gfxinfo、dbinfo、permission、processinfo
获取package名为“android”的应用的 ApplicationInfo; 
为ActivityThread 安装 system application相关信息,将framework-res.apk对应的ApplicationInfo安装到LoadedApk中的mApplicationInfo 
为systemserver 主进程开辟一个ProcessRecord来维护进程的相关信息
AMS进程管理相关的操作。
源码:
 

  1. public void setSystemProcess() {
  2. try {
  3. //1.注册一些服务到ServiceManager:包括 activity、procstats、meminfo、gfxinfo、dbinfo、permission、processinfo
  4. ServiceManager.addService(Context.ACTIVITY_SERVICE, this, /* allowIsolated= */ true,
  5. DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO);
  6. ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
  7. ServiceManager.addService("meminfo", new MemBinder(this), /* allowIsolated= */ false,
  8. DUMP_FLAG_PRIORITY_HIGH);
  9. ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
  10. ServiceManager.addService("dbinfo", new DbBinder(this));
  11. if (MONITOR_CPU_USAGE) {
  12. ServiceManager.addService("cpuinfo", new CpuBinder(this),
  13. /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
  14. }
  15. ServiceManager.addService("permission", new PermissionController(this));
  16. ServiceManager.addService("processinfo", new ProcessInfoService(this));
  17. //2.通过解析framework-res.apk里的AndroidManifest.xml获得ApplicationInfo
  18. ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(
  19. "android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);
  20. //3.为ActivityThread 安装 system application相关信息,将framework-res.apk对应的ApplicationInfo安装到LoadedApk中的mApplicationInfo
  21. mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());
  22. //4.为systemserver 主进程开辟一个ProcessRecord来维护进程的相关信息
  23. synchronized (this) {
  24. ProcessRecord app = mProcessList.newProcessRecordLocked(info, info.processName,
  25. false,
  26. 0,
  27. new HostingRecord("system"));
  28. app.setPersistent(true); //设置进程常驻
  29. app.pid = MY_PID; //为ProcessRecord赋值当前进程ID,即system_server进程ID
  30. app.getWindowProcessController().setPid(MY_PID);
  31. app.maxAdj = ProcessList.SYSTEM_ADJ;
  32. app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);
  33. mPidsSelfLocked.put(app); //将ProcessRecord放到mPidSelfLocked里统一管理
  34. mProcessList.updateLruProcessLocked(app, false, null);
  35. updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE);
  36. }
  37. } catch (PackageManager.NameNotFoundException e) {
  38. throw new RuntimeException(
  39. "Unable to find android system package", e);
  40. }
  41. // Start watching app ops after we and the package manager are up and running.
  42. mAppOpsService.startWatchingMode(AppOpsManager.OP_RUN_IN_BACKGROUND, null,
  43. new IAppOpsCallback.Stub() {
  44. @Override public void opChanged(int op, int uid, String packageName) {
  45. if (op == AppOpsManager.OP_RUN_IN_BACKGROUND && packageName != null) {
  46. if (mAppOpsService.checkOperation(op, uid, packageName)
  47. != AppOpsManager.MODE_ALLOWED) {
  48. runInBackgroundDisabled(uid);
  49. }
  50. }
  51. }
  52. });
  53. }

4.7 完成ActivityManagerService 最后工作[ActivityManagerService.java] systemReady()
说明: AMS的systemReady 处理分为三个阶段

阶段1:主要是调用一些关键服务的初始化函数, 然后杀死那些没有FLAG_PERSISTENT却在AMS启动完成前已经存在的进程, 

同时获取一些配置参数。 需要注意的是,由于只有Java进程才会向AMS注册,而一般的Native进程不会向AMS注册,因此此处杀死的进程是Java进程。

阶段2:执行goingCallback的处理,主要的工作就是通知一些服务可以进行systemReady、systemRunning相关的工作,并进行启动服务或应用进程的工作

阶段3:启动Home Activity,当启动结束,并发送ACTION_BOOT_COMPLETED广播时,AMS的启动过程告一段落

 

源码:
 

  1. private void startOtherServices() {
  2. mActivityManagerService.systemReady(() -> {xxxxxgoingCallbackxxx,
  3. BOOT_TIMINGS_TRACE_LOG);
  4. }
  5. public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) {
  6. 阶段1:关键服务的初始化
  7. 阶段2:goingCallback处理
  8. 阶段3:启动Home Activity,完成AMS启动
  9. }

4.7.1 systemReady 阶段1
说明:主要是调用一些关键服务的初始化函数, 然后杀死那些没有 FLAG_PERSISTENT 却在AMS启动完成前已经存在的进程, 同时获取一些配置参数。 需要注意的是,由于只有Java进程才会向AMS注册,而一般的Native进程不会向AMS注册,因此此处杀死的进程是Java进程。

源码:
 

  1. public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) {
  2. synchronized(this) {
  3. //第一次进入mSystemReady 为false,不走该流程
  4. if (mSystemReady) {
  5. if (goingCallback != null) {
  6. goingCallback.run();
  7. }
  8. return;
  9. }
  10. /** PowerSaveMode_start */
  11. Settings.System.putInt(mContext.getContentResolver(),
  12. ActivityTaskManagerService.SUPER_POWER_SAVE_MODE,
  13. ActivityTaskManagerService.SUPER_POWER_SAVE_MODE_NORMAL);
  14. /** PowerSaveMode_end */
  15. //这一部分主要是调用一些关键服务SystemReady相关的函数,
  16. //进行一些等待AMS初始完,才能进行的工作
  17. mActivityTaskManager.onSystemReady();
  18. mUserController.onSystemReady();
  19. mAppOpsService.systemReady();
  20. ...
  21. mSystemReady = true;
  22. }
  23. try {
  24. sTheRealBuildSerial = IDeviceIdentifiersPolicyService.Stub.asInterface(
  25. ServiceManager.getService(Context.DEVICE_IDENTIFIERS_SERVICE))
  26. .getSerial();
  27. } catch (RemoteException e) {}
  28. ArrayList<ProcessRecord> procsToKill = null;
  29. synchronized(mPidsSelfLocked) {
  30. //mPidsSelfLocked 中保存当前正在运行的所有进程的信息
  31. for (int i=mPidsSelfLocked.size()-1; i>=0; i--) {
  32. ProcessRecord proc = mPidsSelfLocked.valueAt(i);
  33. //在AMS启动完成前,如果没有FLAG_PERSISTENT标志的进程已经启动了,
  34. //就将这个进程加入到procsToKill中
  35. if (!isAllowedWhileBooting(proc.info)){
  36. if (procsToKill == null) {
  37. procsToKill = new ArrayList<ProcessRecord>();
  38. }
  39. procsToKill.add(proc);
  40. }
  41. }
  42. }
  43. //收集已经启动的进程并杀死,排除persistent常驻进程
  44. synchronized(this) {
  45. //利用removeProcessLocked关闭procsToKill中的进程
  46. if (procsToKill != null) {
  47. for (int i=procsToKill.size()-1; i>=0; i--) {
  48. ProcessRecord proc = procsToKill.get(i);
  49. Slog.i(TAG, "Removing system update proc: " + proc);
  50. mProcessList.removeProcessLocked(proc, true, false, "system update done");
  51. }
  52. }
  53. //至此系统准备完毕
  54. mProcessesReady = true;
  55. }
  56. ...
  57. mUgmInternal.onSystemReady();
  58. }

4.7.2 systemReady 阶段2

说明:执行goingCallback的处理,主要的工作就是通知一些服务可以进行systemReady相关的工作,并进行启动服务或应用进程的工作

源码:

  1. public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) {
  2. ...
  3. //1.调用参数传入的runnable对象,SystemServer中有具体的定义,参考[4.7.2.1]
  4. if (goingCallback != null) goingCallback.run();
  5. ...
  6. //调用所有系统服务的onStartUser接口
  7. mSystemServiceManager.startUser(currentUserId);
  8. synchronized (this) {
  9. //启动persistent为1的application所在的进程,参考[4.7.2.2]
  10. startPersistentApps(PackageManager.MATCH_DIRECT_BOOT_AWARE);
  11. // Start up initial activity.
  12. mBooting = true;
  13. ...
  14. }

4.7.2.1 goingCallback.run()

说明:监控Native的crash,启动WebView,执行一些服务的systemReady 和systemRunning方法

源码:

  1. private void startOtherServices() {
  2. mActivityManagerService.systemReady(() -> {
  3. //阶段 550
  4. mSystemServiceManager.startBootPhase(
  5. SystemService.PHASE_ACTIVITY_MANAGER_READY);
  6. ...
  7. //监控Native的crash
  8. mActivityManagerService.startObservingNativeCrashes();
  9. , BOOT_TIMINGS_TRACE_LOG);
  10. ...
  11. //启动WebView
  12. mWebViewUpdateService.prepareWebViewInSystemServer();
  13. //启动systemUI,参考[4.7.2.3]
  14. startSystemUi(context, windowManagerF);
  15. // 执行一系列服务的systemReady方法
  16. networkManagementF.systemReady();
  17. ipSecServiceF.systemReady();
  18. networkStatsF.systemReady();
  19. connectivityF.systemReady();
  20. networkPolicyF.systemReady(networkPolicyInitReadySignal);
  21. ...
  22. //阶段 600
  23. mSystemServiceManager.startBootPhase(
  24. SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);
  25. //执行一系列服务的systemRunning方法
  26. locationF.systemRunning();
  27. countryDetectorF.systemRunning();
  28. networkTimeUpdaterF.systemRunning();
  29. inputManagerF.systemRunning();
  30. telephonyRegistryF.systemRunning();
  31. mediaRouterF.systemRunning();
  32. mmsServiceF.systemRunning();
  33. ...
  34. }

4.7.2.2 [ActivityManagerService.java] startPersistentApps

说明:启动persistent为1的application所在的进程

源码:

  1. void startPersistentApps(int matchFlags) {
  2. if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL) return;
  3. synchronized (this) {
  4. try {
  5. //从PKMS中得到persistent为1的ApplicationInfo
  6. final List<ApplicationInfo> apps = AppGlobals.getPackageManager()
  7. .getPersistentApplications(STOCK_PM_FLAGS | matchFlags).getList();
  8. for (ApplicationInfo app : apps) {
  9. //由于framework-res.apk已经由系统启动,所以此处不再启动它
  10. if (!"android".equals(app.packageName)) {
  11. //addAppLocked中将启动application所在进程
  12. addAppLocked(app, null, false, null /* ABI override */);
  13. }
  14. }
  15. } catch (RemoteException ex) {
  16. }
  17. }
  18. }

4.7.2.3 启动systemUI startSystemUi

说明:启动system UI, 启动服务,服务名称”com.android.systemui/.SystemUIService”

源码:

[SystemServer.java]

  1. private static void startSystemUi(Context context, WindowManagerService windowManager) {
  2. Intent intent = new Intent();
  3. intent.setComponent(new ComponentName("com.android.systemui",
  4. "com.android.systemui.SystemUIService"));
  5. intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
  6. //Slog.d(TAG, "Starting service: " + intent);
  7. context.startServiceAsUser(intent, UserHandle.SYSTEM);
  8. windowManager.onSystemUiStarted();
  9. }

4.7.3 systemReady 阶段3

说明:启动Home Activity,当启动结束,并发送ACTION_BOOT_COMPLETED广播时,AMS的启动过程告一段落

源码:

  1. public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) {
  2. ...
  3. //1.通过ATM,启动Home Activity,参考[4.7.3.1]
  4. mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");
  5. ...
  6. //2.发送一些广播消息
  7. try {
  8. //system发送广播 ACTION_USER_STARTED = "android.intent.action.USER_STARTED";
  9. Intent intent = new Intent(Intent.ACTION_USER_STARTED);
  10. intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
  11. | Intent.FLAG_RECEIVER_FOREGROUND);
  12. intent.putExtra(Intent.EXTRA_USER_HANDLE, currentUserId);
  13. broadcastIntentLocked(null, null, intent,
  14. null, null, 0, null, null, null, OP_NONE,
  15. null, false, false, MY_PID, SYSTEM_UID, callingUid, callingPid,
  16. currentUserId);
  17. //system发送广播 ACTION_USER_STARTING= "android.intent.action.USER_STARTING";
  18. intent = new Intent(Intent.ACTION_USER_STARTING);
  19. intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
  20. intent.putExtra(Intent.EXTRA_USER_HANDLE, currentUserId);
  21. broadcastIntentLocked(null, null, intent,
  22. null, new IIntentReceiver.Stub() {
  23. @Override
  24. public void performReceive(Intent intent, int resultCode, String data,
  25. Bundle extras, boolean ordered, boolean sticky, int sendingUser)
  26. throws RemoteException {
  27. }
  28. }, 0, null, null,
  29. new String[] {INTERACT_ACROSS_USERS}, OP_NONE,
  30. null, true, false, MY_PID, SYSTEM_UID, callingUid, callingPid,
  31. UserHandle.USER_ALL);
  32. } catch (Throwable t) {
  33. Slog.wtf(TAG, "Failed sending first user broadcasts", t);
  34. } finally {
  35. Binder.restoreCallingIdentity(ident);
  36. }
  37. }

4.7.3.1 [ActivityTaskManagerService] startHomeOnAllDisplays

说明:启动Home Activity

源码:

[ActivityTaskManagerService.java]

  1. public boolean startHomeOnAllDisplays(int userId, String reason) {
  2. synchronized (mGlobalLock) {
  3. //调用RootActivityContainer的startHomeOnAllDisplays(),最终到startHomeOnDisplay()
  4. return mRootActivityContainer.startHomeOnAllDisplays(userId, reason);
  5. }
  6. }

[RootActivityContainer.java]

  1. boolean startHomeOnDisplay(int userId, String reason, int displayId, boolean allowInstrumenting,
  2. boolean fromHomeKey) {
  3. // Fallback to top focused display if the displayId is invalid.
  4. if (displayId == INVALID_DISPLAY) {
  5. displayId = getTopDisplayFocusedStack().mDisplayId;
  6. }
  7. Intent homeIntent = null;
  8. ActivityInfo aInfo = null;
  9. if (displayId == DEFAULT_DISPLAY) {
  10. //home intent有CATEGORY_HOME
  11. homeIntent = mService.getHomeIntent();
  12. //根据intent中携带的ComponentName,利用PKMS得到ActivityInfo
  13. aInfo = resolveHomeActivity(userId, homeIntent);
  14. } else if (shouldPlaceSecondaryHomeOnDisplay(displayId)) {
  15. Pair<ActivityInfo, Intent> info =
  16. RootActivityContainerMifavor.resolveSecondaryHomeActivityPcMode(this, userId, displayId);
  17. aInfo = info.first;
  18. homeIntent = info.second;
  19. }
  20. if (aInfo == null || homeIntent == null) {
  21. return false;
  22. }
  23. if (!canStartHomeOnDisplay(aInfo, displayId, allowInstrumenting)) {
  24. return false;
  25. }
  26. // Updates the home component of the intent.
  27. homeIntent.setComponent(new ComponentName(aInfo.applicationInfo.packageName, aInfo.name));
  28. homeIntent.setFlags(homeIntent.getFlags() | FLAG_ACTIVITY_NEW_TASK);
  29. // Updates the extra information of the intent.
  30. if (fromHomeKey) {
  31. homeIntent.putExtra(WindowManagerPolicy.EXTRA_FROM_HOME_KEY, true);
  32. }
  33. // Update the reason for ANR debugging to verify if the user activity is the one that
  34. // actually launched.
  35. final String myReason = reason + ":" + userId + ":" + UserHandle.getUserId(
  36. aInfo.applicationInfo.uid) + ":" + displayId;
  37. //启动Home Activity--Luncher
  38. mService.getActivityStartController().startHomeActivity(homeIntent, aInfo, myReason,
  39. displayId);
  40. return true;
  41. }

5.Android10中AMS的一些变化
在Android 10 中安卓为了将来的方案更设计更加明确,对AMS做了很多修改,安卓的最终目的是把activity 和window融合,在Android 10.0上只是简单的代码路径变化,整体逻辑还是跟Android 9.0 类似

Android 10中引入了ActivityTaskManager--ATM的概念。

5.1 Android P 的冗余问题
Android 9.0 及以前版本,Acitivity 管理由AMS 和WMS 协作完成,导致在AMS 和WMS 中都有相似功能的实体,除了大量的代码冗余之外,二者之间的协作也非常困难。

5.2 Android 10的变化
  从Android 10.0 的代码变更看,google 最终的目的是把activity 和window融合,目前发布的版本虽然做了大量的代码变更,但和P 之前的版本的流程变化不大,

目前只是简单的把代码整理到一起了,还属于中间状态,按android文档介绍,完全融合在M 甚至更靠后的版本才能完成。

      目前已完成的工作:

把AMS 下面只和activity 管理相关的代码移到WMS的目录下,actvityStack、activityRecord 等文件,全部移到WMS 目录下,和window 统一管理.
AMS 中部分文件拆分,把原来activity和其他组件融合在一起处理的文件进行拆分,activity 相关部分单独拆分,移到WMS 中统一管理。比如ActivityManagerService.java 拆分成了ActivityManagerService.java 和ActivityTaskManagerService.java 两个文件,activity 的启动由ActivityTaskManagerService.java 负责:
因为Activity 和window的管理统一由WMS 完成,不再需要之前的DispayWindowController、stackWindowController 来居中协调,可以把display、stack、task 等统一管理。最终要做到完全融合,以stack 为例,完成后会把taskstack的功能完全融合进activityStack,目前只做到了在activityStack 中包含taskstack。创建、管理流程也随之发生变化。
6.总结
AMS的启动主要经历了如下几个阶段:

为SystemServer进程创建Android运行环境,例如System Context
启动AMS,做一些初始化的工作
将SystemServer进程纳入到AMS的进程管理体系中
AMS启动完成,通知服务或应用完成后续的工作,调用一些服务的systemReady()方法中,
启动Luncher,完成AMS的启动工作
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/784123
推荐阅读
相关标签
  

闽ICP备14008679号