Android 系统服务 - AMS 的启动过程

作者: 你也不知道 | 来源:发表于2020-05-10 17:46 被阅读0次

相关文章链接:

1. Android Framework - 学习启动篇

2. Android Framework - 开机启动 SystemServer 进程

相关源码文件:


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

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

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

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

ActivityManagerService 是 Android 中非常重要的一个服务,主要功能是管理和启动四大组件。其源代码大约有 2W 多行,这里我们主要来分析其启动过程,后面的文章我们肯定还会分析具体的源码细节。AMS 是由 SystemServer 进程启动的,对于这个有不了解的同学请看这里《Android Framework - 开机启动 SystemServer 进程》


    private void startBootstrapServices() {

      ...

      // 启动 AMS 服务

      mActivityManagerService = mSystemServiceManager.startService(

            ActivityManagerService.Lifecycle.class).getService();

      // 设置 AMS 的系统服务管理器

      mActivityManagerService.setSystemServiceManager(mSystemServiceManager);

      // 设置 AMS 的 APP 安装器

      mActivityManagerService.setInstaller(installer);

      ...

      // 设置 SystemServer

      mActivityManagerService.setSystemProcess();

    }

    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() {

            // 调用 start 方法

            mService.start();

        }

        // 获取 ActivityManagerService

        public ActivityManagerService getService() {

            return mService;

        }

    }

    // Note: This method is invoked on the main thread but may need to attach various

    // handlers to other threads.  So take care to be explicit about the looper.

    public ActivityManagerService(Context systemContext) {

        mContext = systemContext;

        // 获取 ActivityThread

        mSystemThread = ActivityThread.currentActivityThread();

        // 创建名为"ActivityManager"的前台 HandlerThread

        mHandlerThread = new ServiceThread(TAG,

                android.os.Process.THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);

        // 启动 ServiceThread

        mHandlerThread.start();

        // 创建一个 MainHandler 与 mHandlerThread 公用一个 looper

        mHandler = new MainHandler(mHandlerThread.getLooper());

        // 创建 UiHandler 其内部也会创建一个 HandlerThread

        mUiHandler = new UiHandler();

        // 前台和后台广播接收队列,分别是 10s 和 60s 放弃执行

        mFgBroadcastQueue = new BroadcastQueue(this, mHandler,

                "foreground", BROADCAST_FG_TIMEOUT, false);

        mBgBroadcastQueue = new BroadcastQueue(this, mHandler,

                "background", BROADCAST_BG_TIMEOUT, true);

        mBroadcastQueues[0] = mFgBroadcastQueue;

        mBroadcastQueues[1] = mBgBroadcastQueue;

        // 创建目录/data/system

        File dataDir = Environment.getDataDirectory();

        File systemDir = new File(dataDir, "system");

        systemDir.mkdirs();

        // 创建 BatteryStatsService,相当于电表

        mBatteryStatsService = new BatteryStatsService(systemDir, mHandler);

        mBatteryStatsService.getActiveStatistics().readLocked();

        mBatteryStatsService.scheduleWriteToDisk();

        mBatteryStatsService.getActiveStatistics().setCallback(this);

        // 创建进程统计服务,信息保存在目录 /data/system/procstats,

        mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats"));

        ...

        // 创建 ActivityStackSupervisor 对象

        mStackSupervisor = new ActivityStackSupervisor(this, mRecentTasks);

        mTaskPersister = new TaskPersister(systemDir, mStackSupervisor, mRecentTasks);

        // 创建名为 "CpuTracker" 的线程

        mProcessCpuThread = new Thread("CpuTracker") {

            @Override

            public void run() {

                while (true) {

                    try {

                        ...

                        updateCpuStatsNow();

                    } catch (Exception e) {

                        Slog.e(TAG, "Unexpected exception collecting process stats", e);

                    }

                }

            }

        };

        // 看门狗

        Watchdog.getInstance().addMonitor(this);

        Watchdog.getInstance().addThread(mHandler);

    }

在 SystemService 进程的启动过程中会调用 startBootstrapServices 方法,其内部会启动 AMS 服务,在 ActivityManagerService 的构造函数中会创建三个线程分别是 ActivityManager 、UI 和 CpuTracker。我们接着看 start 方法:


    private void start() {

        // 移除所有的进程组

        Process.removeAllProcessGroups();

        // 启动 CpuTracker 线程

        mProcessCpuThread.start();

        // 把电表服务注册添加到 ServiceManager

        mBatteryStatsService.publish(mContext);

        mAppOpsService.publish(mContext);

        Slog.d("AppOps", "AppOpsService published");

        LocalServices.addService(ActivityManagerInternal.class, new LocalService());

    }

    public void setSystemProcess() {

        try {

            // 把自己加到 ServiceManager ,然后注册额外的一些服务

            ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);

            ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);

            ServiceManager.addService("meminfo", new MemBinder(this));

            ServiceManager.addService("gfxinfo", new GraphicsBinder(this));

            ServiceManager.addService("dbinfo", new DbBinder(this));

            if (MONITOR_CPU_USAGE) {

                ServiceManager.addService("cpuinfo", new CpuBinder(this));

            }

            ServiceManager.addService("permission", new PermissionController(this));

            ServiceManager.addService("processinfo", new ProcessInfoService(this));

            // 通过 pms 获取 ApplicationInfo 信息

            ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(

                    "android", STOCK_PM_FLAGS);

            // 初始化 ApplicationInfo 和 ClassLoader

            mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());

            synchronized (this) {

                // 创建 ProcessRecord 对象

                ProcessRecord app = newProcessRecordLocked(info, info.processName, false, 0);

                app.persistent = true;

                app.pid = MY_PID;

                app.maxAdj = ProcessList.SYSTEM_ADJ;

                app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);

                synchronized (mPidsSelfLocked) {

                    mPidsSelfLocked.put(app.pid, app);

                }

                updateLruProcessLocked(app, false, null);

                updateOomAdjLocked();

            }

        } catch (PackageManager.NameNotFoundException e) {

            throw new RuntimeException(

                    "Unable to find android system package", e);

        }

    }

    private void startOtherServices() {

      ...

      // 安装系统 Provider

      mActivityManagerService.installSystemProviders();

      ...

      mActivityManagerService.systemReady(new Runnable() {

      public void run() {

            // 启动 WebView

            WebViewFactory.prepareWebViewInSystemServer();

            // 启动 SystemUi

            startSystemUi(context);

            // 调用一系列服务的 systemReady 方法

            ...

            // 调用一系列服务的 systemRunning 方法

            ...

        }

      }

    }

    public void systemReady(final Runnable goingCallback) {

        ...

        // 执行 Callback 的 run 方法

        if (goingCallback != null) goingCallback.run();

        // Start up initial activity.

        mBooting = true;

        // 启动桌面 Activity 进程

        startHomeActivityLocked(mCurrentUserId, "systemReady");

    }

    static final void startSystemUi(Context context) {

        Intent intent = new Intent();

        intent.setComponent(new ComponentName("com.android.systemui",

                    "com.android.systemui.SystemUIService"));

        //Slog.d(TAG, "Starting service: " + intent);

        context.startServiceAsUser(intent, UserHandle.OWNER);

    }

关于 AMS 的启动流程还是很简单的,调用构造函数会初始化三个线程;调用 setSystemProcess 方法中会向 ServcieManager 进程额外发布一些服务:procstats(进程信息)、meminfo(内存信息)、gfxinfo(图形信息)、cpuinfo(cpu信息)、permission(权限)、processinfo(应用使用情况)等;调用 systemReady 方法首先会启动 SystemUIService,然后执行一系列服务的 systemReady 和 systemRunning 方法,最后启动桌面 Activity 进程。

视频地址:https://pan.baidu.com/s/1dM3K9bPRuepFUJIASIDeQg

视频密码:af97

相关文章

网友评论

    本文标题:Android 系统服务 - AMS 的启动过程

    本文链接:https://www.haomeiwen.com/subject/qpojnhtx.html