ActivityManagerService 构造方法分析

                    ActivityManagerService 构造方法分析

参考:https://blog.csdn.net/u013122625/article/details/53433064

本文主要分析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) {
        /*
            下面的方法将当前的ActivityManagerService,赋值给了LockGuard类内部的一个名为
            sKnownFixed数组的特定的位置,可能和锁相关吧
         */
        LockGuard.installLock(this, LockGuard.INDEX_ACTIVITY);
        /*
             Injuetor是AMS的一个内部类
        */
        mInjector = new Injector();
        //mContext是系统的Context对象
        mContext = systemContext;
        mFactoryTest = FactoryTest.getMode();
        /*
         ActivityThread是Android应用的主线程(UI线程),是真正负责执行Activity启动的操作的,
         ActivityThread的创建是在SystemServer的createSystemContext()方法中创建的,也就是
         在SystemServer创建时,执行run时调用createSystemContext(),此时AMS获取了主线程的引用
         */
        mSystemThread = ActivityThread.currentActivityThread();
        /*
          在这里面获取了一些APK的信息,然后设置设置什么资源的 ,LoadedApk代表一个加载到系统中的
          APK。 其中保存了apk的基本信息 ,LoadedAPK的这个构造方法只有系统进程创建的时候可以调
          用。它代表一个系统进程的apk,它里面存储着资源文件的位置,jni包的位置等信息,包名为
          android。其实代表的就是就是framework-res.apk。该apk仅供systemServer使用。应该是 获
          取了SystemUI的context对象
        */
        mUiContext = mSystemThread.getSystemUiContext();

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

        /*
          权限相关的变量
        */
        mPermissionReviewRequired = mContext.getResources().getBoolean(
                com.android.internal.R.bool.config_permissionReviewRequired);

        /*
          创建一个mHandlerThread线程,默认名是:ActivityManager,该线程内部其实并没有做什么工作
          继承自HandlerThread
        */
        mHandlerThread = new ServiceThread(TAG,
                THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
        mHandlerThread.start();
        /*
          生成了一个 MainHandler对象,该对象和上面的mHandlerThread绑定在同一个线程上,那到底绑
          定在哪一个线程上呢 。MainHandler是AMS内部定义的handler,handMessage内部有超级多的
          case判断,可能AMS中的重要的处理逻辑都在这个里面
        */
        mHandler = new MainHandler(mHandlerThread.getLooper());
        /*
           生成UiHandler对象,也是定义在AMS内部的Handler对象,内部也有很多case判断,应该主要与
           UI事件相关
        */
        mUiHandler = mInjector.getUiHandler(this);

        /*
          ActivityManagerConstants是一个ContentObserver对象,里面定义了很多变量,观察者,可能
          是当装态发生改变时,通过handler回调AMS
        */
        mConstants = new ActivityManagerConstants(this, mHandler);

        /* static; one-time init here */
        if (sKillHandler == null) {
            sKillThread = new ServiceThread(TAG + ":kill",
                    THREAD_PRIORITY_BACKGROUND, true /* allowIo */);
            sKillThread.start();
            sKillHandler = new KillHandler(sKillThread.getLooper());
        }

        /*
          下面的这两个广播队列应该就与android系统的广播实现相关
        */
        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;

        /*
          ActiveServices: 应该是管理系统中所有services的一个对象,不是Activity的那个Service
        */
        mServices = new ActiveServices(this);
        /*
          可能是保存android系统中ContentProvider的映射关系的对象
         */
        mProviderMap = new ProviderMap(this);
        mAppErrors = new AppErrors(mUiContext, this);

        // 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);
        mBatteryStatsService.getActiveStatistics().readLocked();
        mBatteryStatsService.scheduleWriteToDisk();
        mOnBattery = DEBUG_POWER ? true
                : mBatteryStatsService.getActiveStatistics().getIsOnBattery();
        mBatteryStatsService.getActiveStatistics().setCallback(this);
        //创建进程统计服务类,并新建一个data/system/procstats目录
        mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats"));
        // 创建一个应用权限检查类,新建一个data/system/appops.xml文件,并注册对应的回调接口
        mAppOpsService = mInjector.getAppOpsService(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"));
        // 创建多用户控制器,user 0是第一个,同时也是唯一开机过程中运行的用户
        mUserController = new UserController(this);
        
        mVrController = new VrController(this);
         // 获取OpenGL版本,如果没有找到,则默认为0
        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"));
        // 设置系统的一些默认配置信息
        mTempConfig.setToDefaults();
        mTempConfig.setLocales(LocaleList.getDefault());
        mConfigurationSeq = mTempConfig.seq = 1;
        // 用来管理Activity栈
        mStackSupervisor = createStackSupervisor();
        mStackSupervisor.onConfigurationChanged(mTempConfig);
        //锁屏相关
        mKeyguardController = mStackSupervisor.mKeyguardController;
        mCompatModePackages = new CompatModePackages(this, systemDir, mHandler);
        mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler);
        mTaskChangeNotificationController =
                new TaskChangeNotificationController(this, mStackSupervisor, mHandler);
        // 解释怎样启动Activity
        mActivityStarter = new ActivityStarter(this, mStackSupervisor);
        // 管理最近任务列表
        mRecentTasks = new RecentTasks(this, mStackSupervisor);
        // 初始化进程CPU跟踪器
        mProcessCpuThread = new Thread("CpuTracker") {
            @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);
                    }
                }
            }
        };

        Watchdog.getInstance().addMonitor(this);
        Watchdog.getInstance().addThread(mHandler);
    }

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值