ActivityManagerService启动流程
2016-06-07 17:08
453 查看
从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,具体代码:
我们的重点是ActivityManagerService,具体看来启动引导Service中的相关代码:
这里启动ActivityManagerService的动作与启动其的service动作不一样,像PowerManagerService:
是这样启动的,所以我们进入PMS中看下:原来它并没有继承SystemService,倒是其内部类Lifecycle继承了SystemService,然后在其构造方法里new了一个AMS,然后公开了getSevice方法,将AMS return出来。所以会与其他Service获取方式不一样。具体代码如下:
AMS构造方法里,声明了mContext上下文,一个HandlerThread,一个UIHandler。然后就是两个广播队列,一个前台,一个后台,存放在一个数组里。然后获取了电池相关、进程相关、权限相关数据,并进行了持久化。并更新用户信息。
至此ActivityManagerService在开机后,就正常跑起来了。其start方法中具体干的些啥就不作细致分析了。
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方法中具体干的些啥就不作细致分析了。
相关文章推荐
- codevs 1227 方格取数 2
- clone代码
- 2015年中国软件测试现状调查报告!
- shiro简介
- LeNet、AlexNet、VGG、ZF
- 浅谈软件架构师的素质与职责
- Html5 Checkbox多种状态切换
- IncompleteElementException: Could not find result map java.util.HashMap
- ubuntu中apache页面权限控制
- 神奇的书签
- Ormlite一对多配置
- 【正则表达式】不要写通配嵌套的正则表达式!
- linux_2.6内核内存缓冲与I/O调度机制:
- clojure用gen-class来实现java接口,及java中测试
- Jersey 2.17 + Tomcat + Maven 构建restful service 实例
- jni
- android 常用代码
- Linux常用网络测试命令
- webstorm 实现 项目上传到github
- 时间拉链表用法