AMS启动过程分析

AMS(ActivityManagerService)主要负责四大组件的启动、切换、调度以及应用进程的管理和调度工作。

Android系统启动流程:首先会从ROM中预定义的地方加载引导程序BootLoader到RAM中,并执行BootLoader程序启动Linux Kernel,然后启动用户级别的第一个进程init进程。init进程会解析init.rc脚本做一些初始化工作,包括挂载系统文件、创建工作目录以及启动系统服务进程等,其中系统服务进程包括Zygote、ServiceManager、Media等。在Zygote中会进一步启动system_server进程,然后system_server进程中会启动AMS、WMS、PMS等服务,这些服务启动后,AMS就会打开Launcher应用的home Activity,最终就看到了手机桌面。

AMS是在SystemServer中被添加的

//SystemServer.java
/**
 * The main entry point from zygote.
 */
public static void main(String[] args) {
  //new SystemServer()中创建了ActivityThread
  new SystemServer().run();
}

private void run() {
  //创建主线程Looper
  Looper.prepareMainLooper();
  //创建系统context(new ContextImpl)和加载系统资源
  createSystemContext();
  //启动引导服务
  startBootstrapServices();
  //启动核心服务
  startCoreServices();
  //启动其它服务
  startOtherServices();
  //loop循环
  Looper.loop();
}

SystemServer类的main中初始化SystemServer对象,调用run方法:

1)createSystemContext:创建系统上下文
2)startBootstrapServices:启动引导服务
3)startCoreServices:启动核心服务
4)startOtherServices:启动其它服务
5)Looper.loop:loop循环

startBootstrapServices中启动了AMS

private void startBootstrapServices() {
  //启动AMS
  mActivityManagerService = ActivityManagerService.Lifecycle.startService(
                        mSystemServiceManager, atm);
  mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
  mActivityManagerService.setInstaller(installer);
  
  //③将AMS注册到ServiceManager中
  mActivityManagerService.setSystemProcess();
}
public static final class Lifecycle extends SystemService {
  private final ActivityManagerService mService;
  private static ActivityTaskManagerService sAtm;

  //ActivityManagerService.Lifecycle这个类的构造方法
  public Lifecycle(Context context) {
    super(context);
    //①创建AMS实例
    mService = new ActivityManagerService(context, sAtm);
  }
 
  public static ActivityManagerService startService(
    SystemServiceManager ssm, ActivityTaskManagerService atm) {
    sAtm = atm;
    //通过LifeCycle的getService返回AMS对象
    return ssm.startService(ActivityManagerService.Lifecycle.class).getService();
  }
  
  @Override
  public void onStart() {
    //②启动AMS
    mService.start();
  }
  
  public ActivityManagerService getService() {
    return mService;
  }
}
public <T extends SystemService> T startService(Class<T> serviceClass) {
  //通过反射创建AMS对象,会调到上面ActivityManagerService.Lifecycle构造方法
  Constructor<T> constructor = serviceClass.getConstructor(Context.class);
  service = constructor.newInstance(mContext);
  startService(service);
  return service;
}
// Services that should receive lifecycle events.
private final ArrayList<SystemService> mServices = new ArrayList<SystemService>();

public void startService(@NonNull final SystemService service) {
  // Register it.
  mServices.add(service);
  //开启服务
  service.onStart();
}

①创建AMS实例:new ActivityManagerService

public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) {
  mInjector = new Injector();
  //获取系统上下文环境
  mContext = systemContext;
  //获取当前ActivityThread线程
  mSystemThread = ActivityThread.currentActivityThread();
  //赋值mUiContext
  mUiContext = mSystemThread.getSystemUiContext();
  
  //创建Handler线程,用来处理handler消息
  mHandlerThread = new ServiceThread(TAG,
                THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
  mHandlerThread.start();
  mHandler = new MainHandler(mHandlerThread.getLooper());
  //处理ui相关msg的Handler
  mUiHandler = mInjector.getUiHandler(this);
  
  //初始化前台广播的队列,设置10s超时
  mFgBroadcastQueue = new BroadcastQueue(this, mHandler,
                "foreground", foreConstants, false);
  //初始化后台广播的队列,设置60s超时
  mBgBroadcastQueue = new BroadcastQueue(this, mHandler,
                "background", backConstants, true);
  //初始化离线广播的队列,设置60s超时
  mOffloadBroadcastQueue = new BroadcastQueue(this, mHandler,
                 "offload", offloadConstants, true);
  mBroadcastQueues[0] = mFgBroadcastQueue;
  mBroadcastQueues[1] = mBgBroadcastQueue;
  mBroadcastQueues[2] = mOffloadBroadcastQueue;
  
  //初始化管理Service的ActiveServices对象
  mServices = new ActiveServices(this);
  mProviderMap = new ProviderMap(this);
  mPackageWatchdog = PackageWatchdog.getInstance(mUiContext);
  mAppErrors = new AppErrors(mUiContext, this, mPackageWatchdog);
  //创建电池状态服务
   mBatteryStatsService = new BatteryStatsService(systemContext, systemDir,
                BackgroundThread.get().getHandler());
  mBatteryStatsService.getActiveStatistics().readLocked();
  mBatteryStatsService.scheduleWriteToDisk();
  mOnBattery = DEBUG_POWER ? true
    : mBatteryStatsService.getActiveStatistics().getIsOnBattery();
  mBatteryStatsService.getActiveStatistics().setCallback(this);
  mOomAdjProfiler.batteryPowerChanged(mOnBattery);
  
  //启动一个线程跟进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);
}

②启动AMS

private void start() {
  //移除所有的进程组
    removeAllProcessGroups();
  //启动Cpu进程
  mProcessCpuThread.start();
  //启动电池状态服务
  mBatteryStatsService.publish();
  mAppOpsService.publish(mContext);
  //创建本地服务并注册,将创建的本地服务放入本地服务集合完成注册
  LocalServices.addService(ActivityManagerInternal.class, new LocalService());
  
  //等待mProcessCpuThread完成初始化后,释放锁
  try {
    mProcessCpuInitLatch.await();
  } catch (InterruptedException e) {
    Slog.wtf(TAG, "Interrupted wait during start", e);
    Thread.currentThread().interrupt();
    throw new IllegalStateException("Interrupted wait during start");
  }
}

1)removeAllProcessGroups:移除所有的进程组
2)mProcessCpuThread.start():启动CpuTracker线程
3)mBatteryStatsService.publish():启动电池状态服务
4)LocalServices.addService(ActivityManagerInternal.class, new LocalService()):创建本地服务并放入本地服务集合

③将AMS注册到ServiceManager中 setSystemProcess

public void setSystemProcess() {
  try {
        //将AMS注册到ServiceManager中
    ServiceManager.addService(Context.ACTIVITY_SERVICE, this, /* allowIsolated= */ true,
                              DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO);
    //注册进程状态服务
    ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
    //注册内存Binder
    ServiceManager.addService("meminfo", new MemBinder(this), /* allowIsolated= */ false,
                              DUMP_FLAG_PRIORITY_HIGH);
    //注册图像信息Binder
    ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
    //注册数据库Binder 
    ServiceManager.addService("dbinfo", new DbBinder(this));
    if (MONITOR_CPU_USAGE) {
      //注册监控CPU使用状态Binder
      ServiceManager.addService("cpuinfo", new CpuBinder(this),
                                /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
    }
    //注册权限控制Binder
    ServiceManager.addService("permission", new PermissionController(this));
    //注册进程服务Binder
    ServiceManager.addService("processinfo", new ProcessInfoService(this));
        //查询并处理ApplicationInfo
    ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(
      "android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);
    //将Application信息配置到ActivityThread中
    mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());

    synchronized (this) {
      //创建并处理ProcessRecord
      ProcessRecord app = mProcessList.newProcessRecordLocked(info, info.processName,
                                                              false,
                                                              0,
                                                              new HostingRecord("system"));
      app.setPersistent(true);
      app.pid = MY_PID;
      app.getWindowProcessController().setPid(MY_PID);
      app.maxAdj = ProcessList.SYSTEM_ADJ;
      app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);
      mPidsSelfLocked.put(app);
      mProcessList.updateLruProcessLocked(app, false, null);
      updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE);
    }
  } catch (PackageManager.NameNotFoundException e) {
    throw new RuntimeException(
      "Unable to find android system package", e);
  }

  // Start watching app ops after we and the package manager are up and running.
  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);
                       }
                   }
              }
          });
}

1)添加了各种服务,如AMS
2)mSystemThread.installSystemApplicationInfo:最终调到LoadedApk,这是应用的基本信息

接着看startOtherServices

private void startOtherServices() {
  //AMS与WMS关联
  mActivityManagerService.setWindowManager(wm);
  //安装ContentProvider
  mActivityManagerService.installSystemProviders();
  //所有的服务已经准备就绪
  mActivityManagerService.systemReady(() -> {
    //启动系统UI
    startSystemUi(context, windowManagerF);
    //执行一系列服务的systemReady
    networkStatsF.systemReady();
    //...
  }
}

installSystemProviders

public final void installSystemProviders() {
    List<ProviderInfo> providers;
    synchronized (this) {
        //找到名为"system"的进程,就是setSystemProcess中创建的ProcessRecord对象
        ProcessRecord app = mProcessList.mProcessNames.get("system", SYSTEM_UID);
        providers = generateApplicationProvidersLocked(app);
        if (providers != null) {
            for (int i=providers.size()-1; i>=0; i--) {
                ProviderInfo pi = (ProviderInfo)providers.get(i);
                if ((pi.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
                    //移除非系统provider
                    Slog.w(TAG, "Not installing system proc provider " + pi.name
                            + ": not system .apk");
                    providers.remove(i);
                }
            }
        }
    }
    if (providers != null) {
        //安全所有的系统provider
        mSystemThread.installSystemProviders(providers);
    }

    synchronized (this) {
        mSystemProvidersInstalled = true;
    }
    mConstants.start(mContext.getContentResolver());
    //创建核心Settings Observer,用于监听Settings的改变
    mCoreSettingsObserver = new CoreSettingsObserver(this);
    mActivityTaskManager.installSystemProviders();
    //开发者权限
    mDevelopmentSettingsObserver = new DevelopmentSettingsObserver();
    SettingsToPropertiesMapper.start(mContext.getContentResolver());
    mOomAdjuster.initSettings();

    // Now that the settings provider is published we can consider sending
    // in a rescue party.
    RescueParty.onSettingsProviderPublished(mContext);

    //mUsageStatsService.monitorPackages();
}

1)installSystemProviders:安装系统Provider
2)new CoreSettingsObserver(this):创建CoreSettingsObserver,用于监听系统设置的改变

systemReady

public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) {
  //启动Launcher界面
  mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");
}

小结:

1、new SystemServer()创建了ActivityThread
2、SystemServer的run方法中:
1)通过createSystemContext方法创建系统上下文对象
2)在startBootstrapServices方法中调用构造方法对AMS进行初始化,start方法启动AMS
3)调用setSystemProcess将AMS注册到ServiceManager中
4)在startOtherServices中安装了系统Provider
5)调用systemReady启动Launcher界面

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容