Android源码分析(十三)ActivityManagerService服务分析

一.ActivityManagerService(AMS) 启动过程分析

在SystemServer启动ActivityManagerService

如果想了解SystemServer启动过程可以看这篇文章:Android 源码分析(六) SystemServer 进程

frameworks\base\services\java\com\android\server\SystemServer.java
        // Activity manager runs the show.
        traceBeginAndSlog("StartActivityManager");
        mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);
        

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

public class ActivityManagerService extends IActivityManager.Stub
        implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {

    /** All system services */
    SystemServiceManager mSystemServiceManager;
    
    /** Run all ActivityStacks through this */
    //管理Activity
    final ActivityStackSupervisor mStackSupervisor;
    
    final ActivityStarter mActivityStarter;
    
    final TaskChangeNotificationController mTaskChangeNotificationController;

    final InstrumentationReporter mInstrumentationReporter = new InstrumentationReporter();

    final ArrayList<ActiveInstrumentation> mActiveInstrumentation = new ArrayList<>();
    
    // Whether we should use SCHED_FIFO for UI and RenderThreads.
    private boolean mUseFifoUiScheduling = false;
 
    //Broadcast 广播 ,前台广播队列和后台广播队列
    BroadcastQueue mFgBroadcastQueue;
    BroadcastQueue mBgBroadcastQueue;
    
    // Convenient for easy iteration over the queues. Foreground is first
    // so that dispatch of foreground broadcasts gets precedence.
    final BroadcastQueue[] mBroadcastQueues = new BroadcastQueue[2];

    BroadcastStats mLastBroadcastStats;
    BroadcastStats mCurBroadcastStats;

    BroadcastQueue broadcastQueueForIntent(Intent intent) {
        final boolean isFg = (intent.getFlags() & Intent.FLAG_RECEIVER_FOREGROUND) != 0;
        if (DEBUG_BROADCAST_BACKGROUND) Slog.i(TAG_BROADCAST,
                "Broadcast intent " + intent + " on "
                + (isFg ? "foreground" : "background") + " queue");
        return (isFg) ? mFgBroadcastQueue : mBgBroadcastQueue;
    }

    //Activity 堆栈
    /**
     * The last resumed activity. This is identical to the current resumed activity most
     * of the time but could be different when we're pausing one activity before we resume
     * another activity.
     */
    private ActivityRecord mLastResumedActivity;

    /**
     * If non-null, we are tracking the time the user spends in the currently focused app.
     */
    private AppTimeTracker mCurAppTimeTracker;
    
    //ANR ? 最后个ANR状态,难道可以记录app发生ANR的?
    /**
     * Dump of the activity state at the time of the last ANR. Cleared after
     * {@link WindowManagerService#LAST_ANR_LIFETIME_DURATION_MSECS}
     */
    String mLastANRState;
    
    //Service 和 Provider 管理
    final ActiveServices mServices;
    final ProviderMap mProviderMap;
    
    //存放系统数据目录
    // TODO: Move creation of battery stats service outside of activity manager service.
    File dataDir = Environment.getDataDirectory();
    File systemDir = new File(dataDir, "system");
    systemDir.mkdirs();
    mBatteryStatsService = new BatteryStatsService(systemDir, mHandler);

    //应用权限管理
    mAppOpsService = mInjector.getAppOpsService(new File(systemDir, "appops.xml"), mHandler);
    
        //AcitivityManager 添加进来
        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));
    
    //最后 使用Watchdog监控
    Watchdog.getInstance().addMonitor(this);
    Watchdog.getInstance().addThread(mHandler);
    
}

   从上面截取的一些代码片段,我们能了解到, AMS创建过程 涉及到Android 四大组件管理的初始化工作。并且ActivityManagerService extends IActivityManager.Stub,所以可知AcitivityManagerService与AcitivityManager之间通信也是使用binder机制。

    进ActivityManager 里面看看

//与ActivityManagerService里的ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);对应。
@SystemService(Context.ACTIVITY_SERVICE)
public class ActivityManager {
    ...
}

 

二.ActivityManager和ActivityManagerService关系

如果想了解Activity是如果通过ActivityManager调用ActivityManagerService的过程可以看下这篇文章.

Android 源码分析(二) Activity 启动分析

ActivityManager(frameworks/base/core/java/android/app/ActivityManager.java)

ActivityManager 是客户端用来管理系统中正在运行的所有Activity.

上层APP通过ActivityManager使用binder机制传递信息给AMS,由AMS去完成交互和调度工作后通过binder机制返回给ActivityManager,把结果在返回给上层app。

一张图了解ActivityManager和ActivityManagerService在整个Android系统通信过程中位置。

《Android源码分析(十三)ActivityManagerService服务分析》

 

 

 

 

参考:
[1]https://www.cnblogs.com/bastard/p/5770573.html

    原文作者:Android·oreo
    原文地址: https://www.cnblogs.com/bugzone/p/ActivityManagerService.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞