AMS剖析(1):AMS的启动

前言:本专题是基于android9.1的源码对AMS进行深度剖析,这应该是目前全网中对AMS分析的最新最细的一篇文章;

其实AMS的主要内容可以分为两大部分,一个是AMS的数据结构,一个是AMS与AcitivtyThread的交互;

在分析这两大块之前,先来看下AMS的启动;

 第一节讲的是AMS的启动!

AMS是一个系统级服务,系统级服务的启动都是在SyetemServer进程中启动的,我们看下SyetemServer的main方法:

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

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

点评:关于SystemServer,我们后面会有章节详细分析,现在我们主要的是分析AMS的启动流程;

main方法中只调用了SystemServer的run方法,继续看:

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

private void run() {
    try {

    ......

        //准备主线程
        android.os.Process.setThreadPriority(
            android.os.Process.THREAD_PRIORITY_FOREGROUND);
        android.os.Process.setCanSelfBackground(false);

        //主线程的Looper
        Looper.prepareMainLooper();
        Looper.getMainLooper().setSlowLogThresholdMs(
            SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);

        //加载了动态库libandroid_servers.so
        System.loadLibrary("android_servers");

        //创建SystemServiceManager,它会对系统的服务进行创建、启动和生命周期管理
        mSystemServiceManager = new SystemServiceManager(mSystemContext);
        mSystemServiceManager.setStartInfo(mRuntimeRestart,mRuntimeStartElapsedTime, mRuntimeStartUptime);
        LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);

        // Prepare the thread pool for init tasks that can be parallelized
        SystemServerInitThreadPool.get();
    } finally {
        traceEnd(); // InitBeforeStartServices
    }

    // Start services.
    try {
        traceBeginAndSlog("StartServices");
        //启动引导服务
        //用SystemServiceManager启动了ActivityManagerService、PowerManagerService、 PackageManagerService等服务
        startBootstrapServices();
        /// M: For mtk systemserver
        sMtkSystemServerIns.startMtkBootstrapServices();

        
        //核心服务
        //启动BatteryService、UsageStatsService和WebViewUpdateService
        startCoreServices();
        /// M: for mtk other service.
        sMtkSystemServerIns.startMtkCoreServices();

        
        //启动核心服务
        //启动了WMS,CameraService、AlarmManagerService、VrManagerService等服务
        startOtherServices();

        SystemServerInitThreadPool.shutdown();
    } catch (Throwable ex) {
        throw ex;
    } finally {
        traceEnd();
    }
}

点评:官方把系统服务分为了三种类型,分别是引导服务、核心服务和其他服务,其中其他服务是一些非紧要和一些不需要立即启动的服务。系统服务总共大约有80多个,我们主要来查看引导服务AMS是如何启动的,也就是startBootstrapServices()方法:

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

private void startBootstrapServices() {
    //Activity manager runs the show.
    traceBeginAndSlog("StartActivityManager");

    mActivityManagerService = mSystemServiceManager.startService(
    ActivityManagerService.Lifecycle.class).getService();
    mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
    mActivityManagerService.setInstaller(installer);

    traceEnd();
}

调用了SystemServiceManager的startService()方法,方法的参数是ActivityManagerService.Lifecycle.class,继续:

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

public <T extends SystemService> T startService(Class<T> serviceClass) {
    try {
        final T service;
        try {
            //serviceClass是Lifecycle.class,得到传进来的Lifecycle的构造器constructor
            Constructor<T> constructor = serviceClass.getConstructor(Context.class);

            //通过反射,调用constructor的newInstance方法来创建Lifecycle类型的service对象
            service = constructor.newInstance(mContext);
        } catch (InstantiationException ex) {
            ............
        }

        //调用startService()
        startService(service);

        //返回该service
        return service;
    } finally {
        Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
    }
}


public void startService(@NonNull final SystemService service) {
    //将刚创建的service添加到ArrayList类型的mServices对象中来完成注册
    mServices.add(service);
    // Start it.
    long time = SystemClock.elapsedRealtime();
    try {
        //并调用service的onStart方法来启动service
        service.onStart();
    } catch (RuntimeException ex) {
    }
}

点评:Lifecycle是AMS的内部类,代码如下:

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

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

    public Lifecycle(Context context) {
        super(context);
        //创建ActivityManagerService实例
        mService = new ActivityManagerService(context);
    }

    @Override
    public void onStart() {
        //调用AMS的start()方法
        mService.start();
    }

    @Override
    public void onBootPhase(int phase) {
        mService.mBootPhase = phase;
        if (phase == PHASE_SYSTEM_SERVICES_READY) {
            mService.mBatteryStatsService.systemServicesReady();
            mService.mServices.systemServicesReady();
        }
    }

    @Override
    public void onCleanupUser(int userId) {
        mService.mBatteryStatsService.onCleanupUser(userId);
    }

    public ActivityManagerService getService() {
        //返回AMS
        return mService;
    }
}

点评:通过上面的代码我们得知,当通过反射来创建Lifecycle实例时,会创建AMS实例,当调用Lifecycle类型的service的onStart方法时,实际上是调用了AMS的start()方法。

我们现在可以总结下AMS的启动流程了:

mActivityManagerService = mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService();

我们知道SystemServiceManager的startService方法最终会返回Lifecycle类型的对象,紧接着又调用了Lifecycle的getService方法,这个方法会返回AMS类型的mService对象,这样AMS实例就会被创建并且返回。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

renshuguo123723

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

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

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

打赏作者

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

抵扣说明:

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

余额充值