Android之AMS原理分析
在學(xué)習(xí)android框架原理過程中,ams的原理非常重要,無論是在面試中還是在自己開發(fā)類庫過程中都會(huì)接觸到。
1 簡(jiǎn)述
ActivityManagerService是Android最核心的服務(wù),負(fù)責(zé)管理四大組件的啟動(dòng)、切換、調(diào)度等工作。由于AMS的功能和重要性,它是運(yùn)行在SystemServer進(jìn)程,客戶端不能直接訪問。但是可以通過ActivityManager類的getService方法獲取IActivityManager,然后與AMS通信。
2 AMS啟動(dòng)流程
init進(jìn)程
Android系統(tǒng)總共分為4層,從上到下為,應(yīng)用層、框架層、系統(tǒng)層、linux內(nèi)核層。整個(gè)系統(tǒng)啟動(dòng)時(shí),會(huì)先由各個(gè)廠商的引導(dǎo)程序拉起,加載一些資源,然后啟動(dòng)init進(jìn)程,掛載分區(qū),創(chuàng)建必要目錄,初始化日志系統(tǒng)和安全策略。最后解析init.rc文件,去啟動(dòng)zygote進(jìn)程。
zygote進(jìn)程
通過init進(jìn)程拉起zygote后,
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
? ?class main
? ?priority -20
? ?user root ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 用戶為root
? ?group root readproc reserved_disk
? ?socket zygote stream 660 root system
? ?socket usap_pool_primary stream 660 root system
? ?onrestart exec_background - system system -- /system/bin/vdc volume abort_fuse
? ?onrestart write /sys/power/state on
? ?onrestart restart audioserver
? ?onrestart restart cameraserver
? ?onrestart restart media
? ?onrestart restart media.tuner
? ?onrestart restart netd
? ?onrestart restart wificond
? ?task_profiles ProcessCapacityHigh MaxPerformance
? ?critical window=${zygote.critical_window.minute:-off} target=zygote-fatal
service zygote_secondary /system/bin/app_process32 -Xzygote /system/bin --zygote --socket-name=zygote_secondary --enable-lazy-preload
? ?class main
? ?priority -20
? ?user root
? ?group root readproc reserved_disk
? ?socket zygote_secondary stream 660 root system
? ?socket usap_pool_secondary stream 660 root system
? ?onrestart restart zygote
? ?task_profiles ProcessCapacityHigh MaxPerformance
會(huì)創(chuàng)建JavaVM,并注冊(cè)JNI
通過JNI調(diào)用ZygoteInit的main函數(shù)進(jìn)入Zygote的Java框架層,創(chuàng)建服務(wù)端Socket,預(yù)加載類和資源,并通過runSelectLoop函數(shù)等待如ActivityManagerService等的請(qǐng)求。
調(diào)用forkSystemServer 來啟動(dòng)SystemServer進(jìn)程,這樣系統(tǒng)的關(guān)鍵服務(wù)也會(huì)由SystemServer進(jìn)程啟動(dòng)起來。
SystemServer進(jìn)程
/**
* 進(jìn)程的入口點(diǎn)
*/public static void main(String[] args) { ? ?new SystemServer().run();
}private void run() {
? ?
? ?... ? ? ? ?
? ?// 啟動(dòng) AMS PowerManagerService PackageManagerService 等服務(wù)
? ?startBootstrapServices(t); ? ?// 啟動(dòng)了BatteryService UsageStatsService WebViewUpdateService
? ?startCoreServices(t); ? ?// CameraService AlarmManagerService VrManagerService
? ?startOtherServices(t); ? ?
? ?...
? ?
}
Zygote啟動(dòng)后fork的第一個(gè)進(jìn)程為SystemServer,這個(gè)進(jìn)程就會(huì)去啟動(dòng)一系列的服務(wù),AMS服務(wù)也是由這個(gè)進(jìn)程啟動(dòng)。
AMS 啟動(dòng)
private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
? ?t.traceBegin("startBootstrapServices"); ? ?// ...
? ?// Activity manager runs the show.
? ?// 創(chuàng)建并運(yùn)行AMS
? ?t.traceBegin("StartActivityManager"); ? ?// TODO: Might need to move after migration to WM.
? ?ActivityTaskManagerService atm = mSystemServiceManager.startService(
? ? ? ?ActivityTaskManagerService.Lifecycle.class).getService();
? ?mActivityManagerService = ActivityManagerService.Lifecycle.startService(
? ? ? ?mSystemServiceManager, atm);
? ?mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
? ?mActivityManagerService.setInstaller(installer);
? ?mWindowManagerGlobalLock = atm.getGlobalLock();
? ?t.traceEnd(); ? ?// ...
? ?t.traceEnd(); // startBootstrapServices}public static final class Lifecycle extends SystemService { ? ?private final ActivityManagerService mService; ? ?private static ActivityTaskManagerService sAtm; ? ?public Lifecycle(Context context) { ? ? ? ?super(context);
? ? ? ?mService = new ActivityManagerService(context, sAtm);
? ?} ? ?public static ActivityManagerService startService(
? ? ? ?SystemServiceManager ssm, ActivityTaskManagerService atm) {
? ? ? ?sAtm = atm; ? ? ? ?return ssm.startService(ActivityManagerService.Lifecycle.class).getService();
? ?} ? ?
? ?public void onStart() {
? ? ? ?mService.start();
? ?} ? ?
? ?public void onBootPhase(int phase) {
? ? ? ?mService.mBootPhase = phase; ? ? ? ?if (phase == PHASE_SYSTEM_SERVICES_READY) {
? ? ? ? ? ?mService.mBatteryStatsService.systemServicesReady();
? ? ? ? ? ?mService.mServices.systemServicesReady();
? ? ? ?} else if (phase == PHASE_ACTIVITY_MANAGER_READY) {
? ? ? ? ? ?mService.startBroadcastObservers();
? ? ? ?} else if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) {
? ? ? ? ? ?mService.mPackageWatchdog.onPackagesReady();
? ? ? ?}
? ?} ? ?
? ?public void onCleanupUser(int userId) {
? ? ? ?mService.mBatteryStatsService.onCleanupUser(userId);
? ?} ? ?public ActivityManagerService getService() { ? ? ? ?return mService;
? ?}
}public void startService(@NonNull final SystemService service) { ? ?// 注冊(cè)服務(wù)
? ?mServices.add(service); ? ?// 開啟服務(wù)
? ?long time = SystemClock.elapsedRealtime(); ? ?try {
? ? ? ?service.onStart();
? ?} catch (RuntimeException ex) { ? ? ? ?throw new RuntimeException("Failed to start service " + service.getClass().getName()
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? + ": onStart threw an exception", ex);
? ?}
? ?warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart");
}private void start() { ? ?// ...}
從代碼中可以看出在startBootstrapServices方法中,創(chuàng)建了ActivityManagerService服務(wù)對(duì)象,然后在startService方法中調(diào)用service.onStart(),也就是走Lifecycle中實(shí)現(xiàn)的方法,然后最終走到start(),啟動(dòng)服務(wù)。
3 AMS在啟動(dòng)App過程中的體現(xiàn)
fock新進(jìn)程
我們手機(jī)上的App都是在Launcher(就是個(gè)Actviity)中顯示的,點(diǎn)擊圖標(biāo)會(huì)觸發(fā)onClick收到點(diǎn)擊事件,然后走startActivitySafely方法,繼續(xù)往下走,會(huì)發(fā)現(xiàn)就是startActivity方法往后走的調(diào)用。
LauncherAppsService -> startActivityAsUser
ActivityTaskManagerService -> startActivityAsUser
ActivityStarter -> execute
ActivityStarter -> startActivityUnchecked
ActivityStarter -> startActivityInner
ActivityStack -> startActivityLocked
ActivityStack -> ensureActivitiesVisible
EnsureActivitiesVisibleHelper -> process
EnsureActivitiesVisibleHelper -> setActivityVisibilityState
ActivityRecord -> makeActiveIfNeeded
ActivityStack -> resumeTopActivityUncheckedLocked
ActivityStack -> resumeTopActivityInnerLocked
ActivityTaskManagerService -> startProcessAsync
ActivityManagerService -> startProcess
ActivityManagerService -> startProcessLocked
ProcessList -> startProcessLocked (指定啟動(dòng)進(jìn)程后,走android.app.ActivityThread main方法 : final String entryPoint = "android.app.ActivityThread";)
ProcessList -> startProcess
ZygoteProcess -> start
ZygoteProcess -> startViaZygote
zygoteSendArgsAndGetResult
attemptZygoteSendArgsAndGetResultprivate Process.ProcessStartResult attemptZygoteSendArgsAndGetResult(
? ?ZygoteState zygoteState, String msgStr) throws ZygoteStartFailedEx { ? ?try { ? ? ? ?final BufferedWriter zygoteWriter = zygoteState.mZygoteOutputWriter; ? ? ? ?final DataInputStream zygoteInputStream = zygoteState.mZygoteInputStream;
? ? ? ?zygoteWriter.write(msgStr);
? ? ? ?zygoteWriter.flush(); ? ? ? ?// Always read the entire result from the input stream to avoid leaving
? ? ? ?// bytes in the stream for future process starts to accidentally stumble
? ? ? ?// upon.
? ? ? ?Process.ProcessStartResult result = new Process.ProcessStartResult();
? ? ? ?result.pid = zygoteInputStream.readInt();
? ? ? ?result.usingWrapper = zygoteInputStream.readBoolean(); ? ? ? ?if (result.pid < 0) { ? ? ? ? ? ?throw new ZygoteStartFailedEx("fork() failed");
? ? ? ?} ? ? ? ?return result;
? ?} catch (IOException ex) {
? ? ? ?zygoteState.close();
? ? ? ?Log.e(LOG_TAG, "IO Exception while communicating with Zygote - "
? ? ? ? ? ? ?+ ex.toString()); ? ? ? ?throw new ZygoteStartFailedEx(ex);
? ?}
}
Launcher通知AMS啟動(dòng)APP的MainActivity,也就是清單文件設(shè)置啟動(dòng)的Activity
AMS記錄要啟動(dòng)的Activity信息,并且通知Launcher進(jìn)入pause狀態(tài)
Launcher進(jìn)入pause狀態(tài)后,通知AMS已經(jīng)paused了,可以啟動(dòng)app了
app未開啟過,所以會(huì)通過socket發(fā)送消息給AMS
AMS在SystemServer進(jìn)程,該進(jìn)程在啟動(dòng)時(shí),執(zhí)行ZygoteInit.main()后便進(jìn)入runSelectLoop()循環(huán)體內(nèi),當(dāng)有客戶端連接時(shí)便會(huì)執(zhí)行ZygoteConnection.runOnce()方法,再經(jīng)過層層調(diào)用后fork出新的應(yīng)用進(jìn)程(handleChildProc)
并且在新進(jìn)程中創(chuàng)建ActivityThread對(duì)象,執(zhí)行其中的main函數(shù)方法
ActivityThread
ActivityThread會(huì)做很多事,我們只分析和app啟動(dòng)與AMS相關(guān)的。
public static void main(String[] args) { ? ?// ...
? ?Looper.prepareMainLooper();
? ?ActivityThread thread = new ActivityThread(); ? ?// 綁定Application
? ?thread.attach(false, startSeq);
? ?Looper.loop(); ? ?// ...}private void attach(boolean system) {
? sCurrentActivityThread = this;
? mSystemThread = system; // false
? if (!system) { // true
? ? ? ... ? ? ? // 獲取 AMS,調(diào)用AMS的 attachApplication
? ? ? final IActivityManager mgr = ActivityManager.getService(); ? ? ? try {
? ? ? ? ? mgr.attachApplication(mAppThread);
? ? ? } catch (RemoteException ex) { ? ? ? ? ? throw ex.rethrowFromSystemServer();
? ? ? } ? ? ? // Watch for getting close to heap limit.
? ? ? ...
? } else { // 系統(tǒng)進(jìn)程處理邏輯
? ? ? ...
? }
? ...
}
AMS 處理綁定Application
public final void attachApplication(IApplicationThread thread, long startSeq) { ? ?if (thread == null) { ? ? ? ?throw new SecurityException("Invalid application interface");
? ?} ? ?synchronized (this) { ? ? ? ?int callingPid = Binder.getCallingPid(); ? ? ? ?final int callingUid = Binder.getCallingUid(); ? ? ? ?final long origId = Binder.clearCallingIdentity();
? ? ? ?attachApplicationLocked(thread, callingPid, callingUid, startSeq);
? ? ? ?Binder.restoreCallingIdentity(origId);
? ?}
}private final boolean attachApplicationLocked(IApplicationThread thread, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int pid) {
? ?ProcessRecord app; ? ?// 根據(jù)pid 獲取 對(duì)應(yīng) ProcessRecord
? ?// 新進(jìn)程的名字
? ?final String processName = app.processName;
? ?...
? ?thread.bindApplication(processName, appInfo, providerList, null, profilerInfo, ? ? ? ? ? ? ? ? ? ? ? ? ? null, null, null, testMode,
? ? ? ? ? ? ? ? ? ? ? ? ? mBinderTransactionTrackingEnabled, enableTrackAllocation,
? ? ? ? ? ? ? ? ? ? ? ? ? isRestrictedBackupMode || !normalMode, app.isPersistent(), ? ? ? ? ? ? ? ? ? ? ? ? ? new Configuration(app.getWindowProcessController().getConfiguration()),
? ? ? ? ? ? ? ? ? ? ? ? ? app.compat, getCommonServicesLocked(app.isolated),
? ? ? ? ? ? ? ? ? ? ? ? ? mCoreSettingsObserver.getCoreSettingsLocked(),
? ? ? ? ? ? ? ? ? ? ? ? ? buildSerial, autofillOptions, contentCaptureOptions,
? ? ? ? ? ? ? ? ? ? ? ? ? app.mDisabledCompatChanges);
? ?... ? ?//查找所有可運(yùn)行在該進(jìn)程中的服務(wù)
? ?//檢查這個(gè)進(jìn)程中是否有下一個(gè)廣播接收者
? ?//檢查這個(gè)進(jìn)程中是否有下一個(gè)備份代理
? ?//上述操作如果出現(xiàn)異常就殺死進(jìn)程
? ?...
? ?}
ActivityThread.bindApplication
public final void bindApplication(String processName, ApplicationInfo appInfo,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ProviderInfoList providerList, ComponentName instrumentationName,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ProfilerInfo profilerInfo, Bundle instrumentationArgs,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?IInstrumentationWatcher instrumentationWatcher,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?IUiAutomationConnection instrumentationUiConnection, int debugMode, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?boolean enableBinderTracking, boolean trackAllocation, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?boolean isRestrictedBackupMode, boolean persistent, Configuration config,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CompatibilityInfo compatInfo, Map services, Bundle coreSettings,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?String buildSerial, AutofillOptions autofillOptions,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ContentCaptureOptions contentCaptureOptions, long[] disabledCompatChanges) {
? ?...
? ?AppBindData data = new AppBindData();
? ?data.processName = processName;
? ?data.appInfo = appInfo;
? ?...
? ? ? ?sendMessage(H.BIND_APPLICATION, data);
}private void handleBindApplication(AppBindData data) {
? ?... ? ?// application oncreate
? ?mInstrumentation.callApplicationOnCreate(app);
}
啟動(dòng)MainActivity
App啟動(dòng)時(shí)我們通過fork Zygote進(jìn)程,創(chuàng)建了app進(jìn)程,并做了一些application的綁定等等操作。
這些處理好后,就可以繼續(xù)啟動(dòng)MainActivity。
ActivityStack -> resumeTopActivityInnerLocked
ActivityStackSupervisor -> startSpecificActivity
ActivityStackSupervisor -> realStartActivityLockedprivate boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) { ? ?// ...
? ?
? ?// Since the start-process is asynchronous, if we already know the process of next
? ?// activity isn't running, we can start the process earlier to save the time to wait
? ?// for the current activity to be paused.
? ?final boolean isTop = this == taskDisplayArea.getFocusedStack();
? ?mAtmService.startProcessAsync(next, false /* knownToBeDead */, isTop,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?isTop ? "pre-top-activity" : "pre-activity"); ? ?// ...
? ?mStackSupervisor.startSpecificActivity(next, true, true);
}boolean realStartActivityLocked(ActivityRecord r, WindowProcessController proc, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?boolean andResume, boolean checkConfig) throws RemoteException {
? ?mService.getLifecycleManager().scheduleTransaction(clientTransaction);
}// 通過aidl進(jìn)入app所在進(jìn)程// 啟動(dòng)MainActivityActivityThread -> scheduleTransaction
...
ActivityThread -> handleLaunchActivity
ActivityThread -> performLaunchActivity
4 重要的類
ActvityRecord
用來存儲(chǔ)activity的信息!
一個(gè)ActivityRecord對(duì)應(yīng)一個(gè)Activity,一個(gè)Activity可能會(huì)有多個(gè)
ActivityRecord
因?yàn)锳ctivity可以被多次啟動(dòng),這個(gè)主要取決于其啟動(dòng)模式。
ActivityStack
則是用來管理ActivityRecord的,包含了多個(gè)ActivityRecord。
ActivityStack
用來存儲(chǔ)activity,也就是我們常說的activity棧。
ActivityStackSupervisor
用來管理ActivityStack!
Instrumentation
負(fù)責(zé)調(diào)用Activity和Application生命周期。
5 總結(jié)
AMS負(fù)責(zé)四大組件的啟動(dòng),調(diào)度等工作,因?yàn)樵诓煌M(jìn)程,所以通信會(huì)基于binder或者socket。1、AMS是什么時(shí)候被初始化的?在手機(jī)開機(jī),SystemServer進(jìn)程啟動(dòng)后,就會(huì)啟動(dòng)初始化AMS。2、AMS與Zygote進(jìn)程是通過什么通信的?