Android系統(tǒng)啟動(五)-ActivityManagerService篇

ActivityManagerService(簡稱AMS)是Android系統(tǒng)的核心服務(wù)之一。它的主要作用是管理系統(tǒng)中所有應(yīng)用進程以及應(yīng)用進程中的四大組件。

AMS的啟動過程

接上篇SystemServer run( )方法,AMS的啟動過程主要包含在如下兩個方法中:

private void run() {
   ...
   startBootstrapServices();//創(chuàng)建并啟動AMS服務(wù),同時執(zhí)行AMS啟動后的一些初始化工作
   startOtherServices();// 進入下個階段的一些準備工作
   ...
}

接下來按這兩個方法來分析

一、startBootstrapServices( )

1.1 創(chuàng)建并啟動AMS服務(wù)
private void startBootstrapServices() {
   ...
   //啟動AMS服務(wù)
   mActivityManagerService = mSystemServiceManager.startService(
           ActivityManagerService.Lifecycle.class).getService();
   //設(shè)置AMS的系統(tǒng)服務(wù)管理器
  mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
   //設(shè)置AMS的APP安裝器
   mActivityManagerService.setInstaller(installer);
   //初始化AMS相關(guān)的PMS
   mActivityManagerService.initPowerManagement();
   ...
    //想ServiceManager注冊一系列服務(wù),并創(chuàng)建system_server對應(yīng)的ProcessRecord并初始化
   mActivityManagerService.setSystemProcess();
}

我們知道SystemServiceManager.startService是通過反射創(chuàng)建服務(wù)對象,并啟動。但是這里傳進去的是AMS的Lifecycle。Lifecycle是AMS中的一個靜態(tài)內(nèi)部類,它繼承SystemService,由它來代理處理AMS的的創(chuàng)建與啟動。

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;
   }
}

這樣SystemServiceManager間接通過調(diào)用Lifecycle創(chuàng)建并啟動了AMS服務(wù)。AMS是運行在system_server進程中的Framework服務(wù),經(jīng)過SystemServiceManager創(chuàng)建的服務(wù)會統(tǒng)一保存在隊列管理。

1.2、AMS初始化工作
1.2.1 ActivityManagerService的構(gòu)造方法:
public ActivityManagerService(Context systemContext) {
   mContext = systemContext;
   mFactoryTest = FactoryTest.getMode();//默認為FACTORY_TEST_OFF
   mSystemThread = ActivityThread.currentActivityThread();
   //創(chuàng)建名為"ActivityManager"的前臺線程,并獲取mHandler
   mHandlerThread = new ServiceThread(TAG, android.os.Process.THREAD_PRIORITY_FOREGROUND, false);
   mHandlerThread.start();
   mHandler = new MainHandler(mHandlerThread.getLooper());
   //通過UiThread類,創(chuàng)建名為"android.ui"的線程
   mUiHandler = new UiHandler();
   //前臺廣播接收器,在運行超過10s將放棄執(zhí)行
   mFgBroadcastQueue = new BroadcastQueue(this, mHandler,
           "foreground", BROADCAST_FG_TIMEOUT, false);
   //后臺廣播接收器,在運行超過60s將放棄執(zhí)行
   mBgBroadcastQueue = new BroadcastQueue(this, mHandler,
           "background", BROADCAST_BG_TIMEOUT, true);
   mBroadcastQueues[0] = mFgBroadcastQueue;
   mBroadcastQueues[1] = mBgBroadcastQueue;
   //創(chuàng)建ActiveServices,其中非低內(nèi)存手機mMaxStartingBackground為8
   mServices = new ActiveServices(this);
   mProviderMap = new ProviderMap(this);
   //創(chuàng)建目錄/data/system
   File dataDir = Environment.getDataDirectory();
   File systemDir = new File(dataDir, "system");
   systemDir.mkdirs();
   //創(chuàng)建服務(wù)BatteryStatsService
   mBatteryStatsService = new BatteryStatsService(systemDir, mHandler);
   mBatteryStatsService.getActiveStatistics().readLocked();
   ...
   //創(chuàng)建進程統(tǒng)計服務(wù),信息保存在目錄/data/system/procstats,
   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是第一個,也是唯一的一個開機過程中運行的用戶
   mStartedUsers.put(UserHandle.USER_OWNER, new UserState(UserHandle.OWNER, true));
   mUserLru.add(UserHandle.USER_OWNER);
   updateStartedUserArrayLocked();
   ...
   //CPU使用情況的追蹤器執(zhí)行初始化
   mProcessCpuTracker.init();
   ...
   mRecentTasks = new RecentTasks(this);
   // 創(chuàng)建ActivityStackSupervisor對象
   mStackSupervisor = new ActivityStackSupervisor(this, mRecentTasks);
   mTaskPersister = new TaskPersister(systemDir, mStackSupervisor, mRecentTasks);
   //創(chuàng)建名為"CpuTracker"的線程
   mProcessCpuThread = new Thread("CpuTracker") {
       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;
                 if (nextWriteDelay < nextCpuDelay) {
                     nextCpuDelay = nextWriteDelay;
                 }
                 if (nextCpuDelay > 0) {
                     mProcessCpuMutexFree.set(true);
                     this.wait(nextCpuDelay);
                 }
               }
             } catch (InterruptedException e) {
             }
             updateCpuStatsNow(); //更新CPU狀態(tài)
           } catch (Exception e) {
           }
         }
       }
   };
   ...
}

首先,創(chuàng)建了一個名為“ActivityManager”的消息循環(huán)線程,不斷地接收其他進程發(fā)給AMS的消息;并把該消息循環(huán)線程與MainHandler綁定,這樣,由MainHandler完成消息的具體處理。
然后,創(chuàng)建了一些服務(wù),并在/data/system目錄下創(chuàng)建該服務(wù)需要的文件或文件夾,具體如下:

服務(wù) 服務(wù)說明 文件 文件說明
BatteryStatsService 電池狀態(tài)管理 /data/system/batterystats.bin 記錄包括電壓在內(nèi)的各種電池信息
ProcessStatsService 進程狀態(tài)管理 /data/system/procstats 記錄各個進程的狀態(tài)信息
AppOpsService 應(yīng)用操作權(quán)限管理 /data/system/appops.xml 存儲各個app的權(quán)限設(shè)置和操作信息
1.2.2 ActivityManagerService.setSystemProcess

首先,向SystemServiceManager中添加了若干個服務(wù):

服務(wù) 服務(wù)說明
activity AMS服務(wù)本身
procstats 進程狀態(tài)管理
meminfo 獲取內(nèi)存信息
gfxinfo 監(jiān)控分析GPU profiling信息
dbinfo 數(shù)據(jù)庫相關(guān)服務(wù)
cpuinfo 獲取cpu相關(guān)信息
permission 權(quán)限控制相關(guān)服務(wù)

然后,調(diào)用PMS的getApplicationInfo接口,獲取名為”android”的應(yīng)用程序信息。包名為”android”的apk即/system/framework/framework-res.apk,里面保存著系統(tǒng)GUI美化的相關(guān)文件,包括圖標,彈出對話框的樣式,動作特效,界面布局等。調(diào)用installSystemApplicationInfo加載framework-res.apk文件。

接著,調(diào)用newProcessRecordLocked新建一個ProcessRecord 對象app。ProcessRecord用來描述一個進程的所有信息,包括該進程的所有activity和service等。在這里就是system_server(AMS就是在system_server進程中運行的)。創(chuàng)建后,對app的一些成員變量進行初始化,包括設(shè)置為常駐內(nèi)存運行;設(shè)置system_server的pid等。

最后,調(diào)用mProcessNames.put()將創(chuàng)建的ProcessRecord 對象app加入到ProcessMap< ProcessRecord >類型的成員變量mProcessNames中。這里,app.processName=“system”。

這樣,AMS就得到了system_server的ProcessRecord,以后AMS也可以管理system_server了。

二、startOtherServices( )

2.1 systemServer觸發(fā)的AMS準備工作:
private void startOtherServices() {
 ...
  //移除非系統(tǒng)的provider,安裝所有的系統(tǒng)provider,創(chuàng)建核心Settings Observer,用于監(jiān)控Settings的改變。
 mActivityManagerService.installSystemProviders();
 …
//保存WMS對象
mActivityManagerService.setWindowManager(wm);
 …
//系統(tǒng)啟動前的準備工作,啟動SystemUI和Home界面等
mActivityManagerService.systemReady(new Runnable() {...});
}
2.2 mActivityManagerService.systemReady()

主要分三個階段來講:

public void systemReady(final Runnable goingCallback) {
   before goingCallback.run()
   goingCallback.run()
   after goingCallback.run()
}
2.2.1 before goingCallback.run()
public void systemReady(final Runnable goingCallback){
   if (mSystemReady) {//首次為false,不進入
       if (goingCallback != null) {
           goingCallback.run();
       }
       return;
   }
   mLocalDeviceIdleController = LocalServices.getService(DeviceIdleController.LocalService.class);
   //用戶管理、最近任務(wù)、應(yīng)用程序操作權(quán)限管理相關(guān)驗證和準備工作。
   mUserController.onSystemReady();
   mRecentTasks.onSystemReadyLocked();
   mAppOpsService.systemReady();
   mSystemReady = true; //完成之后mSystemReady置為true
}
ArrayList<ProcessRecord> procsToKill = null;
synchronized(mPidsSelfLocked) {
   for (int i=mPidsSelfLocked.size()-1; i>=0; i--) {
       ProcessRecord proc = mPidsSelfLocked.valueAt(i);
        //非persistent進程,加入procsToKill
       if (!isAllowedWhileBooting(proc.info)){
           if (procsToKill == null) {
               procsToKill = new ArrayList<ProcessRecord>();
           }
           procsToKill.add(proc);
       }
   }
}
//殺掉procsToKill中的進程, 殺掉進程且不允許重啟
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");
       }
   }
   mProcessesReady = true;  //已經(jīng)為啟動進程做好準備
}
Slog.i(TAG, "System now ready");
EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_AMS_READY,
   SystemClock.uptimeMillis());
...
}
retrieveSettings();
final int currentUserId;
synchronized (this) {
   currentUserId = mUserController.getCurrentUserIdLocked();
   readGrantedUriPermissionsLocked();
 }
}

此階段主要工作總結(jié):

  • 在當前運行的進程中,查找在systemReady之前不允許啟動的進程,然后調(diào)用removeProcessLocked()終止該進程并釋放資源。
  • 讓系統(tǒng)和進程都處于ready狀態(tài) 即:
    mSystemReady = true;
    mProcessesReady = true;
    關(guān)于mProcessesReady的解讀:
    startProcessLocked()過程對于非persistent進程必須等待mProcessesReady = true才會真正創(chuàng)建進程,否則進程放入mProcessesOnHold隊列。 由此可見,mProcessesReady為沒有處于ready狀態(tài)之前則基本沒有其他進程。
2.2.2 goingCallback.run()

if (goingCallback != null) goingCallback.run();
這部分是回調(diào)到systemServer startOtherServices中完成的:

private void startOtherServices() {
mActivityManagerService.systemReady(new Runnable() {
   @Override
   public void run() {
       Slog.i(TAG, "Making services ready");
       mSystemServiceManager.startBootPhase(
               SystemService.PHASE_ACTIVITY_MANAGER_READY);
       Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "PhaseActivityManagerReady");
       Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartObservingNativeCrashes");
       try {
           mActivityManagerService.startObservingNativeCrashes();
       } catch (Throwable e) {
           reportWtf("observing native crashes", e);
       }
       Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
       if (!mOnlyCore) {
           Slog.i(TAG, "WebViewFactory preparation");
           Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "WebViewFactoryPreparation");
           mWebViewUpdateService.prepareWebViewInSystemServer();
           Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
       }
       Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartSystemUI");
       try {
           startSystemUi(context);
       } catch (Throwable e) {
           reportWtf("starting System UI", e);
       }
       Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
       Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "MakeNetworkScoreReady");
       try {
           if (networkScoreF != null) networkScoreF.systemReady();
       } catch (Throwable e) {
           reportWtf("making Network Score Service ready", e);
       }
       Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
       Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "MakeNetworkManagementServiceReady");
       try {
           if (networkManagementF != null) networkManagementF.systemReady();
       } catch (Throwable e) {
           reportWtf("making Network Managment Service ready", e);
       }
       Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
       Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "MakeNetworkStatsServiceReady");
       try {
           if (networkStatsF != null) networkStatsF.systemReady();
       } catch (Throwable e) {
           reportWtf("making Network Stats Service ready", e);
       }
       Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
       Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "MakeNetworkPolicyServiceReady");
       try {
           if (networkPolicyF != null) networkPolicyF.systemReady();
       } catch (Throwable e) {
           reportWtf("making Network Policy Service ready", e);
       }
       Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
       Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "MakeConnectivityServiceReady");
       try {
           if (connectivityF != null) connectivityF.systemReady();
       } catch (Throwable e) {
           reportWtf("making Connectivity Service ready", e);
       }
       Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
       Watchdog.getInstance().start();
       // It is now okay to let the various system services start their
       // third party code...
       Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
       Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "PhaseThirdPartyAppsCanStart");
       mSystemServiceManager.startBootPhase(
               SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);
       try {
           if (locationF != null) locationF.systemRunning();
       } catch (Throwable e) {
           reportWtf("Notifying Location Service running", e);
       }
       try {
           if (countryDetectorF != null) countryDetectorF.systemRunning();
       } catch (Throwable e) {
           reportWtf("Notifying CountryDetectorService running", e);
       }
       try {
           if (networkTimeUpdaterF != null) networkTimeUpdaterF.systemRunning();
       } catch (Throwable e) {
           reportWtf("Notifying NetworkTimeService running", e);
       }
       try {
           if (commonTimeMgmtServiceF != null) {
               commonTimeMgmtServiceF.systemRunning();
           }
       } catch (Throwable e) {
           reportWtf("Notifying CommonTimeManagementService running", e);
       }
       try {
           if (atlasF != null) atlasF.systemRunning();
       } catch (Throwable e) {
           reportWtf("Notifying AssetAtlasService running", e);
       }
       try {
           // TODO(BT) Pass parameter to input manager
           if (inputManagerF != null) inputManagerF.systemRunning();
       } catch (Throwable e) {
           reportWtf("Notifying InputManagerService running", e);
       }
       try {
           if (telephonyRegistryF != null) telephonyRegistryF.systemRunning();
       } catch (Throwable e) {
           reportWtf("Notifying TelephonyRegistry running", e);
       }
       try {
           if (mediaRouterF != null) mediaRouterF.systemRunning();
       } catch (Throwable e) {
           reportWtf("Notifying MediaRouterService running", e);
       }
       try {
           if (mmsServiceF != null) mmsServiceF.systemRunning();
       } catch (Throwable e) {
           reportWtf("Notifying MmsService running", e);
       }
       try {
           if (networkScoreF != null) networkScoreF.systemRunning();
       } catch (Throwable e) {
           reportWtf("Notifying NetworkScoreService running", e);
       }
       Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
   }
});
   }
}

此階段主要工作總結(jié):

  • startBootPhase:550(PHASE_ACTIVITY_MANAGER_READY),回調(diào)相應(yīng)onBootPhase()方法;
  • 啟動WebView;
  • 啟動systemui服務(wù);
  • startBootPhase:600(PHASE_THIRD_PARTY_APPS_CAN_START),回調(diào)相應(yīng)onBootPhase()方法;
  • 執(zhí)行一系列服務(wù)的systemReady方法;
  • 執(zhí)行一系列服務(wù)的systemRunning方法;
2.2.3 after goingCallback.run()
mSystemServiceManager.startUser(currentUserId);//回調(diào)所有SystemService的onStartUser()方法
public void systemReady(final Runnable goingCallback){
synchronized (this) {
    //啟動persistent進程
   startPersistentApps(PackageManager.MATCH_DIRECT_BOOT_AWARE);
   // Start up initial activity.
   mBooting = true;
   // Enable home activity for system user, so that the system can always boot
   if (UserManager.isSplitSystemUser()) {
       ComponentName cName = new ComponentName(mContext, SystemUserHomeActivity.class);
       try {
           AppGlobals.getPackageManager().setComponentEnabledSetting(cName,
                   [PackageManager.COMPONENT_ENABLED_STATE_ENABLED](http://PackageManager.COMPONENT_ENABLED_STATE_ENABLED), 0,
                   UserHandle.USER_SYSTEM);
       } catch (RemoteException e) {
           throw e.rethrowAsRuntimeException();
       }
   }
    //啟動桌面activity
   startHomeActivityLocked(currentUserId, "systemReady");
   try {
       if (AppGlobals.getPackageManager().hasSystemUidErrors()) {
           Slog.e(TAG, "UIDs on the system are inconsistent, you need to wipe your"
                   + " data partition or your device will be unstable.");
       mUiHandler.obtainMessage(SHOW_UID_ERROR_UI_MSG).sendToTarget();
       }
   } catch (RemoteException e) {
   }
   if (!Build.isBuildConsistent()) {
       Slog.e(TAG, "Build fingerprint is not consistent, warning user");
       mUiHandler.obtainMessage(SHOW_FINGERPRINT_ERROR_UI_MSG).sendToTarget();
   }
   long ident = Binder.clearCallingIdentity();
   try {
        //system發(fā)送廣播USER_STARTED
       Intent intent = new Intent(Intent.ACTION_USER_STARTED);
       intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
               | Intent.FLAG_RECEIVER_FOREGROUND);
       intent.putExtra(Intent.EXTRA_USER_HANDLE, currentUserId);
       broadcastIntentLocked(null, null, intent,
               null, null, 0, null, null, null, AppOpsManager.OP_NONE,
               null, false, false, MY_PID, Process.SYSTEM_UID,
               currentUserId);
       //system發(fā)送廣播USER_STARTING
       intent = new Intent(Intent.ACTION_USER_STARTING);
       intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
       intent.putExtra(Intent.EXTRA_USER_HANDLE, currentUserId);
       broadcastIntentLocked(null, null, intent,
               null, new IIntentReceiver.Stub() {
                   @Override
                   public void performReceive(Intent intent, int resultCode, String data,
                           Bundle extras, boolean ordered, boolean sticky, int sendingUser)
                           throws RemoteException {
                   }
               }, 0, null, null,
               new String[] {INTERACT_ACROSS_USERS}, AppOpsManager.OP_NONE,
               null, true, false, MY_PID, Process.SYSTEM_UID, UserHandle.USER_ALL);
   } catch (Throwable t) {
       Slog.wtf(TAG, "Failed sending first user broadcasts", t);
   } finally {
       Binder.restoreCallingIdentity(ident);
   }
   mStackSupervisor.resumeFocusedStackTopActivityLocked();
   mUserController.sendUserSwitchBroadcastsLocked(-1, currentUserId);
 }
}

此階段主要工作總結(jié):

  • 回調(diào)所有SystemService的onStartUser()方法;
  • 啟動persistent進程;
  • 啟動home Activity;
  • 發(fā)送廣播USER_STARTED和USER_STARTING;
  • 發(fā)送廣播USER_SWITCHED;

最后畫了個簡單時序圖總結(jié)下AMS啟動流程:

參考:
https://blog.csdn.net/u010753159/article/details/51581113
http://gityuan.com/2016/02/21/activity-manager-service/

系列文章:
Android系統(tǒng)啟動(一)-開篇
Android系統(tǒng)啟動(二)-Init篇
Android系統(tǒng)啟動(三)-Zygote篇
Android系統(tǒng)啟動(四)-SystemServer篇
Android系統(tǒng)啟動(五)-ActivityManagerService篇
Android系統(tǒng)啟動(六)-Launcher篇

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容