Android7.1 ActivityManagerService概述

简介

        ActivityManagerService(以下简称:AMS)是android系统的一个系统服务,是应用进程的管理服务端,直接的控制了应用程序的各个行为,保证了系统中不同的应用程序之间能够和谐的合理的进行调度运行。AMS主要的职责就是对Android四大组件(Activity,Service,ContentProvider,Broadcast)进行管理。虽然开发者在开发过程中会经常的使用到AMS提供的一些功能,但是可能很少有机会对它进行一个统一的整体和认知。

该文档的书写目的主要是为了对做AMS进行了一个整体的基础介绍和讲解,希望能够一些开发人员有所帮助。

系统服务启动过程

如下图所示,该图概要描述了系统启动时的整个过程:


1) 系统启动时,会先启动kernel模块

2) kenel模块中会启动init进程,而init进程会解析init.rc文件并启动一系列native服务。

3) Zygote进程预加载和初始化一些核心类库,便于之后的应用进程的代码共享。

4) Zygote启动(fork)系统服务进程system_server

5) System_Server进程中会发布一系列的系统服务,而AMS就是其中之一,并在之后的生命周期中运行在system_server的进程中。

6) AMS启动(fork)出一系列的应用进程。

详细的系统服务启动流程请参考《Android启动系列文章

AMS框架设计

结构框架设计

      AMS是android上层系统最核心的模块之一,其主要的工作是对所有的应用进程及其进程中的四大组件进行管理。(当然这里面也涉及了一些window、电源、权限等内容, 我们这里不再讲述)

对进程的管理包括:进程的创建与销毁、进程的优先级调整。

对组件的管理包括:Activity的调度管理、Service的管理、Broadcast的分发、以及ContentProvider管理。

通信框架设计

      从上节我们可以得知,AMS作为上层最核心的模块之一,不论是直接对进程的管理还是对进程中组件的调度管理,它都离不开和应用进程之间的通信。而在Android系统中,最常用的进程间的通信手段就是使用Binder调用的方式,AMS和应用进程之间的通信方式也正是采用的Binder机制。


      AMS和应用之间的通信过程中有两个非常重要的类:ActivityManagerService和ActivityThread。其中ActivityThread是应用进程的入口,负责管理进程主线程的执行,根据AMS的调度要求直接的控制着应用进程中各个组件的有序执行。

       这里需要注意的是:应用对AMS的通信都是最终通过ActivityManagerProxy直接访问的AMS。而AMS向应用的通信,则需要通过ApplicationThread然后将异步消息通过Handler发送到应用的主线程中执行。

AMS初始化

AMS属于系统核心进程,是从SystemServer进程中启动起来的。

构造函数

     在AMS构造函数中做一些最基本的初始化工作,如初始化异步线程作为AMS的“主线程”,建立广播的分发队列等。

    public ActivityManagerService(Context systemContext) {
        mContext = systemContext;            //设置系统上下文context
        mFactoryTest = FactoryTest.getMode(); //获取工厂测试模式
        mSystemThread = ActivityThread.currentActivityThread();  //获取当前的系统线程

        Slog.i(TAG, "Memory class: " + ActivityManager.staticGetMemoryClass());

        mHandlerThread = new ServiceThread(TAG,
                android.os.Process.THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
        mHandlerThread.start();    //创建一个线程
        mHandler = new MainHandler(mHandlerThread.getLooper()); //使用新创建线程的Looper创建hander
        mUiHandler = new UiHandler();   //使用主线程的Looper创建显示UI的handler

        /* static; one-time init here */
        if (sKillHandler == null) {
            sKillThread = new ServiceThread(TAG + ":kill",
                    android.os.Process.THREAD_PRIORITY_BACKGROUND, true /* allowIo */);
            sKillThread.start();   //创建线程
            sKillHandler = new KillHandler(sKillThread.getLooper());   //创建hander用来杀进程
        }

        mFgBroadcastQueue = new BroadcastQueue(this, mHandler,
                "foreground", BROADCAST_FG_TIMEOUT, false); //创建前台广播队列,广播处理超时时间为10s
        mBgBroadcastQueue = new BroadcastQueue(this, mHandler,
                "background", BROADCAST_BG_TIMEOUT, true);  //创建后台广播队列,广播超时时间为60s
        mBroadcastQueues[0] = mFgBroadcastQueue;
        mBroadcastQueues[1] = mBgBroadcastQueue;

        mServices = new ActiveServices(this);   //创建Service对象
        mProviderMap = new ProviderMap(this);   //管理Provider
        mAppErrors = new AppErrors(mContext, this); //处理应用错误

        // TODO: Move creation of battery stats service outside of activity manager service.
        File dataDir = Environment.getDataDirectory();  //获取系统data/路径
        File systemDir = new File(dataDir, "system");   //获取data/system路径
        systemDir.mkdirs();                             //创建文件夹
        mBatteryStatsService = new BatteryStatsService(systemDir, mHandler);
        mBatteryStatsService.getActiveStatistics().readLocked();
        mBatteryStatsService.scheduleWriteToDisk();   //电池信息
        mOnBattery = DEBUG_POWER ? true
                : mBatteryStatsService.getActiveStatistics().getIsOnBattery();
        mBatteryStatsService.getActiveStatistics().setCallback(this);

        mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats"));  //进程状态

        mAppOpsService = new AppOpsService(new File(systemDir, "appops.xml"), mHandler);
        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);
                            }
                        }
                    }
                });

        mGrantFile = new AtomicFile(new File(systemDir, "urigrants.xml"));

        mUserController = new UserController(this);

        GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version",
            ConfigurationInfo.GL_ES_VERSION_UNDEFINED);

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

        mTrackingAssociations = "1".equals(SystemProperties.get("debug.track-associations"));

        mConfiguration.setToDefaults();
        mConfiguration.setLocales(LocaleList.getDefault());

        mConfigurationSeq = mConfiguration.seq = 1;
        mProcessCpuTracker.init();

        mCompatModePackages = new CompatModePackages(this, systemDir, mHandler);
        mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler);
        mStackSupervisor = new ActivityStackSupervisor(this); //Activity stack信息的管理者
        mActivityStarter = new ActivityStarter(this, mStackSupervisor);  //启动Activity的类
        mRecentTasks = new RecentTasks(this, mStackSupervisor);  //最近任务

        mProcessCpuThread = new Thread("CpuTracker") {  //获取cpu信息的线程
            @Overrid
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值