ActivityManagerService(AMS)--学习笔记

和你一起终身学习,这里是程序员 Android

本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:

一、AMS 是如何启动的?
二、通过 Lifecycle 启动初始化 AMS 系统服务
三、AMS 构造函数实例实现
四、启动AMS.Start()方法实现
五、AMS设置系统进程实现
六、AMS 安装系统 Provider实现
七、AMS.systemReady准备完成
八、AMS 启动 Launcher实现

一、AMS 是如何启动的?

AMS(ActivityManagerService 简称)是通过SystemServer.java (frameworks\base\services\java\com\android\server\SystemServer.java)类中的 startBootstrapServices() 方法启动的。

1. startBootstrapServices主要作用

startBootstrapServices 主要是启动以下引导服务,引导系统Service 起来。
部分通过系统服务如下:

  1. Installer安装服务、
  2. Activity管理服务AMS、
  3. 电源管理服务PowerManagerService、
  4. Recovery管理服务RecoverySystemService、
  5. LED 背光显示服务LightsService、
  6. 显示管理服务DisplayManagerService、
  7. app 包管理服务PackageManagerService等。

2.AMS启动流程

AMS启动大致流程如下:

  1. SystemServer.main
  2. SystemServer.SystemServer()
  3. SystemServer.run()
  4. SystemServer.startBootstrapServices()

AMS启动详细流程如下:


public final class SystemServer {
... ...

    /**
     * The main entry point from zygote.
     */
    public static void main(String[] args) {
        new SystemServer().run();
    }

    public SystemServer() {
        ... ...
        mRuntimeRestart = "1".equals(SystemProperties.get("sys.boot_completed"));
        ... ...
    }

    private void run() {
        ... ...
            //启动系统服务
        try {
            traceBeginAndSlog("StartServices");
           // 系统引导服务启动,比如:AMS 启动
            startBootstrapServices();
            startCoreServices();
            startOtherServices();
			resetSerial();
            SystemServerInitThreadPool.shutdown();
        } catch (Throwable ex) {
            Slog.e("System", "******************************************");
            Slog.e("System", "************ Failure starting system services", ex);
            throw ex;
        } finally {
            traceEnd();
        }
        ... ...
        // Set up the Application instance for the system process and get started.
        traceBeginAndSlog("SetSystemProcess");
        //设置系统进程 详见 五
        mActivityManagerService.setSystemProcess();
        traceEnd();
        ... ...

    }

   //系统引导服务启动的方法
   private void startBootstrapServices() {
     
       ... ...
        // Activity manager runs the show.
        traceBeginAndSlog("StartActivityManager");
        //  通过 Lifecycle 启动 AMS 系统服务流程,详见 二
        mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);
        traceEnd();
       ... ...
     }
    private void startOtherServices() {
        ... ...
		// 调用AMS 的 安装系统Provider installSystemProviders 方法,详见步骤 六
		traceBeginAndSlog("InstallSystemProviders");
		mActivityManagerService.installSystemProviders();
		// Now that SettingsProvider is ready, reactivate SQLiteCompatibilityWalFlags
		SQLiteCompatibilityWalFlags.reset();
		traceEnd();
		... ...
             // 系统准备完毕,可以让第三代码调用 详见 步骤七
        mActivityManagerService.systemReady(() -> {
            Slog.i(TAG, "Making services ready");
            traceBeginAndSlog("StartActivityManagerReadyPhase");
			// ActivityManager 准备完毕
            mSystemServiceManager.startBootPhase(
                    SystemService.PHASE_ACTIVITY_MANAGER_READY);
            traceEnd();
            ... ...
            }, BOOT_TIMINGS_TRACE_LOG);
    }
... ...
}

二、 通过 Lifecycle 启动初始化 AMS 系统服务

1. 静态全局 Lifecycle 类

在 AMS 中,我们看到静态全局的 final Lifecycle 类对外提供 getService()方法,方便供 SystemServer类调用。
调用方法如下:

        //  通过 Lifecycle 启动 AMS 系统服务流程,详见 二
        mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();

2. AMS 继承实现关系

AMS 的继承关系如下:

public class ActivityManagerService extends IActivityManager.Stub
        implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
... ...
}

AMS 继承实现关系图如下:

AMS 继承实现关系图

从上图我们可以看出
1.AMS 继承IActivityManager.Stub
2.AMS 实现Watchdog.MonitorBatteryStatsImpl.BatteryCallback接口。

3.通过 Lifecycle 启动初始化 AMS 系统服务实现

AMS 是通过Lifecycle启动 AMS 并实现初始化。

具体实现代码如下:

public class ActivityManagerService extends IActivityManager.Stub
        implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
 ... ...
 public static final class Lifecycle extends SystemService {
        private final ActivityManagerService mService;

        public Lifecycle(Context context) {
            super(context);
           //  new ActivityManagerService 实例 见分析三
            mService = new ActivityManagerService(context);
        }

        @Override
        public void onStart() {
           //  启动AMS ,见分析四 
            mService.start();
        }
       ... ... 
        public ActivityManagerService getService() {
            return mService;
        }
    }
... ...
}

三、AMS 构造函数实例实现

通过 mService = new ActivityManagerService(context);,调用 AMS 构造函数,并运行在主线程中(main Thread),需要注意的是,AMS 中有多个Handler,请在loop 的时候注意,不要使用错了。

1. AMS 构造函数主要实现的功能

  1. 创建 ActivityManagerandroid.uiActivityManager:procStartActivityManager:kill服务线程。
  2. 设置前台广播、后台广播的超时时间。
  3. 设置后台Service 最大个数(8个,低 RAM 1个)
  4. 初始化 系统 Provider,以及AppErrors、AppWarnings。
  5. 创建/data/system目录,并保存procstats、appops.xml等文件。
  6. 创建 Intent 防火墙IntentFirewall,以及Activity 带来对象ActivityStartController
  7. 创建CpuTracker线程 ,收集ANRS,电池电量信息,更新CPU 状态等。
  8. 获取 Watchdog 实例,并将AMS 添加到看门狗Monitor中,以及将mHandler 添加到看门狗 线程中。
  9. 更新 oom_adj 状态。

2. AMS 构造函数实现方法

AMS 构造函数实现如下:

    public ActivityManagerService(Context systemContext) {
        ... ...

	    //创建名为"ActivityManager"的前台线程,并获取mHandler
	    // TAG 线程名,请看ActivityManagerDebugConfig,
	    //默认 TAG_AM   即为 ActivityManager
        mHandlerThread = new ServiceThread(TAG,
                THREAD_PRIORITY_FOREGROUND, false /*allow
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员Android

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

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

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

打赏作者

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

抵扣说明:

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

余额充值