• Android AMS ATMS


    1.AMS/ATMS

    在android10之前,android的四大组件统一由AMS进行管理;在android10之后,ATMS负责activity的相关管理,剩下的三大组件还是由AMS管理,不过在AMS中持有ATMS。同时,AMS也对进程、电池、内存、权限等进行管理。

    注:AMS、ATMS服务都是在系统进程system server进程中。

     

    AMS相关目录的几个重要文件:

    ①frameworks/base/core/java/android/app/下:

    Activity.java:所有Activity的父类。

    ActivityManager.java:AMS的客户端,提供给用户可调用的api。

    ActivityThread.java:应用进程的主线程类,一般即UI线程。

    ②frameworks/base/services/core/java/com/android/server/am/下:

    ActiveServices.java:控制service的启动、重启等。

    ProcessRecord.java:记录每个进程的信息。

    ③frameworks/base/services/core/java/com/android/server/wm/下:

    ActivityRecord.java:activity对象信息的记录。

    ActivityStack.java/ActivityStackSupervisor.java:管理activity生命周期及堆栈等。

    TaskRecord.java:任务栈记录,管理一个任务的应用activity。

    ActivityTaskManagerService.java/ActivityTaskManagerInternal.java:管理activity的启动和调度。

     

    2.AMS的启动流程

    ActivityManagerService是在SystemServer.java中启动的。系统启动后Zygote进程第一个fork出SystemServer进程:

    30a1e1f4883b4403a409283d1ea98d6c.png

    然后,进入到SystemServer:main()->run()->startBootstrapServices() 启动引导服务,在引导服务中完成AMS的启动。

    e6412ebeb2e74954ab988169df86278d.png

    在SystemServer中,会按顺序依次启动各个服务:

    SystemServer.java:

    public static void main(String[] args) {

        new SystemServer().run();

    }

    private void run() {

        ...

        //1.初始化 System Context

        createSystemContext(); 

        //2.创建 SystemServiceManager对象,主要用来管理SystemService的创建和启动等生命周期

        mSystemServiceManager = new SystemServiceManager(mSystemContext); 

       mSystemServiceManager.setStartInfo( mRuntimeRestart, mRuntimeStartElapsedTime, mRuntimeStartUptime);

        LocalServices.addService( SystemServiceManager.class, mSystemServiceManager);

        ...

        //3.启动服务

        startBootstrapServices(); //启动引导服务,在其中启动了ATM和AMS服务,通过AMS安装Installer、初始化Power,设置系统进程等

        startCoreServices(); //启动核心服务

        startOtherServices();  //启动其他服务

    }

    在SystemServer的run函数中,启动AMS之前,调用了createSystemContext函数,主要用来初始化System Context和SystemUi Context,并设置主题:

    private void createSystemContext() {

        ActivityThread activityThread = ActivityThread.systemMain(); 

        //获取system context

        mSystemContext = activityThread.getSystemContext();

        //设置系统主题

        mSystemContext.setTheme( DEFAULT_SYSTEM_THEME);

        //获取systemui context

        final Context systemUiContext = activityThread.getSystemUiContext();

        //设置systemUI 主题

        systemUiContext.setTheme( DEFAULT_SYSTEM_THEME);

    }

    调用createSystemContext主要完成两件事情:

    ①得到一个ActivityThread对象,代表当前进程(此时为系统进程)的主线程

    ②得到一个Context对象,对SystemServer而言,它包含的application运行环境与framewokr-res.apk有关。

    createSystemContext()创建了两个上下文,系统context和SystemUi context。这两个挺重要,会传入AMS中,这里就是它们创建的地方。

    ActivityThread是当前进程的主线程。SystemServer初始化时ActivityThread.systemMain()创建的是系统进程(SystemServer进程)的主线程。

     

    AMS、ATM都是在startBootstrapServices函数里启动的,WMS是在startOtherServices函数里启动的。

    跟踪startBootstrapServices函数:

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

    private void startBootstrapServices() {

        .....

        //创建ATM对象,并调用它的start方法

        ActivityTaskManagerService atm = mSystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class).getService();

        //创建AMS对象,并调用它的start方法(AMS中持有ATM的引用)

        mActivityManagerService = ActivityManagerService.Lifecycle.startService( mSystemServiceManager, atm);

        mActivityManagerService.setSystemServic eManager(mSystemServiceManager);

        mActivityManagerService.setInstaller( installer);

        mActivityManagerService.initPowerManagem ent();

        mActivityManagerService.setSystemProcess();

        watchdog.init(mSystemContext, mActivityManagerService);

    }

    (1)mSystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class).getService()和ActivityManagerService.Lifecycle.startService()里执行过程是一样的,这句创建了ActivityTaskManagerService对象,并调用了ActivityTaskManagerService中的start()方法启动服务。

    ActivityTaskManagerService是Android 10新引入的变化,也是系统服务,用来管理Activity启动和调度,包括其容器(task、stacks、displays等)。

    Android 10将原先AMS中对activity的管理和调度移到了ActivityTaskManagerService中,因此AMS负责四大组件中另外3个(service, broadcast, contentprovider)的管理和调度。

     

    然后看ActivityManagerService.Lifecycle.class类,在ActivityManagerService 中:

    ActivityManagerService.java

    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;

        }

    这里的Lifecycle是AMS的内部类。ActivityManagerService.Lifecycle.startService()最终返回的是mService,即创建的AMS对象。

    接着来具体看下这个过程的实现,ActivityManagerService.Lifecycle.startService()进入SystemServiceManager类的startService(),继续看:

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

    public <T extends SystemService> T startService(Class<T> serviceClass) {

        try {

            final String name = serviceClass.getName();

            if (!SystemService.class.isAssignableFrom( serviceClass)) {

                throw new RuntimeException("Failed to create " + name + ": service must extend " + SystemService.class.getName());

            }

            final T service;

            try {

                Constructor<T> constructor = serviceClass.getConstructor(Context.class);

                service = constructor.newInstance( mContext);

            } 

            startService(service);

            return service;

        } 

    }

    public void startService(final SystemService service) {

        mServices.add(service); // Register it.

        // Start it.

        long time = SystemClock.elapsedRealtime();

        try {

            service.onStart();

        } catch (RuntimeException ex) {

            ......

        }

        warnIfTooLong(SystemClock.elapsedRealtim e() - time, service, "onStart");

    }

    SystemServiceManager中通过反射,调用了ActivityManagerService.Lifecycle的构造方法,然后startService(service) 中最终调用了service.onStart(),即ActivityManagerService.Lifecycle.onStart(),这样就把ActivityManagerService创建了。

    接着需要看两点:通过反射调用ActivityManagerService.Lifecycle的构造方法,主要new ActivityManagerService() 创建AMS对象,干了些什么需要了解;ActivityManagerService.Lifecycle.onStart()就是直接调用AMS的start()方法;

    ①new ActivityManagerService()

    public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) {

        //系统上下文,是在SystemServer进程fork出来后通过createSystemContext()创建的,即与SystemServer进程是一一致

        mContext = systemContext;

        //系统进程的主线程 sCurrentActivityThread,这里是systemMain()中创建的ActivityThread对象。即也与SystemServer一样的。

        mSystemThread = ActivityThread.currentActivityThread();

        mUiContext = mSystemThread.getSystemUiContext();

        mHandlerThread = new ServiceThread(TAG, THREAD_PRIORITY_FOREGROUND, false);

        mHandlerThread.start();

        //处理AMS消息的handle

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

        //UiHandler对应于Android中的Ui线程

        mUiHandler = mInjector.getUiHandler(this);

        mProcStartHandlerThread = new ServiceThread(TAG + ":procStart", THREAD_PRIORITY_FOREGROUND, false);

        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);

        final BroadcastConstants foreConstants = new BroadcastConstants(Settings.Global.BROAD CAST_FG_CONSTANTS);

        foreConstants.TIMEOUT = BROADCAST_FG_TIMEOUT;//10s

        final BroadcastConstants backConstants = new BroadcastConstants( Settings.Global.BROADCAST_BG_CONSTANTS);

        backConstants.TIMEOUT = BROADCAST_BG_TIMEOUT;//60s

        final BroadcastConstants offloadConstants = new BroadcastConstants( Settings.Global.BROADCAST_OFFLOAD_CONSTANTS);

        offloadConstants.TIMEOUT = BROADCAST_BG_TIMEOUT;

        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;

        // 创建ActiveServices对象,管理 ServiceRecord

        mServices = new ActiveServices(this);

        // 创建ProviderMap对象,管理ContentProviderRecord

        mProviderMap = new ProviderMap(this);

        mPackageWatchdog = PackageWatchdog.getInstance(mUiContext);

        mAppErrors = new AppErrors(mUiContext, this, mPackageWatchdog);

        final File systemDir = SystemServiceManager.ensureSystemDir();

        mBatteryStatsService = new BatteryStatsService(systemContext, systemDir, BackgroundThread.get().getHandler());

        mBatteryStatsService.getActiveStatisti cs().readLocked();

        mBatteryStatsService.scheduleWriteToDisk();

        mOnBattery = DEBUG_POWER ? true : mBatteryStatsService.getActiveStatistics().getIsOnBattery();

        mBatteryStatsService.getActiveStatistic s().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);

        //得到ActivityTaskManagerService的对象,调用ATM.initialize

        mActivityTaskManager = atm;

        mActivityTaskManager.initialize( mIntentFirewall, mPendingIntentController, DisplayThread.get().getLooper());

        mAtmInternal = LocalServices.getService( ActivityTaskManagerInternal.class);

        mProcessCpuThread = new Thread("CpuTracker") {

            ......

        };

        mHiddenApiBlacklist = new HiddenApiSettings(mHandler, mContext);

        //加入Watchdog的监控

        Watchdog.getInstance().addMonitor(this);

        Watchdog.getInstance().addThread( mHandler);

        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");

        }

    }

    AMS的构造方法,主要完成一些对象的构造及变量的初始化。

    三大组件的(service、broadcast、provider)管理和调度(activity移到了ActivityTaskManagerService中,但此处也绑定了ActivityTaskManagerService对象)。

    监控内存、电池、权限以及性能相关的对象或变量。mLowMemDetector、mBatteryStatsService、mProcessStats、mAppOpsService、mProcessCpuThread等。

    ②AMS的start()

    private void start() {

        removeAllProcessGroups(); //移除所有进程组

        mProcessCpuThread.start(); //启动CPU监控线程

        //注册电池、权限管理相关服务

        mBatteryStatsService.publish();

        mAppOpsService.publish(mContext);

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

        mActivityTaskManager.onActivityManag erInternalAdded();

        mUgmInternal.onActivityManagerIntern alAdded();

        mPendingIntentController.onActivityMan agerInternalAdded();

        try {

            mProcessCpuInitLatch.await();

        } catch (InterruptedException e) {

            Slog.wtf(TAG, "Interrupted wait during start", e);

            Thread.currentThread().interrupt();

            throw new IllegalStateException("Interrupted wait during start");

        }

    }

    start()主要:

    移除所有进程组,复位进程后,启动CPU监控线程。mProcessCpuThread在前面构造函数中创建的线程。

    注册电池、权限管理的相关服务

    LocalService只能本进程使用,不可跨进程。

    (2)mActivityManagerService.setSystemServiceManager(mSystemServiceManager)

    ActivityManagerService.java:

    public void setSystemServiceManager( SystemServiceManager mgr) {

        mSystemServiceManager = mgr;

    }

    很简单,将SystemServer.java中创建的SystemServiceManager对象mSystemServiceManager设置到了AMS中。

    (3)mActivityManagerService.setInstaller(installer)

    ActivityManagerService.java:

    public void setInstaller(Installer installer) {

        mInstaller = installer;

    }

    同样,将SystemServer.java中创建的Installer对象installer设置到AMS中。

    (4)mActivityManagerService.initPowerManagement()

    ActivityManagerService.java:

    public void initPowerManagement() {

        mActivityTaskManager.onInitPowerManage ment();

        mBatteryStatsService.initPowerManageme nt();

        mLocalPowerManager = LocalServices.getService(PowerManagerInternal.class);

    }

    在前面创建AMS过程,mActivityTaskManager、mBatteryStatsService对象已创建 相关服务已注册。这里初始化电源管理的功能。

    (5)mActivityManagerService.setSystemProcess()

    public void setSystemProcess() {

       try {

            //注册服务activity

            ServiceManager.addService( Context.ACTIVITY_SERVICE, this, true, DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO);

            //注册服务procstats,进程状态

            ServiceManager.addService( ProcessStats.SERVICE_NAME, mProcessStats);

            //注册服务meminfo,内存信息

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

            //注册服务gfxinfo,图像信息

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

            //注册服务dbinfo,数据库信息

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

            if (MONITOR_CPU_USAGE) {

                //注册服务cpuinfo,cpu信息

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

            }

            //注册服务permission和processinfo,权限和进程信息

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

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

            //获取“android”应用的ApplicationInfo,并装载到mSystemThread

            ApplicationInfo info = mContext.getPackageManager().getApplicationInfo("android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);

            mSystemThread.installSystemApplica tionInfo(info, getClass().getClassLoader());

            //创建ProcessRecord维护进程的相关信息

            synchronized (this) {

                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.NameNotFoundExc eption e) {

            throw new RuntimeException( "Unable to find android system package", e);

        }

    }

    这个方法设置系统进程,AMS的setSystemProcess主要:

    注册一些服务:activity、procstats、meminfo、gfxinfo、dbinfo、cpuinfo、permission、processinfo;

    这里获取包名为“android”的应用的ApplicationInfo对象,并将该ApplicationInfo信息安装设置到SystemThread(系统进程主线程)。即可以理解,系统也是一个特殊的应用。

    创建ProcessRecord维护进程的相关信息,这里MY_PID即为SystemServer进程ID。

    启动 检测应用运行和交互。

    (6)watchdog.init(mSystemContext, mActivityManagerService)

    初始化看门狗,AMS实列作为参数设置进入。

     

    大致总结下AMS的启动:

    ①系统启动后Zygote进程第一个fork出SystemServer进程

    ②SystemServer->run()->createSystemContext():创建了系统的ActivityThread对象,运行环境mSystemContext、systemUiContext。

    ③SystemServer->run()->startBootstrapServices()->ActivityManagerService.Lifecycle.startService():AMS在引导服务启动方法中,通过构造函数new ActivityManagerService()进行了一些对象创建和初始化(除activity外3大组件的管理和调度对象创建;内存、电池、权限、性能、cpu等的监控等相关对象创建),start()启动服务(移除进程组、启动cpu线程、注册权限、电池等服务)。

    ④SystemServer->run()->startBootstrapServices()->setSystemServiceManager()、setInstaller()、initPowerManagement()、setSystemProcess():AMS创建后进行了一系列相关的初始化和设置。

    setSystemProcess():将framework-res.apk的信息加入到SystemServer进程的LoadedApk中,并创建了SystemServer进程的ProcessRecord,加入到mPidsSelfLocked,由AMS统一管理。

    ⑤SystemServer->run()->startOtherServices():AMS启动后的后续工作,主要调用systemReady()和运行调用时传入的goingCallback。

    systemReady()/goingCallback:各种服务或进程等AMS启动完成后需进一步完成的工作及系统相关初始化。 桌面应用在systemReady()方法中启动,systemui在goingCallback中完成。当桌面应用启动完成后,发送开机广播ACTION_BOOT_COMPLETED。

  • 相关阅读:
    .NET Core MongoDB数据仓储和工作单元模式封装
    LabVIEW更改图像特定部分的颜色
    harmony 鸿蒙使用N-API开发Native模块
    基于黏菌算法优化概率神经网络PNN的分类预测 - 附代码
    中英文域名,你是否也有点小迷糊......
    extern “C“的底层原理和一些思考,C/C++之间的相互调用
    Linux文件管理知识:查找文件(第二篇)
    【面经】美团大数据开发面经
    BeanPostProcessor和BeanFactoryPostProcessor简单介绍
    Web3 时代 市场营销的变迁
  • 原文地址:https://blog.csdn.net/zenmela2011/article/details/125407243