之前讲Android的View的绘制原理和流程的时候,讲到过在Android调用setContentView之后,Android调用了一个prepreTravle的方法,这里面就提到了ActivityManagerService。

ActivityManagerService提供的主要功能:
       (1)统一调度各应用程序的Activity
       (2)内存管理
       (3)进程管理

上一篇我们分析Android启动过程的文章中我们分析到了SystemServer,当时我们只是简单的描述了下,Android启动过程分析,我们还是来看一张启动的流程图,

System Server代码位于://frameworks\base\services\java\com\android\server\SystemServer.java

我们来看一段启动的代码:

  1. private void run() {
  2.  
  3. // 准备SystemServer运行环境:设置线程优先级,创建主线层Looper,ActivityThread和SystemContext
  4. android.os.Process.setThreadPriority();
  5. Looper.prepareMainLooper();
  6.  
  7. // 创建systemserver上进程的ActivityThread和SystemContext
  8. createSystemContext();
  9.  
  10. // 增加SystemServiceManager:统一管理system services的创建,启动和生命周期,多用户切换
  11. mSystemServiceManager = new SystemServiceManager(mSystemContext);
  12.  
  13. // Start services.
  14.  
  15. // 1.创建AMS
  16. mActivityManagerService = mSystemServiceManager.startService(
  17. ActivityManagerService.Lifecycle.class).getService();
  18.  
  19. // Start the Power Manager service
  20. mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
  21.  
  22. // Start the package manager service
  23. mPackageManagerService = PackageManagerService.main();
  24.  
  25. // 2.将SystemServer进程可加到AMS中调度管理
  26. mActivityManagerService.setSystemProcess();
  27.  
  28. // 3.将相关provider运行在systemserver进程中:SettingsProvider
  29. mActivityManagerService.installSystemProviders();
  30.  
  31. //
  32. final Watchdog watchdog = Watchdog.getInstance();
  33. watchdog.init(context, mActivityManagerService);
  34.  
  35. // Start Window Manager
  36. wm = WindowManagerService.main();
  37.  
  38. // 4.直接保存wms对象,与WMS交互
  39. mActivityManagerService.setWindowManager(wm);
  40.  
  41. // 5.通过WMS 弹出“正在启动应用”框
  42. // R.string.android_upgrading_starting_apps
  43. ActivityManagerNative.getDefault().showBootMessage();
  44.  
  45. // 6. AMS作为Framework核心,做好准备就绪后就开始启动应用层,和对AMS有依赖的服务
  46. mActivityManagerService.systemReady(new Runnable(){
  47. //启动SystemUI
  48. startSystemUi(context);
  49.  
  50. //启动WatchDog监控核心服务状态
  51. Watchdog.getInstance().start();
  52.  
  53. //
  54. mmsServiceF.systemRunning();
  55. });
  56.  
  57. // Loop forever.
  58. Looper.loop();
  59. }

上面的6个步骤就是SystemServer中关于AMS的调用,完成AMS的创建和系统的初始化,以及与WMS交互等流程。

一、ActivityManagerService 创建过程

mActivityManagerService = mSystemServiceManager.startService(
            ActivityManagerService.Lifecycle.class).getService();

通过SystemServiceManager这样一个模板类来创建运行在SystemServer中的Framework服务。并将创建的服务统一保存在队列管理。

  1. public ActivityManagerService(Context systemContext) {
  2.  
  3.    // 1.系统Context 和 ActivityThread (将systemserver进程作为应用进程管理)
  4. mContext = systemContext;
  5. mFactoryTest = FactoryTest.getMode();
  6. mSystemThread = ActivityThread.currentActivityThread();
  7.  
  8. // 2.AMS工作的线程和Handler,处理显示相关的UiHandler ---》知识点HandlerThread和Handler
  9. mHandlerThread = new ServiceThread(TAG,
  10. android.os.Process.THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
  11. mHandlerThread.start();
  12. mHandler = new MainHandler(mHandlerThread.getLooper());
  13. mUiHandler = new UiHandler();
  14.  
  15. // 3. 广播队列BroadcastQueue初始化:前台广播队列和后台广播队列
  16. mFgBroadcastQueue = new BroadcastQueue(this, mHandler,"foreground", BROADCAST_FG_TIMEOUT, false);
  17. mBgBroadcastQueue = new BroadcastQueue(this, mHandler,"background", BROADCAST_BG_TIMEOUT, true);
  18. mBroadcastQueues[0] = mFgBroadcastQueue;
  19. mBroadcastQueues[1] = mBgBroadcastQueue;
  20.  
  21. // 4. Service 和 Provider 管理
  22. mServices = new ActiveServices(this);
  23. mProviderMap = new ProviderMap(this);
  24.  
  25. // 5.系统数据存放目录:/data/system/
  26. File dataDir = Environment.getDataDirectory();
  27. File systemDir = new File(dataDir, "system");
  28. systemDir.mkdirs();
  29.  
  30. // 电池状态信息,进程状态 和 应用权限管理
  31. mBatteryStatsService = new BatteryStatsService(systemDir, mHandler);
  32. mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats"));
  33. mAppOpsService = new AppOpsService(new File(systemDir, "appops.xml"), mHandler);
  34.  
  35. // 6.多用户管理
  36. mStartedUsers.put(UserHandle.USER_OWNER, new UserState(UserHandle.OWNER, true));
  37. mUserLru.add(UserHandle.USER_OWNER);
  38. updateStartedUserArrayLocked();
  39.  
  40. // 7.最近任务,Activity,Task管理
  41. mRecentTasks = new RecentTasks(this);
  42. mStackSupervisor = new ActivityStackSupervisor(this, mRecentTasks);
  43. mTaskPersister = new TaskPersister(systemDir, mStackSupervisor, mRecentTasks);
  44.  
  45. // 创建一个新线程,用于监控和定时更新系统CPU信息,30分钟更新一次CPU和电池信息
  46. mProcessCpuTracker.init();
  47. mProcessCpuThread = new Thread("CpuTracker") {}
  48.  
  49. // 加入Watchdog监控起来
  50. Watchdog.getInstance().addMonitor(this);
  51. Watchdog.getInstance().addThread(mHandler);
  52. }

二、将SystemServer进程可加到AMS中调度管理

mActivityManagerService.setSystemProcess();
mActivityManagerService将system扔到ams统一管理和调度

  1. public void setSystemProcess() {
  2. // 将服务加入到ServiceManager中
  3. ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);
  4. ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
  5. ServiceManager.addService("meminfo", new MemBinder(this));
  6. ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
  7. ServiceManager.addService("dbinfo", new DbBinder(this));
  8.  
  9. // 设置application info LoadedApkinfo 有关 framework-res.apk
  10. ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(
  11. "android", STOCK_PM_FLAGS);
  12. mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());
  13.  
  14. //给SystemServer进程创建ProcessRecord,adj值,就是将SystemServer进程加入到AMS进程管理机制中,跟应用进程一致
  15. synchronized (this) {
  16. ProcessRecord app = newProcessRecordLocked(info, info.processName, false, 0);
  17. app.persistent = true;
  18. app.pid = MY_PID;
  19. app.maxAdj = ProcessList.SYSTEM_ADJ;
  20. app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);
  21. synchronized (mPidsSelfLocked) {
  22. mPidsSelfLocked.put(app.pid, app);
  23. }
  24. updateLruProcessLocked(app, false, null);
  25. updateOomAdjLocked();
  26. }
  27. }

这一步就是给SystemServer进程创建ProcessRecord,adj值,就是将SystemServer进程加入到AMS进程管理。

三、创建运行在SystemServer进程中Provider

mActivityManagerService.installSystemProviders();

取出进程名为"system",user_id为SYSTEM_UID的进程信息 ,生成运行在system进程中的providerInfo,并交给上下文的Provider。这段代码的任务就是查询与安装Content Provider并且发布,其中查询出来的provider为SettingsProvider

  1. public final void installSystemProviders() {
  2. List<ProviderInfo> providers;
  3. synchronized (this) {
  4. //取出进程名为"system",user_id为SYSTEM_UID的进程信息
  5. ProcessRecord app = mProcessNames.get("system", Process.SYSTEM_UID);
  6. //生成运行在system进程中的providerInfo,表示一个Content Provider。
  7. providers = generateApplicationProvidersLocked(app);
  8. if (providers != null) {
  9. for (int i=providers.size()-1; i>=0; i--) {
  10. ProviderInfo pi = (ProviderInfo)providers.get(i);
  11. //过滤掉非系统apk
  12. if ((pi.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
  13. Slog.w(TAG, "Not installing system proc provider " + pi.name
  14. + ": not system .apk");
  15. providers.remove(i);
  16. }
  17. }
  18. }
  19. }
  20. if (providers != null) {
  21. //安装provider
  22. mSystemThread.installSystemProviders(providers);
  23. }
  24. //监听Settings数据库变化。
  25. mCoreSettingsObserver = new CoreSettingsObserver(this);
  26.  
  27. //mUsageStatsService.monitorPackages();

四、AMS systemReady过程

mActivityManagerService.systemReady();

发送ACTION_PRE_BOOT_COMPLETE方法,清理启动的persistent进程,读取Settings配置,运行runnable接口,启动SystemUI,启动persistent应用程序,启动home,发送ACTION_BOOT_COMPLETE广播

  1. public void systemReady(final Runnable goingCallback) {
  2. synchronized(this) {
  3. if (mSystemReady) {
  4. goingCallback.run();
  5. }
  6. ……
  7.  
  8. // 1.升级相关处理:发送PRE_BOOT_COMPLETED广播 等待升级处理完成才能继续
  9. // Check to see if there are any update receivers to run.
  10. if (!mDidUpdate) {
  11. // 等待升级完成,否则直接返回
  12. if (mWaitingUpdate) {
  13. return;
  14. }
  15. // 发送PRE_BOOT_COMPLETED广播
  16. final ArrayList<ComponentName> doneReceivers = new ArrayList<ComponentName>();
  17. mWaitingUpdate = deliverPreBootCompleted(new Runnable() {
  18. // 等待所有接收PRE_BOOT_COMPLETED广播者处理完毕
  19. public void run() {
  20. synchronized (ActivityManagerService.this) {
  21. mDidUpdate = true;
  22. }
  23. showBootMessage(mContext.getText(
  24. R.string.android_upgrading_complete),
  25. false);
  26.  
  27. // 将系统版本号和处理过的广播写入文件:/data/system/called_pre_boots.dat文件
  28. writeLastDonePreBootReceivers(doneReceivers);
  29.  
  30. // 继续systemReady流程
  31. systemReady(goingCallback);
  32. }
  33. }, doneReceivers, UserHandle.USER_OWNER);
  34.  
  35. if (mWaitingUpdate) {
  36. return;
  37. }
  38. mDidUpdate = true;
  39. }
  40.  
  41. mSystemReady = true;
  42. }
  43.  
  44. // 2. 收集已经启动的进程并杀死,除过persistent常驻进程
  45. ArrayList<ProcessRecord> procsToKill = null;
  46. synchronized(mPidsSelfLocked) {
  47. for (int i=mPidsSelfLocked.size()-1; i>=0; i--) {
  48. ProcessRecord proc = mPidsSelfLocked.valueAt(i);
  49. if (!isAllowedWhileBooting(proc.info)){
  50. if (procsToKill == null) {
  51. procsToKill = new ArrayList<ProcessRecord>();
  52. }
  53. procsToKill.add(proc);
  54. }
  55. }
  56. }
  57.  
  58. synchronized(this) {
  59. if (procsToKill != null) {
  60. for (int i=procsToKill.size()-1; i>=0; i--) {
  61. ProcessRecord proc = procsToKill.get(i);
  62. Slog.i(TAG, "Removing system update proc: " + proc);
  63. removeProcessLocked(proc, true, false, "system update done");
  64. }
  65. }
  66.  
  67. // Now that we have cleaned up any update processes, we
  68. // are ready to start launching real processes and know that
  69. // we won't trample on them any more.
  70. mProcessesReady = true;
  71. }
  72.  
  73. // 3.系统准备好后回调传入的Runnable:
  74. if (goingCallback != null) goingCallback.run();
  75.  
  76.     
  77.       // 4. 发送账户启动的广播,涉及多用户
  78.       long ident = Binder.clearCallingIdentity();
  79.  
  80.       Intent intent = new Intent(Intent.ACTION_USER_STARTED);
  81.       broadcastIntentLocked(intent);
  82.       intent = new Intent(Intent.ACTION_USER_STARTING);
  83.       broadcastIntentLocked(intent);
  84.  
  85.       Binder.restoreCallingIdentity(ident);
  86.  
  87. // 5. 启动桌面Home Activity
  88. mBooting = true;
  89. startHomeActivityLocked(mCurrentUserId, "systemReady");
  90. mStackSupervisor.resumeTopActivitiesLocked();
  91. }

参考:

http://www.cnblogs.com/bastard/p/5770573.html

http://blog.csdn.net/u010083774/article/details/50620355

ActivityManagerService启动过程分析的更多相关文章

  1. 开机SystemServer到ActivityManagerService启动过程分析

    开机SystemServer到ActivityManagerService启动过程 一 从Systemserver到AMS zygote-> systemserver:java入层口: /** ...

  2. [Android5.1]ActivityManagerService启动过程分析

    ActivityManagerService(简称AMS)是Android系统的关键服务之中的一个.它的主要作用例如以下: 管理系统中全部应用进程的整个生命周期 管理应用进程中的Activity.Se ...

  3. Activity启动过程分析

    Android的四大组件中除了BroadCastReceiver以外,其他三种组件都必须在AndroidManifest中注册,对于BroadCastReceiver来说,它既可以在AndroidMa ...

  4. startActivity启动过程分析(转)

    基于Android 6.0的源码剖析, 分析android Activity启动流程,相关源码: frameworks/base/services/core/java/com/android/serv ...

  5. ASP.Net Core MVC6 RC2 启动过程分析[偏源码分析]

    入口程序 如果做过Web之外开发的人,应该记得这个是标准的Console或者Winform的入口.为什么会这样呢? .NET Web Development and Tools Blog ASP.NE ...

  6. 【Android】应用程序Activity启动过程分析

    在Android系统中,有两种操作会引发Activity的启动,一种用户点击应用程序图标时,Launcher会为我们启动应用程序的主Activity:应用程序的默认Activity启动起来后,它又可以 ...

  7. Neutron分析(2)——neutron-server启动过程分析

    neutron-server启动过程分析 1. /etc/init.d/neutron-server DAEMON=/usr/bin/neutron-server DAEMON_ARGS=" ...

  8. linux视频学习7(ssh, linux启动过程分析,加解压缩,java网络编程)

    回顾数据库mysql的备份和恢复: show databases; user spdb1; show tables; 在mysql/bin目录下 执行备份: ./mysqldump -u root - ...

  9. Spark Streaming应用启动过程分析

    本文为SparkStreaming源码剖析的第三篇,主要分析SparkStreaming启动过程. 在调用StreamingContext.start方法后,进入JobScheduler.start方 ...

随机推荐

  1. 02 基础设施/Gitlab - DevOps之路

    基础设施/Gitlab - DevOps之路 文章Github地址,欢迎start:https://github.com/li-keli/DevOps-WiKi 源代码管理器选用Gitlab,新版(2 ...

  2. vue2.0+ 从插件开发到npm发布

    vue: V2.5.11 此篇尽量详细,清楚的讲解vue插件的开发到npm的发布,想想将你自己做的东西展示给广大"网民",心里还是有点小激动的...-^_^ 先上一下插件效果图-- ...

  3. Template Method 模板设计模式

    什么是模板设计模式 对于不了解的模板设计模式的来说,可以认为如同古代的造纸术一样,纸所以成型,取决于用了模板的形状,形状又由镂空的木板组成,而你想要造什么纸,又取决于你使用什么材料. 上面提到了两个关 ...

  4. C语言完美体系

    **第 1 篇 C 语言第一阶段 13 1.1C 语言第一阶段--语言课程概述 13 1.1.1 什么是语言,什么是 C 语言 13 1.1.2 基本常识 14 1.1.3 人与计算机之间的更好的交互 ...

  5. TCP发送源码学习(3)--tcp_transmit_skb

    一.tcp_transmit_skb static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it, g ...

  6. python语言学习

    前段时间要做视频直播需要编写自动模块,就考虑使用python脚本语言,python的好多语法都是很独特的,比如数据类型不需要预定义,缩进的方式等,另外功能也很强大,豆瓣就是用python写的.我写的部 ...

  7. defaultdict的威力

    >>> from collections import defaultdict >>> s='mmississippi' >>> d=defaul ...

  8. 27 自定义View小结

    自定义View 1 为了满足开发需要 就需要自定义View 2 分类: 直接继承View 继承View的子类(现有控件 button,TextView-.) 继承ViewGroup(线性布局 相对布局 ...

  9. Android系统的安全设计与架构

    Android系统的安全设计与架构 一.安全策略 1.Android 的总体架构由5个主要层次上的组件构成,这5层是:Android应用层. Android框架层.Dalvik虚拟机层.用户空间原生代 ...

  10. FORM打开网页链接

     DECLARE l_server_url VARCHAR2(100); l_parameters VARCHAR2(200); BEGIN fnd_profile.get('APPS_WEB_A ...