ActivityManagerService第五讲之ActivityManagerService的启动过程

一.AMS的启动

如果熟悉android系统启动流程的话,我们知道Zygote启动的时候会在ZygoteInit中fork一个名为system_server的过程。而SystemServer进程启动过程中会启动各种系统服务,系统服务中包含引导服务,而ActivityManagerService就是在这个时候被启动的。

二.AMS启动流程

我们从SystemServer的run()方法为开始。

1.SystemServer#run

    private void run() {
        ......
        //加载libandroid_servers.so
         System.loadLibrary("android_servers");
        //创建SystemServiceManager
         mSystemServiceManager = new SystemServiceManager(mSystemContext);
        // Start services.
        try {
            traceBeginAndSlog("StartServices");
            //启动引导服务
            startBootstrapServices();
            //启动核心服务
            startCoreServices();
            //启动其他服务
            startOtherServices();
            SystemServerInitThreadPool.shutdown();
        } catch (Throwable ex) {
            Slog.e("System", "******************************************");
            Slog.e("System", "************ Failure starting system services", ex);
            throw ex;
        } finally {
            traceEnd();
        }
        ......

        // Loop forever.
        Looper.loop();
        throw new RuntimeException("Main thread loop unexpectedly exited");
    }

2.SystemServer#startBootstrapServices

        // Activity manager runs the show.
        traceBeginAndSlog("StartActivityManager");
        // TODO: Might need to move after migration to WM.
        ActivityTaskManagerService atm = mSystemServiceManager.startService(
                ActivityTaskManagerService.Lifecycle.class).getService();
        mActivityManagerService = ActivityManagerService.Lifecycle.startService(
                mSystemServiceManager, atm);
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);
        mWindowManagerGlobalLock = atm.getGlobalLock();
        traceEnd();

A.ActivityTaskManagerService会调用SystemServiceManager的startService()方法。

传入的参数是ActivityTaskManagerService.Lifecycle.class,这是一个SystemService类型的参数,所以在SystemServiceManager中的startService()方法如下:

    public void startService(@NonNull final SystemService service) {
        // Register it.
        mServices.add(service);
        // Start it.
        long time = SystemClock.elapsedRealtime();
        try {
            service.onStart();
        } catch (RuntimeException ex) {
            throw new RuntimeException("Failed to start service " + service.getClass().getName()
                    + ": onStart threw an exception", ex);
        }
        warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart");
    }

调用传参的onStart()方法,也就是ActivityTaskManagerService.Lifecycle的onStart()方法:

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

        public Lifecycle(Context context) {
            super(context);
            mService = new ActivityTaskManagerService(context);
        }

        @Override
        public void onStart() {
            publishBinderService(Context.ACTIVITY_TASK_SERVICE, mService);
            mService.start();
        }

        public ActivityTaskManagerService getService() {
            return mService;
        }
        ......
    }

可以看到这时候就会调用ActivityTaskManagerService的start()方法,而在SystemServer中,会调用getService()方法获得ActivityTaskManagerService实例。

B.ActivityManagerService则会调用自身内部类Lifecycle的startService)方法。

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

        public Lifecycle(Context context) {
            super(context);
            mService = new ActivityManagerService(context, sAtm);
        }

        public static ActivityManagerService startService(
                SystemServiceManager ssm, ActivityTaskManagerService atm) {
            sAtm = atm;
            return ssm.startService(ActivityManagerService.Lifecycle.class).getService();
        }

        @Override
        public void onStart() {
            mService.start();
        }

        ......

        public ActivityManagerService getService() {
            return mService;
        }
    }

这里看startService的实现,是不是和ActivityTaskManagerService实例获取一模一样的方式:ssm.startService(ActivityManagerService.Lifecycle.class).getService()。

3.ActivityManagerService.Lifecycle#startService

        public static ActivityManagerService startService(
                SystemServiceManager ssm, ActivityTaskManagerService atm) {
            sAtm = atm;
            return ssm.startService(ActivityManagerService.Lifecycle.class).getService();
        }

4.SystemServiceManager#startService

    public void startService(@NonNull final SystemService service) {
        // Register it.
        mServices.add(service);
        // Start it.
        long time = SystemClock.elapsedRealtime();
        try {
            service.onStart();
        } catch (RuntimeException ex) {
            throw new RuntimeException("Failed to start service " + service.getClass().getName()
                    + ": onStart threw an exception", ex);
        }
        warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart");
    }

5.ActivityManagerService.Lifecycle#onStart

        @Override
        public void onStart() {
            mService.start();
        }

6.ActivityManagerService#start

private void start() {
    removeAllProcessGroups();
    mProcessCpuThread.start();

    mBatteryStatsService.publish();
    mAppOpsService.publish(mContext);
    Slog.d("AppOps", "AppOpsService published");
    LocalServices.addService(ActivityManagerInternal.class, new LocalService());
    mActivityTaskManager.onActivityManagerInternalAdded();
    mUgmInternal.onActivityManagerInternalAdded();
    mPendingIntentController.onActivityManagerInternalAdded();
    // Wait for the synchronized block started in mProcessCpuThread,
    // so that any other access to mProcessCpuTracker from main thread
    // will be blocked during mProcessCpuTracker initialization.
    try {
        mProcessCpuInitLatch.await();
    } catch (InterruptedException e) {
        Slog.wtf(TAG, "Interrupted wait during start", e);
        Thread.currentThread().interrupt();
        throw new IllegalStateException("Interrupted wait during start");
    }
}

7.ActivityManagerService.Lifecycle#getService

        public ActivityManagerService getService() {
            return mService;
        }

三.AMS启动总结

AMS启动过程还是比较简单的,而在Android 10的时候,AMS中会新增一个Service也就是ActivityTaskManagerService。这个在之后AMS的学习中是会经常碰到的。

ActivityManagerService第五讲之ActivityManagerService的启动过程_第1张图片

你可能感兴趣的:(Android,Frameworks)