AMS启动过程分析

AMS启动过程分析

首先ams是在system_server进程

system_server具体实现是

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

AMS启动流程图分析

1.SystemServer#main()方法

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

private void run() {
    Looper.prepareMainLooper();//创建主线程Looper

    //创建系统context(new ContextImpl)和加载系统资源
    createSystemContext();

    mSystemServiceManager = new SystemServiceManager(mSystemContext);//创建SystemServiceManger对象用来管理所有的service

    // Start services.
    startBootstrapServices();//启动引导服务
    startCoreServices();//启动核心服务
    startOtherServices();//启动其它服务

    // Loop forever.
    Looper.loop();//loop循环
}

2. SystemServer#startBootstrapServices()方法

    private void startBootstrapServices() {

        //...

        // Activity manager runs the show.
        // TODO: Might need to move after migration to WM.
        ActivityTaskManagerService atm = mSystemServiceManager.startService(
                ActivityTaskManagerService.Lifecycle.class).getService();
        mActivityManagerService = ActivityManagerService.Lifecycle.startService(
                mSystemServiceManager, atm);//启动AMS
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);

        //...

        mActivityManagerService.setSystemProcess();//将AMS注册到ServiceManager中

        //...
    }
    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);//创建AMS实例
        }

        public static ActivityManagerService startService(
                SystemServiceManager ssm, ActivityTaskManagerService atm) {
            sAtm = atm;
            return ssm.startService(ActivityManagerService.Lifecycle.class).getService();//通过LifeCycle的getService返回AMS对象
        }

        @Override
        public void onStart() {
            mService.start();//启动AMS
        }

        //...

        public ActivityManagerService getService() {
            return mService;
        }
    }

3. SystemServiceManager#startService()方法

    public <T extends SystemService> T startService(Class<T> serviceClass) {
        try {
            final String name = serviceClass.getName();

            //...

            //通过反射创建AMS对象,会调到上面ActivityManagerService.Lifecycle构造方法
            final T service;
            Constructor<T> constructor = serviceClass.getConstructor(Context.class);
            service = constructor.newInstance(mContext);

            //...

            startService(service);
            return service;
    }

    // Services that should receive lifecycle events.
    private final ArrayList<SystemService> mServices = new ArrayList<SystemService>();

    public void startService(@NonNull final SystemService service) {
        // Register it.
        mServices.add(service);//注册到SystemServiceManager

        service.onStart();////启动服务
    }

4. ActivityManagerService#ActivityManagerService()构造函数

// 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, ActivityTaskManagerService atm) {

    mInjector = new Injector();
    mContext = systemContext;//获取系统上下文环境


    mSystemThread = ActivityThread.currentActivityThread();//获取当前ActivityThread线程
    mUiContext = mSystemThread.getSystemUiContext();//赋值mUiContext

    mHandlerThread = new ServiceThread(TAG,
            THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);//创建Handler线程,用来处理handler消息
    mHandlerThread.start();
    mHandler = new MainHandler(mHandlerThread.getLooper());
    mUiHandler = mInjector.getUiHandler(this);//处理ui相关msg的Handler

    mProcStartHandlerThread = new ServiceThread(TAG + ":procStart",
            THREAD_PRIORITY_FOREGROUND, false /* allowIo */);
    mProcStartHandlerThread.start();
    mProcStartHandler = new Handler(mProcStartHandlerThread.getLooper());

    mConstants = new ActivityManagerConstants(mContext, this, mHandler);
    final ActiveUids activeUids = new ActiveUids(this, true /* postChangesToAtm */);
    mProcessList.init(this, activeUids);
    mLowMemDetector = new LowMemDetector(this);
    mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids);

    // Broadcast policy parameters
    final BroadcastConstants foreConstants = new BroadcastConstants(
            Settings.Global.BROADCAST_FG_CONSTANTS);//初始化前台广播的队列,设置10s超时
    foreConstants.TIMEOUT = BROADCAST_FG_TIMEOUT;

    final BroadcastConstants backConstants = new BroadcastConstants(
            Settings.Global.BROADCAST_BG_CONSTANTS);//初始化后台广播的队列,设置60s超时
    backConstants.TIMEOUT = BROADCAST_BG_TIMEOUT;

    final BroadcastConstants offloadConstants = new BroadcastConstants(
            Settings.Global.BROADCAST_OFFLOAD_CONSTANTS);//初始化离线广播的队列,设置60s超时
    offloadConstants.TIMEOUT = BROADCAST_BG_TIMEOUT;
    // by default, no "slow" policy in this queue
    offloadConstants.SLOW_TIME = Integer.MAX_VALUE;

    mEnableOffloadQueue = SystemProperties.getBoolean(
            "persist.device_config.activity_manager_native_boot.offload_queue_enabled", false);

    mFgBroadcastQueue = new BroadcastQueue(this, mHandler,
            "foreground", foreConstants, false);
    mBgBroadcastQueue = new BroadcastQueue(this, mHandler,
            "background", backConstants, true);
    mOffloadBroadcastQueue = new BroadcastQueue(this, mHandler,
            "offload", offloadConstants, true);
    mBroadcastQueues[0] = mFgBroadcastQueue;
    mBroadcastQueues[1] = mBgBroadcastQueue;
    mBroadcastQueues[2] = mOffloadBroadcastQueue;

    mServices = new ActiveServices(this);//初始化管理Service的ActiveServices对象
    mProviderMap = new ProviderMap(this);
    mPackageWatchdog = PackageWatchdog.getInstance(mUiContext);
    mAppErrors = new AppErrors(mUiContext, this, mPackageWatchdog);

    final File systemDir = SystemServiceManager.ensureSystemDir();

    // TODO: Move creation of battery stats service outside of activity manager service.
    mBatteryStatsService = new BatteryStatsService(systemContext, systemDir,
            BackgroundThread.get().getHandler());//创建电池状态服务
    mBatteryStatsService.getActiveStatistics().readLocked();
    mBatteryStatsService.scheduleWriteToDisk();
    mOnBattery = DEBUG_POWER ? true
            : mBatteryStatsService.getActiveStatistics().getIsOnBattery();
    mBatteryStatsService.getActiveStatistics().setCallback(this);
    mOomAdjProfiler.batteryPowerChanged(mOnBattery);

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

    mAppOpsService = mInjector.getAppOpsService(new File(systemDir, "appops.xml"), mHandler);

    mUgmInternal = LocalServices.getService(UriGrantsManagerInternal.class);

    mUserController = new UserController(this);

    mPendingIntentController = new PendingIntentController(
            mHandlerThread.getLooper(), mUserController);

    if (SystemProperties.getInt("sys.use_fifo_ui", 0) != 0) {
        mUseFifoUiScheduling = true;
    }

    mTrackingAssociations = "1".equals(SystemProperties.get("debug.track-associations"));
    mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler);

    mActivityTaskManager = atm;
    mActivityTaskManager.initialize(mIntentFirewall, mPendingIntentController,
            DisplayThread.get().getLooper());
    mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class);

    mProcessCpuThread = new Thread("CpuTracker") {//启动一个线程跟进CPU当前状态信息
        @Override
        public void run() {
            synchronized (mProcessCpuTracker) {
                mProcessCpuInitLatch.countDown();
                mProcessCpuTracker.init();
            }
            while (true) {
                try {
                    try {
                        synchronized(this) {
                            final long now = SystemClock.uptimeMillis();
                            long nextCpuDelay = (mLastCpuTime.get()+MONITOR_CPU_MAX_TIME)-now;
                            long nextWriteDelay = (mLastWriteTime+BATTERY_STATS_TIME)-now;
                            //Slog.i(TAG, "Cpu delay=" + nextCpuDelay
                            //        + ", write delay=" + nextWriteDelay);
                            if (nextWriteDelay < nextCpuDelay) {
                                nextCpuDelay = nextWriteDelay;
                            }
                            if (nextCpuDelay > 0) {
                                mProcessCpuMutexFree.set(true);
                                this.wait(nextCpuDelay);
                            }
                        }
                    } catch (InterruptedException e) {
                    }
                    updateCpuStatsNow();
                } catch (Exception e) {
                    Slog.e(TAG, "Unexpected exception collecting process stats", e);
                }
            }
        }
    };

    mHiddenApiBlacklist = new HiddenApiSettings(mHandler, mContext);

    Watchdog.getInstance().addMonitor(this);//看门狗,监听进程
    Watchdog.getInstance().addThread(mHandler);

    // bind background threads to little cores
    // this is expected to fail inside of framework tests because apps can't touch cpusets directly
    // make sure we've already adjusted system_server's internal view of itself first
    updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE);
    try {
        Process.setThreadGroupAndCpuset(BackgroundThread.get().getThreadId(),
                Process.THREAD_GROUP_SYSTEM);
        Process.setThreadGroupAndCpuset(
                mOomAdjuster.mAppCompact.mCompactionThread.getThreadId(),
                Process.THREAD_GROUP_SYSTEM);
    } catch (Exception e) {
        Slog.w(TAG, "Setting background thread cpuset failed");
    }

}

5. ActivityManagerService#start()方法

    private void start() {
        removeAllProcessGroups();//移除所有的进程组
        mProcessCpuThread.start();//启动Cpu进程

        mBatteryStatsService.publish();//启动电池状态服务
        mAppOpsService.publish(mContext);

        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();//等待mProcessCpuThread完成初始化后,释放锁
        } catch (InterruptedException e) {
            Slog.wtf(TAG, "Interrupted wait during start", e);
            Thread.currentThread().interrupt();
            throw new IllegalStateException("Interrupted wait during start");
        }
    }

6. ActivityManagerService#setSystemProcess()方法

    public void setSystemProcess() {
        try {
            ServiceManager.addService(Context.ACTIVITY_SERVICE, this, /* allowIsolated= */ true,
                    DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO);//将AMS注册到ServiceManager中
            ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);//注册进程状态服务
            ServiceManager.addService("meminfo", new MemBinder(this), /* allowIsolated= */ false,
                    DUMP_FLAG_PRIORITY_HIGH);//注册内存Binder
            ServiceManager.addService("gfxinfo", new GraphicsBinder(this));//注册图像信息Binder
            ServiceManager.addService("dbinfo", new DbBinder(this));//注册数据库Binder
            if (MONITOR_CPU_USAGE) {
                ServiceManager.addService("cpuinfo", new CpuBinder(this),
                        /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);//注册监控CPU使用状态Binder
            }
            ServiceManager.addService("permission", new PermissionController(this));//注册权限控制Binder
            ServiceManager.addService("processinfo", new ProcessInfoService(this));//注册进程服务Binder

            ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(
                    "android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);//查询并处理ApplicationInfo
            mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());//将Application信息配置到ActivityThread中

            synchronized (this) {
                //创建并处理ProcessRecord
                ProcessRecord app = mProcessList.newProcessRecordLocked(info, info.processName,
                        false,
                        0,
                        new HostingRecord("system"));
                app.setPersistent(true);
                app.pid = MY_PID;
                app.getWindowProcessController().setPid(MY_PID);
                app.maxAdj = ProcessList.SYSTEM_ADJ;
                app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);
                mPidsSelfLocked.put(app);
                mProcessList.updateLruProcessLocked(app, false, null);
                updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE);
            }
        } catch (PackageManager.NameNotFoundException e) {
            throw new RuntimeException(
                    "Unable to find android system package", e);
        }

        // Start watching app ops after we and the package manager are up and running.
        mAppOpsService.startWatchingMode(AppOpsManager.OP_RUN_IN_BACKGROUND, null,
                new IAppOpsCallback.Stub() {
                    @Override public void opChanged(int op, int uid, String packageName) {
                        if (op == AppOpsManager.OP_RUN_IN_BACKGROUND && packageName != null) {
                            if (mAppOpsService.checkOperation(op, uid, packageName)
                                    != AppOpsManager.MODE_ALLOWED) {
                                runInBackgroundDisabled(uid);
                            }
                        }
                    }
                });
    }

7. SystemServer#startOtherServices()方法

   private void startOtherServices() {

      //...

      //安装ContentProvider
      mActivityManagerService.installSystemProviders();

      //...

      //AMS与WMS关联
      mActivityManagerService.setWindowManager(wm);

      //...

      //所有的服务已经准备就绪
      mActivityManagerService.systemReady(() -> {
      //启动系统UI
      startSystemUi(context, windowManagerF);

      //...

      //执行一系列服务的systemReady
      networkStatsF.systemReady();

      //...

  }

8. ActivityManagerService#installSystemProviders()方法

    public final void installSystemProviders() {
        List<ProviderInfo> providers;
        synchronized (this) {
            ProcessRecord app = mProcessList.mProcessNames.get("system", SYSTEM_UID);//找到名为"system"的进程,就是setSystemProcess中创建的ProcessRecord对象
            providers = generateApplicationProvidersLocked(app);
            if (providers != null) {
                for (int i=providers.size()-1; i>=0; i--) {
                    ProviderInfo pi = (ProviderInfo)providers.get(i);
                    if ((pi.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
                        Slog.w(TAG, "Not installing system proc provider " + pi.name
                                + ": not system .apk");
                        providers.remove(i);//移除非系统provider
                    }
                }
            }
        }
        if (providers != null) {
            mSystemThread.installSystemProviders(providers);//安装所有的系统provider
        }

        synchronized (this) {
            mSystemProvidersInstalled = true;
        }
        mConstants.start(mContext.getContentResolver());
        mCoreSettingsObserver = new CoreSettingsObserver(this);//创建核心Settings Observer,用于监听Settings的改变
        mActivityTaskManager.installSystemProviders();
        mDevelopmentSettingsObserver = new DevelopmentSettingsObserver();//开发者权限
        SettingsToPropertiesMapper.start(mContext.getContentResolver());
        mOomAdjuster.initSettings();

        // Now that the settings provider is published we can consider sending
        // in a rescue party.
        RescueParty.onSettingsProviderPublished(mContext);

        //mUsageStatsService.monitorPackages();
    }

9. ActivityManagerService#systemReady()方法

    public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) {
        //...
        mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");//启动Launcher界面
        //...
    }

总结:

第一: system_server进程具体实现是SystemServer.java

main()方法首先创建SystemServer对象并调用其run()方法

第二: SystemServer将系统服务分成了

服务 类型
BootstrapServices 引导服务
CoreServices 核心服务
OtherServices 其他服务

其中AMS属于引导服务

这些服务在run()方法中启动

第三:通过 SystemServiceManager 管理所有服务
具体怎么管理AMS的,这里设计非常巧妙。

首先,创建一个抽象类,SystemServer

然后在ActivityMangerService中通过内部类LifeCycle实现SystemService抽象类

其次是SystemServiceManager通过反射创建LifeCycle对象,怎么创建呢,LifeCycle中传入SystemServiceManager的对象,然后就可以调用SystemServiceManager的方法,显然SystemServiceManager这个对象是SystemServer类run()方法中创建的

LifeCycle对象创建时去创建ActivityMangerService

这样SystemServiceManger就拿到了LifeCycle和ActivityMangerService对象,就可以对其进行管理

这一套流程非常的通用,所以如果app应用开发时需要启动很多的服务,可以搞一个服务管理类,管理这些服务,这点值得学习。

参考文档

AMS启动过程分析

Android10_原理机制系列_AMS之AMS的启动

posted @ 2022-06-02 16:42  cfdroid  阅读(183)  评论(0)    收藏  举报