深入分析AMS啟動(dòng)流程
前言
AMS(ActivityManagerService)Android的核心服務(wù)之一,對(duì)于framework各個(gè)核心服務(wù),如果不是專(zhuān)門(mén)去做framework開(kāi)發(fā),先了解其基本的流程機(jī)制,再慢慢深究;
今天我們就來(lái)學(xué)習(xí)下AMS
一、AMS功能概述
1、AMS介紹
- AMS是Android中最核心的服務(wù),主要負(fù)責(zé)系統(tǒng)中四大組件的啟動(dòng)、切換、調(diào)度及應(yīng)用進(jìn)程的管理和調(diào)度等工作,其職責(zé)與操作系統(tǒng)中的進(jìn)程管理和調(diào)度模塊相類(lèi)似,因此它在Android中非常重要;
- 組件狀態(tài)管理:包括四大組件的開(kāi)啟,關(guān)閉等一系列操作,如startActivity,startActivityAndWait,activityPaused,startService,stopService,removeContentProvider等;
- 組件狀態(tài)查詢(xún):查詢(xún)組件當(dāng)前運(yùn)行等情況。如getCallingActivity,getService等;
- Task相關(guān):包括removeTask,removeSubTask,moveTaskBackwards,moveTaskToFront等;
- AMS是通過(guò)ActivityStack及其他數(shù)據(jù)結(jié)構(gòu)來(lái)記錄,管理系統(tǒng)中的Activity及其他組件狀態(tài)的,并提供查詢(xún)功能的一個(gè)系統(tǒng)服務(wù);
2、AMS中重要的數(shù)據(jù)結(jié)構(gòu)
ActivityRecord:記錄了Activity的所有信息,因此它用來(lái)描述一個(gè)activity。它是在activity啟動(dòng)時(shí)被創(chuàng)建的,具體是在ActivityStarter的startActivity()中被創(chuàng)建的。它存儲(chǔ)的信息主要包括以下內(nèi)容:
- service:AMS的引用
- info:ActivityInfo,Activity中代碼和AndroidManifest設(shè)置的節(jié)點(diǎn)信息,如launchMode
- launcherFromPackage:啟動(dòng)activity的包名
- taskAffinity:activity希望歸屬的棧
- task:TaskRecord,Activity所在的TaskRecord
- app:ProcessRecord,ActivityRecord所在的應(yīng)用程序進(jìn)程
- state:ActivityState,當(dāng)前activity的狀態(tài)
- icon:Activity的圖標(biāo)資源和標(biāo)致符
- theme:Activity的主題資源標(biāo)識(shí)符
TaskRecord:用來(lái)描述一個(gè)Activity任務(wù)棧
- taskId:任務(wù)棧的唯一標(biāo)識(shí)符
- affinity:任務(wù)棧的傾向性
- Intent:啟動(dòng)這個(gè)activity的intent
- mActivites:ArrayList
,按照歷史順序排列的Activity記錄 - mStack:ActivityStack,當(dāng)前歸屬的ActivityStack
- mService:AMS的引用
ActivityStack:用來(lái)管理系統(tǒng)所有的Activity,內(nèi)部維護(hù)了Activity的所有狀態(tài),特殊狀態(tài)的Activity以及和Activity相關(guān)的列表等數(shù)據(jù);
二、AMS服務(wù)的啟動(dòng)流程詳解
1、startBootstrapServices
- private void startBootstrapServices() {
- // Activity manager runs the show.
- mActivityManagerService = mSystemServiceManager.startService(
- ActivityManagerService.Lifecycle.class).getService();
- mActivityManagerService.setSystemProcess();
- ……
- mActivityManagerService.installSystemProviders();
- ……
- mActivityManagerService.systemReady(new Runnable() {
- @Override
- public void run() {
- Slog.i(TAG, "Making services ready");
- mSystemServiceManager.startBootPhase(
- SystemService.PHASE_ACTIVITY_MANAGER_READY);
- try {
- mActivityManagerService.startObservingNativeCrashes();
- } catch (Throwable e) {
- reportWtf("observing native crashes", e);
- }
SystemServer中關(guān)于AMS啟動(dòng)時(shí)的幾個(gè)關(guān)鍵方法,主要分為4個(gè)步驟
- 創(chuàng)建AMS對(duì)象,并啟動(dòng)服務(wù)
- 將AMS所在的系統(tǒng)進(jìn)程,添加到進(jìn)程管理中去
- 為系統(tǒng)進(jìn)程安裝ContentProvider對(duì)象
- 在systemReady方法中做善后操作
- 一個(gè)一個(gè)的來(lái)看先這些方法的作用,這些方法就是AMS的啟動(dòng)和初始化過(guò)程;
2、ActivityManagerService
啟動(dòng)ActivityManagerService的方法
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
AMS服務(wù)同樣是通過(guò)SystemServiceManager來(lái)啟動(dòng)的,那我們首先來(lái)看ActivityManagerService.Lifecycle的構(gòu)造方法,然后在來(lái)看它的Start函數(shù);
Lifecycle的構(gòu)造方法中很簡(jiǎn)單就是構(gòu)造一個(gè)AMS的對(duì)象
mService = new ActivityManagerService(context);
創(chuàng)建AMS對(duì)象的時(shí)候需要傳遞一個(gè)Context作為參數(shù),那這個(gè)mSystemContext是就是上面創(chuàng)建的系統(tǒng)Context;
接著看AMS的構(gòu)造方法;
- public ActivityManagerService(Context systemContext) {
- //系統(tǒng)的context
- mContext = systemContext;
- //獲得系統(tǒng)的ActivityThread
- mSystemThread = ActivityThread.currentActivityThread();
- //創(chuàng)建一個(gè)HandlerThread用來(lái)處理AMS接收的命令
- mHandlerThread = new ServiceThread(TAG,
- android.os.Process.THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
- mHandlerThread.start();
- mHandler = new MainHandler(mHandlerThread.getLooper());
- mUiHandler = new UiHandler();
- //初始化廣播的隊(duì)列
- 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;
- //初始化Service相關(guān)的容器
- mServices = new ActiveServices(this);
- //初始化Provider相關(guān)的Map,里面保存了注冊(cè)的ContentProvider
- mProviderMap = new ProviderMap(this);
- //初始化并創(chuàng)建data/system/目錄
- File dataDir = Environment.getDataDirectory();
- File systemDir = new File(dataDir, "system");
- systemDir.mkdirs();
- //初始化電量統(tǒng)計(jì)服務(wù)相關(guān)的信息
- mBatteryStatsService = new BatteryStatsService(systemDir, mHandler);
- mBatteryStatsService.getActiveStatistics().readLocked();
- mBatteryStatsService.scheduleWriteToDisk();
- mOnBattery = DEBUG_POWER ? true
- : mBatteryStatsService.getActiveStatistics().getIsOnBattery();
- mBatteryStatsService.getActiveStatistics().setCallback(this);
- //初始化系統(tǒng)統(tǒng)計(jì)服務(wù),用于統(tǒng)計(jì)系統(tǒng)的運(yùn)行信息
- 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"));
- //創(chuàng)建系統(tǒng)的第一個(gè)user,userID為0,該用戶(hù)具有管理員權(quán)限
- mStartedUsers.put(UserHandle.USER_OWNER, new UserState(UserHandle.OWNER, true));
- mUserLru.add(UserHandle.USER_OWNER);
- updateStartedUserArrayLocked();
- //獲取opengle的版本
- GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version",
- ConfigurationInfo.GL_ES_VERSION_UNDEFINED);
- //初始化字體語(yǔ)言等配置信息
- mConfiguration.setToDefaults();
- mConfiguration.setLocale(Locale.getDefault());
- ……;
- mRecentTasks = new RecentTasks(this);
- //初始化StackSupervisor,該類(lèi)是Activity啟動(dòng)和調(diào)度的核心類(lèi)
- mStackSupervisor = new ActivityStackSupervisor(this, mRecentTasks);
- mTaskPersister = new TaskPersister(systemDir, mStackSupervisor, mRecentTasks);
- AMS的構(gòu)造方法主要是在做一些初始化的先關(guān)操作;
- 保存了自己的運(yùn)行環(huán)境的Context和ActivityThread;
- AMS負(fù)責(zé)調(diào)度四大組件,所以會(huì)初始化broadcast,service和contentProvider相關(guān)的變量,接著初始化了電量統(tǒng)計(jì)服務(wù),創(chuàng)建了系統(tǒng)的第一個(gè)用戶(hù),初始化了基本的配置信息,還創(chuàng)建了Activity調(diào)度的核心類(lèi),因?yàn)锳ctivity調(diào)度比較復(fù)雜,Activity相關(guān)的信息初始化會(huì)在ActivityStackSupervisor中;
3、start
AMS的start方法。
- private void start() {
- mProcessCpuThread.start();
- mBatteryStatsService.publish(mContext);
- LocalServices.addService(ActivityManagerInternal.class, new LocalService());
- }
- AMS的start方法很簡(jiǎn)單,只是啟動(dòng)了幾個(gè)服務(wù),并把AMS服務(wù)自己保存到localService中供程序內(nèi)部調(diào)用;
- AMS的構(gòu)造方法和start方法中做了AMS服務(wù)一些變量的初始化和相關(guān)服務(wù)的初始化。接著看下一個(gè)重要的方法setSystemProcess;
4、setSystemProcess
ActivityManagerService的setSystemProcess方法
- public void setSystemProcess() {
- try {
- //將AMS注冊(cè)到ServiceManager中
- ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);
- //注冊(cè)其他服務(wù)到ServiceMananger中
- ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
- ServiceManager.addService("meminfo", new MemBinder(this));
- ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
- ServiceManager.addService("dbinfo", new DbBinder(this));
- if (MONITOR_CPU_USAGE) {
- ServiceManager.addService("cpuinfo", new CpuBinder(this));
- }
- //注冊(cè)權(quán)限服務(wù)到ServiceMananger中
- ServiceManager.addService("permission", new PermissionController(this));
- ServiceManager.addService("processinfo", new ProcessInfoService(this));
- //從PMS中查詢(xún)包名為android的application,即framework-res的Application信息
- ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(
- "android", STOCK_PM_FLAGS);
- //將application信息配置到開(kāi)始創(chuàng)建的activityThread中
- mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());
- synchronized (this) {
- //創(chuàng)建了一個(gè)ProcessRecord對(duì)象,該對(duì)象中保存著系統(tǒng)ongoing服務(wù)的進(jìn)程信息
- ProcessRecord app = newProcessRecordLocked(info, info.processName, false, 0);
- app.persistent = true;
- app.pid = MY_PID;
- app.maxAdj = ProcessList.SYSTEM_ADJ;
- app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);
- synchronized (mPidsSelfLocked) {
- 然后將系統(tǒng)進(jìn)程的processRecord對(duì)象也添加到mPidsSelfLocked集合中,和普通應(yīng)用的進(jìn)程一樣,接收AMS的管理調(diào)度
- mPidsSelfLocked.put(app.pid, app);
- }
- //更細(xì)進(jìn)程管理的調(diào)度信息
- updateLruProcessLocked(app, false, null);
- updateOomAdjLocked();
- }
- setSystemProcess方法中,首先將自己AMS服務(wù)注冊(cè)到了ServiceManager中,然后又注冊(cè)了權(quán)限服務(wù)等其他的系統(tǒng)服務(wù);
- 通過(guò)先前創(chuàng)建的Context,得到PMS服務(wù),檢索framework-res的Application信息,然后將它配置到系統(tǒng)的ActivityThread中;
- 為了能讓AMS同樣可以管理調(diào)度系統(tǒng)進(jìn)程,也創(chuàng)建了一個(gè)關(guān)于系統(tǒng)進(jìn)程的ProcessRecord對(duì)象,ProcessRecord對(duì)象保存一個(gè)進(jìn)程的相關(guān)信息;
- 然后將它保存到mPidsSelfLocked集合中方便管理;
- AMS具體是如何將檢索到的framework-res的application信息,配置到ActivityThread中的,需要繼續(xù)分析ActivityThread的installSystemApplicationInfo方法;
接著看installSystemApplicationInfo方法
- public void installSystemApplicationInfo(ApplicationInfo info, ClassLoader classLoader) {
- synchronized (this) {
- getSystemContext().installSystemApplicationInfo(info, classLoader);
- }
- }
這個(gè)方法中最終調(diào)用上面創(chuàng)建的SystemContext的installSystemApplication方法,那就接著看ConxtextImpl的installSystemApplication方法。
- void installSystemApplicationInfo(ApplicationInfo info, ClassLoader classLoader) {
- mPackageInfo.installSystemApplicationInfo(info, classLoader);
- }
- 它有最終調(diào)用了mPackageInfo的installSystemApplication方法,mPackageInfo就是在創(chuàng)建Context對(duì)象的時(shí)候傳進(jìn)來(lái)的LoadedApk,里面保存了一個(gè)應(yīng)用程序的基本信息;
- setSystemProcess主要就是設(shè)置系統(tǒng)集成的一些信息,在這里設(shè)置了系統(tǒng)進(jìn)程的Application信息,創(chuàng)建了系統(tǒng)進(jìn)程的ProcessRecord對(duì)象將其保存在進(jìn)程集合中,方便AMS管理調(diào)度;
5、installSystemProvider
- ActivityManagerService的installSystemProvider方法;
- Android系統(tǒng)中有很多配置信息都需要保存,這些信息是保存在SettingsProvider中,而這個(gè)SettingsProvider也是運(yùn)行在SystemServer進(jìn)程中的,由于SystemServer進(jìn)程依賴(lài)SettingsProvider,放在一個(gè)進(jìn)程中可以減少進(jìn)程間通信的效率損失;
- 下面就來(lái)分析下如何將SettingsProvider.apk也加載到SystemServer進(jìn)程中;
- public final void installSystemProviders() {
- List<ProviderInfo> providers;
- synchronized (this) {
- //找到名稱(chēng)為”System”的進(jìn)程,就是上一步創(chuàng)建的processRecord對(duì)象
- ProcessRecord app = mProcessNames.get("system", Process.SYSTEM_UID);
- //找到所有和system進(jìn)程相關(guān)的ContentProvider
- providers = generateApplicationProvidersLocked(app);
- if (providers != null) {
- for (int i=providers.size()-1; i>=0; i--) {
- ProviderInfo pi = (ProviderInfo)providers.get(i);
- //再次確認(rèn)進(jìn)程為system的provider,把不是該進(jìn)程provider移除
- if ((pi.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
- Slog.w(TAG, "Not installing system proc provider " + pi.name
- + ": not system .apk");
- providers.remove(i);
- }
- }
- }
- }
- if (providers != null) {
- //把provider安裝到系統(tǒng)的ActivityThread中
- mSystemThread.installSystemProviders(providers);
- }
- mCoreSettingsObserver = new CoreSettingsObserver(this);
- }
找到名稱(chēng)為system的進(jìn)程對(duì)象,就是SystemServer進(jìn)程,然后根據(jù)進(jìn)程對(duì)象去查詢(xún)所有有關(guān)的ContentProvider,調(diào)用系統(tǒng)進(jìn)程的主線程ActivityThread安裝所有相關(guān)的ContentProvider,具體是如何查找相關(guān)的contentProvider和如何安裝ContentProvider到系統(tǒng)主線程的,接著分析下面兩個(gè)方法;
- private final List<ProviderInfo> generateApplicationProvidersLocked(ProcessRecord app) {
- List<ProviderInfo> providers = null;
- try {
- //調(diào)用PMS根據(jù)進(jìn)程ID和進(jìn)程名稱(chēng)來(lái)查詢(xún)Provider
- ParceledListSlice<ProviderInfo> slice = AppGlobals.getPackageManager().
- queryContentProviders(app.processName, app.uid,
- STOCK_PM_FLAGS | PackageManager.GET_URI_PERMISSION_PATTERNS);
- providers = slice != null ? slice.getList() : null;
- } catch (RemoteException ex) {
- }
- int userId = app.userId;
- if (providers != null) {
- int N = providers.size();
- for (int i=0; i<N; i++) {
- ProviderInfo cpi =
- (ProviderInfo)providers.get(i);
- ……
- ComponentName comp = new ComponentName(cpi.packageName, cpi.name);
- //從AMS管理的contentProvider列表中查詢(xún)對(duì)應(yīng)的provider
- ContentProviderRecord cpr = mProviderMap.getProviderByClass(comp, userId);
- if (cpr == null) {
- //如果AMS的Provider列表中沒(méi)有對(duì)應(yīng)的Provider實(shí)例,就根據(jù)查詢(xún)的provider信息,創(chuàng)建一個(gè)對(duì)象保存到隊(duì)列中
- cpr = new ContentProviderRecord(this, cpi, app.info, comp, singleton);
- mProviderMap.putProviderByClass(comp, cpr);
- }
- //同時(shí)將provider保存到processRecord對(duì)象的pubProviders列表中
- app.pubProviders.put(cpi.name, cpr);
- ……
- }
- }
- return providers;
- }
- 這個(gè)方法就是從PMS中查詢(xún)和SystemServer進(jìn)程相關(guān)的Provider,也就是SettingsProvder,然后將它保存到AMS的contentProvider列表中;
- 同時(shí)也將它保存到系統(tǒng)進(jìn)程對(duì)象ProcessRecord的變量pubProviders列表中,保存到AMS的provider列表中是因?yàn)锳MS需要管理所有的ContentProvder;
- 保存到進(jìn)程對(duì)象的pubProviders列表中是因?yàn)椋總€(gè)ContentProvider都需要對(duì)應(yīng)到一個(gè)進(jìn)程中去;
- 接著看如何將SettingsProvider安裝到系統(tǒng)的主進(jìn)程中去;
- private void installContentProviders(
- Context context, List<ProviderInfo> providers) {
- ……
- for (ProviderInfo cpi : providers) {
- //通過(guò)installProvider方法把provider封裝成一個(gè)ContentProviderHolder對(duì)象,有利于進(jìn)程間傳輸
- IActivityManager.ContentProviderHolder cph = installProvider(context, null, cpi,
- false /*noisy*/, true /*noReleaseNeeded*/, true /*stable*/);
- if (cph != null) {
- cph.noReleaseNeeded = true;
- results.add(cph);
- }
- }
- try {
- //將上面得到的contentProviderHolder對(duì)象發(fā)布到AMS服務(wù),getApplicationThread代表本地進(jìn)程的一個(gè)binder對(duì)象,binder對(duì)象可跨進(jìn)程傳輸,它在AMS中對(duì)應(yīng)一個(gè)ProcessRecord.
- ActivityManagerNative.getDefault().publishContentProviders(
- getApplicationThread(), results);
- ……
- }
- 該方法將得到的contentProvider對(duì)象封裝成了contentProviderHolder對(duì)象,其實(shí)就是Binder對(duì)象,這樣就可以進(jìn)程間傳輸了,然后跨進(jìn)程調(diào)用AMS服務(wù)注冊(cè)Provider;
- AMS負(fù)責(zé)管理ContentProvider,只有將ContentProvider注冊(cè)到AMS服務(wù)其他進(jìn)程才能訪問(wèn);
- 接著看AMS如何注冊(cè)Provider;
6、publishContentProviders
- public final void publishContentProviders(IApplicationThread caller,
- List<ContentProviderHolder> providers) {
- ……
- //根據(jù)調(diào)用者的進(jìn)程得到相應(yīng)的processRecord對(duì)象,就是系統(tǒng)進(jìn)程的ProcessRecord
- final ProcessRecord r = getRecordForAppLocked(caller);
- ……
- final int N = providers.size();
- for (int i = 0; i < N; i++) {
- //ActivityThread客戶(hù)端傳過(guò)來(lái)的provider src
- ContentProviderHolder src = providers.get(i);
- //根據(jù)src provider name得到一開(kāi)始保存的進(jìn)程中保存的ProciderRecord
- ContentProviderRecord dst = r.pubProviders.get(src.info.name);
- if (dst != null) {
- ComponentName comp = new ComponentName(dst.info.packageName, dst.info.name);
- //按類(lèi)將它保存在mProviderMap中
- mProviderMap.putProviderByClass(comp, dst);
- String names[] = dst.info.authority.split(";");
- for (int j = 0; j < names.length; j++) {
- //按authority保存在mProviderMap中
- mProviderMap.putProviderByName(names[j], dst);
- }
- ……
- }
- AMS的注冊(cè)服務(wù)就是根據(jù)參數(shù)傳過(guò)來(lái)的provider信息,找到原先進(jìn)程中pubProviders列表中保存的ContentProviderRecord,然后將它分別以類(lèi)為key保存在mProviderMap中,和以authority為key保存在mProviderMap中;
- 即AMS提供了多種方案來(lái)查找一個(gè)ContentProvider,一種是通過(guò)authority來(lái)查找,一種是指明CompomentName來(lái)查找;
- 此刻位置一個(gè)SettingsProvider就正式注冊(cè)到SystemServer進(jìn)程中了,所以可以看出installSystemProvider方法的主要工作就是按照普通進(jìn)程類(lèi)似的方式,將SettingsProvider注冊(cè)到系統(tǒng)進(jìn)程中,方便系統(tǒng)進(jìn)程對(duì)settings的配置數(shù)據(jù)進(jìn)行調(diào)用;
7、systemReady
ActivityManagerService的systemReady方法
- public void systemReady(final Runnable goingCallback) {
- synchronized(this) {
- //初始化Doze模式的controller
- mLocalDeviceIdleController
- = LocalServices.getService(DeviceIdleController.LocalService.class);
- //重置RecentTasks
- mRecentTasks.clear();
- mRecentTasks.addAll(mTaskPersister.restoreTasksLocked());
- mRecentTasks.cleanupLocked(UserHandle.USER_ALL);
- mTaskPersister.startPersisting();
- ……
- //設(shè)置systemReady為true
- mSystemReady = true;
- }
- ArrayList<ProcessRecord> procsToKill = null;
- //收集那些在AMS之前啟動(dòng)的進(jìn)程
- synchronized(mPidsSelfLocked) {
- for (int i=mPidsSelfLocked.size()-1; i>=0; i--) {
- ProcessRecord proc = mPidsSelfLocked.valueAt(i);
- if (!isAllowedWhileBooting(proc.info)){
- if (procsToKill == null) {
- procsToKill = new ArrayList<ProcessRecord>();
- }
- procsToKill.add(proc);
- }
- }
- }
- //將那些在AMS之前啟動(dòng)的進(jìn)程殺死,有的進(jìn)程不能再AMS之前啟動(dòng)
- synchronized(this) {
- if (procsToKill != null) {
- for (int i=procsToKill.size()-1; i>=0; i--) {
- ProcessRecord proc = procsToKill.get(i);
- Slog.i(TAG, "Removing system update proc: " + proc);
- removeProcessLocked(proc, true, false, "system update done");
- }
- }
- }
- //從settingsProvider的設(shè)置總初始化部分變量
- retrieveSettings();
- //調(diào)用callback方法,該方法在systemServer代碼中實(shí)現(xiàn)
- if (goingCallback != null) goingCallback.run();
- //查詢(xún)那些persistent為1的application,并啟動(dòng)他們所在的進(jìn)程
- List apps = AppGlobals.getPackageManager().
- getPersistentApplications(STOCK_PM_FLAGS);
- if (apps != null) {
- int N = apps.size();
- int i;
- for (i=0; i<N; i++) {
- ApplicationInfo info
- = (ApplicationInfo)apps.get(i);
- if (info != null &&
- !info.packageName.equals("android")) {
- addAppLocked(info, false, null /* ABI override */);
- }
- }
- //啟動(dòng)HomeActivity,也就是launcher程序
- mBooting = true;
- startHomeActivityLocked(mCurrentUserId, "systemReady");
- ……
- }
- }
SystemReady方法也是比較長(zhǎng),大致可以分為:
- 第一:在systemReady的時(shí)候初始化了deviceIdleController等對(duì)象
- 第二:移除并殺死了那些不該在AMS之前啟動(dòng)的進(jìn)程
- 第三:執(zhí)行了參數(shù)傳入的回調(diào)函數(shù)
- 第四:?jiǎn)?dòng)了Launcer界面
- 第五:?jiǎn)?dòng)那些persistent配置為1的進(jìn)程;
- 再來(lái)看些systemReady參數(shù)的回調(diào)函數(shù)做了什么工作.
- try {
- //ams開(kāi)始監(jiān)聽(tīng)native層的crash信息
- mActivityManagerService.startObservingNativeCrashes();
- } catch (Throwable e) {
- reportWtf("observing native crashes", e);
- }
- //初始化webVew
- WebViewFactory.prepareWebViewInSystemServer();
- try {
- //啟動(dòng)systemUI
- startSystemUi(context);
- } catch (Throwable e) {
reportWtf("starting System UI", e);
- }
- try {
- //調(diào)用其他服務(wù)的systemready方法
- if (networkScoreF != null) networkScoreF.systemReady();
- } catch (Throwable e) {
- reportWtf("making Network Score Service ready", e);
- }
這個(gè)回調(diào)函數(shù)中主要工作就是啟動(dòng)systemUI并調(diào)用其他服務(wù)的systemReady方法,SystemReady函數(shù)完成了系統(tǒng)就緒的必要的工作,啟動(dòng)了HomeActivity和SystemUI,然后Android系統(tǒng)就全部啟動(dòng)了;
總結(jié)
AMS服務(wù)啟動(dòng)主要分為幾個(gè)步驟:
- 調(diào)用AMS的構(gòu)造方法和start方法,對(duì)AMS必要的內(nèi)容進(jìn)行初始化;
- 將函數(shù)AMS注冊(cè)到ServiceManager中,同時(shí)對(duì)systemServer進(jìn)程也創(chuàng)建了一個(gè)ProcessRecord對(duì)象,并設(shè)置Context的appliation為framework-res的application對(duì)象;
- 將settingsProvider加載到系統(tǒng)進(jìn)程systemServer中;
- 調(diào)用systemReady方法做一些啟動(dòng)前的就緒工作,并啟動(dòng)了HomeActivity和SystemUI;
本文轉(zhuǎn)載自微信公眾號(hào)「Android開(kāi)發(fā)編程」