最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Android之AMS原理分析

2023-10-22 19:51 作者:Tim數(shù)據(jù)工程師  | 我要投稿

在學(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(); ? ?} ? ?@Override ? ?public void onStart() { ? ? ? ?mService.start(); ? ?} ? ?@Override ? ?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(); ? ? ? ?} ? ?} ? ?@Override ? ?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

@Overridepublic 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

@Overridepublic 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)程是通過什么通信的?


Android之AMS原理分析的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
营口市| 武鸣县| 望奎县| 五指山市| 绵竹市| 象山县| 古蔺县| 新宁县| 景泰县| 马边| 岳阳县| 青河县| 安乡县| 常州市| 沛县| 黔南| 麦盖提县| 遂川县| 曲麻莱县| 吴川市| 收藏| 嫩江县| 呈贡县| 龙泉市| 天镇县| 富川| 永昌县| 南投县| 岳普湖县| 北宁市| 四川省| 永平县| 哈巴河县| 平谷区| 新竹市| 乌苏市| 巴林右旗| 嵊泗县| 青田县| 莱西市| 利津县|