ActivityManagerService启动流程

从SystemServer这个类开始分析,其大致流程如下:

1.main方法被调用,run方法调用;
2.调整系统时间;设置系统属性:
3.语言,地区,国家,地区属性;
4.初始化Looper;初始化本地服务;
5.创建context;
6.初始化SystemServiceManager;
7.启动引导Service、核心Service、其他Service;

7.1.启动引导Service中的动作有:
1.初始化Installer;(需要细看这个类的功能,先不管)
2.初始化ActivityManagerService,之后就调用了setInstaller(installer)方法,参数就是上面初始化的Installer;
3.初始化PowerManagerService,这里又有一个调用:mActivityManagerService.initPowerManagement(),具体意义先略过,以后有时间分析;
4.初始化LightsService,LED亮起来;
5.初始化DisplayManagerService;
6.startBootPhase方法调用,回调onBootPhase方法,继承至SystemService的系统Service都会重写onBootPhase方法,在系统服务启动过程的各个阶段会被回调到
7.初始化PackageManagerService,方式与其他服务的初始化有不同,调用PackageManagerService.main方法;
8.把UserManagerService通过ServiceManager的add方法进行初始化;
9.mActivityManagerService.setSystemProcess,这方法需要细看;
10.startSensorService启动传感器服务;

7.2.启动核心Service中的动作有:
1.启动BatteryService;
2.启动UsageStatsService;
3.调用mActivityManagerService.setUsageStatsManager,后续看下这方法啥情况;
2.启动WebViewUpdateService;

7.3.启动其他Service中的动作有:
一堆的Service初始化,就不一一列出来了,但其中会调用SystemServer中的剩下一个一方法:startSystemUI,当然需要在ActivityManagerService启动后,systemready状态后,才通过 Intent启动了SystemUI,具体代码:

intent.setComponent(new ComponentName("com.android.systemui",                  "com.android.systemui.SystemUIService"));

我们的重点是ActivityManagerService,具体看来启动引导Service中的相关代码:

mActivityManagerService = SystemServiceManager.startService(            ActivityManagerService.Lifecycle.class).getService();   mActivityManagerService.setSystemServiceManager(mSystemServiceManager); mActivityManagerService.setInstaller(installer);

这里启动ActivityManagerService的动作与启动其的service动作不一样,像PowerManagerService:

mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);

是这样启动的,所以我们进入PMS中看下:原来它并没有继承SystemService,倒是其内部类Lifecycle继承了SystemService,然后在其构造方法里new了一个AMS,然后公开了getSevice方法,将AMS return出来。所以会与其他Service获取方式不一样。具体代码如下:

public static final class Lifecycle extends SystemService {
    private final ActivityManagerService mService;
    public Lifecycle(Context context) {
        super(context);
        mService = new ActivityManagerService(context);
    }
    @Override
    public void onStart() {
        mService.start();
    }
    public ActivityManagerService getService() {
        return mService;
    }
}

AMS构造方法里,声明了mContext上下文,一个HandlerThread,一个UIHandler。然后就是两个广播队列,一个前台,一个后台,存放在一个数组里。然后获取了电池相关、进程相关、权限相关数据,并进行了持久化。并更新用户信息。

public ActivityManagerService(Context systemContext) {
        mContext = systemContext;
        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());
        mUiHandler = new UiHandler();

        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;

        mServices = new ActiveServices(this);
        mProviderMap = new ProviderMap(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);
//获取进程相关、权限相关数据
        mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats"));

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

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

        // User 0 is the first and only user that runs at boot.
        //用户信息,id为0的才有root权限运行
        mStartedUsers.put(UserHandle.USER_OWNER, new UserState(UserHandle.OWNER, true));
        mUserLru.add(UserHandle.USER_OWNER);
        updateStartedUserArrayLocked();
        //获取open gl_es版本号
        GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version",
            ConfigurationInfo.GL_ES_VERSION_UNDEFINED);

        mTrackingAssociations = "1".equals(SystemProperties.get("debug.track-associations"));
//配置项设置
        mConfiguration.setToDefaults();
  //地区设置     mConfiguration.setLocale(Locale.getDefault());

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

        mCompatModePackages = new CompatModePackages(this, systemDir, mHandler);
        mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler);
        mRecentTasks = new RecentTasks(this);
        mStackSupervisor = new ActivityStackSupervisor(this, mRecentTasks);
        mTaskPersister = new TaskPersister(systemDir, mStackSupervisor, mRecentTasks);

        mProcessCpuThread = new Thread("CpuTracker") {
            @Override
            public void run() {
                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的监控集合里,让它看着。
        Watchdog.getInstance().addThread(mHandler);//对应的handler加进去,不知道干嘛。
    }

至此ActivityManagerService在开机后,就正常跑起来了。其start方法中具体干的些啥就不作细致分析了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值