Android AMS啟動詳解
啟動
在Android系統(tǒng)啟動流程中中我們提到過,AMS是在system_service中啟動的,
//frameworks/base/services/java/corri/android/server/SystemServer.java //該方法主要啟動服務 ActivityManagerService,PowerManagerService,LightsService,DisplayManagerService,PackageManagerService,UserManagerService。 //設置 ActivityManagerService,啟動傳感器服務。 startBootstrapServices(); // 啟動引導服務 //該方法主要 //啟動服務 BatteryService 用于統(tǒng)計電池電量,需要 LightService。 //啟動服務 UsageStatsService,用于統(tǒng)計應用使用情況。 //啟動服務 WebViewUpdateService。 startCoreServices(); // 啟動核心服務 //該方法主要啟動服務 InputManagerService,WindowManagerService。 //等待 ServiceManager,SurfaceFlinger啟動完成,然后顯示啟動界面。 //啟動服務 StatusBarManagerService, //準備好 window, power, package, display 服務: // - WindowManagerService.systemReady() // - PowerManagerService.systemReady() // - PackageManagerService.systemReady() // - DisplayManagerService.systemReady() startOtherServices(); // 啟動其他服務
在啟動核心服務功能中,會進行AMS的啟動。
//frameworks/base/services/java/corri/android/server/SystemServer.java private void startBootstrapServices() { ... //這里會將ATMS注冊到ServiceManager中,然后調用ATMS的start方法。 ActivityTaskManagerService atm = mSystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class).getService(); //重點方法1。 注冊AMS服務,并返回對應的對象信息 mActivityManagerService = ActivityManagerService.Lifecycle.startService(mSystemServiceManager, atm); mActivityManagerService.setSystemServiceManager(mSystemServiceManager); //設置app安裝器 mActivityManagerService.setInstaller(installer); ... //重點方法2。 向ServiceManager中注冊Binder服務 mActivityManagerService.setSystemProcess(); }
這里我們只截取了AMS的啟動代碼。
這里會通過startService方法來進行AMS的注冊和啟動過程。我們看一下具體的ActivityManagerService中的startService方法
startService
// public static ActivityManagerService startService(SystemServiceManager ssm, ActivityTaskManagerService atm) { sAtm = atm; //調用SM的startService方法。創(chuàng)建AMS實例,并啟動AMS return ssm.startService(ActivityManagerService.Lifecycle.class).getService(); }
我們在ServiceManager的工作原理中講解過,systemServiceManager.startService方法會將對應的服務注冊到ServiceManager中,然后再調用start方法。
//frameworks/base/services/core/java/com/android/server/SystemServiceManager.java public SystemService startService(String className) { final Class<SystemService> serviceClass; serviceClass = (Class<SystemService>)Class.forName(className); return startService(serviceClass); } @SuppressWarnings("unchecked") public <T extends SystemService> T startService(Class<T> serviceClass) { try { final String name = serviceClass.getName(); final T service; try { //反射構造函數 Constructor<T> constructor = serviceClass.getConstructor(Context.class); //創(chuàng)建服務 service = constructor.newInstance(mContext); ... //啟動服務 startService(service); return service; } finally { Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } } public void startService(@NonNull final SystemService service) { // Register it. //注冊到ServiceManager列表中 mServices.add(service); //調用服務對應的onStart方法 service.onStart(); }
在啟動AMS的時候傳入的參數是:ActivityManagerService.Lifecycle.class。所以這里實際上會調用ActivityManagerService.Lifecycle 的構造方法,然后調用它的onStart方法
public static final class Lifecycle extends SystemService { private final ActivityTaskManagerService mService; public Lifecycle(Context context) { super(context); //創(chuàng)建AMS對象 mService = new ActivityManagerService(context, sAtm); } @Override public void onStart() { //調用AMS的start方法 mService.start(); } public ActivityManagerService getService() { //返回了AMS實例 return mService; } }
在Lifecycle對象的創(chuàng)建過程中,會創(chuàng)建AMS對象,然后通過start()方法進行了啟動。
AMS的創(chuàng)建
對于AMS對象的創(chuàng)建是通過構造函數來創(chuàng)建的。
//構造方法, public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) { //獲取系統(tǒng)的ActivityThread mSystemThread = ActivityThread.currentActivityThread(); //創(chuàng)建一個ServiceThread用來處理AMS接收到的命令 mHandlerThread = new ServiceThread(TAG,THREAD_PRIORITY_FOREGROUND, false /*allowIo*/); mHandlerThread.start(); mHandler = new MainHandler(mHandlerThread.getLooper()); mUiHandler = mInjector.getUiHandler(this); //低內存監(jiān)控 mLowMemDetector = new LowMemDetector(this); //初始化廣播隊列。這里包含了前臺廣播,后臺廣播等 mFgBroadcastQueue = new BroadcastQueue(this, mHandler, "foreground", foreConstants, false); mBgBroadcastQueue = new BroadcastQueue(this, mHandler, "background", backConstants, true); mOffloadBroadcastQueue = new BroadcastQueue(this, mHandler, "offload", offloadConstants, true); mBroadcastQueues[0] = mFgBroadcastQueue; mBroadcastQueues[1] = mBgBroadcastQueue; mBroadcastQueues[2] = mOffloadBroadcastQueue; //用于保存注冊的Service mServices = new ActiveServices(this); //map,用于保存注冊的ContentProvider mProviderMap = new ProviderMap(this); mPackageWatchdog = PackageWatchdog.getInstance(mUiContext); mAppErrors = new AppErrors(mUiContext, this, mPackageWatchdog); //創(chuàng)建 /data/system目錄 final File systemDir = SystemServiceManager.ensureSystemDir(); //創(chuàng)建進程統(tǒng)計服務,保存在/data/system/proccstats目錄中。 mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats")); //賦值ATM,并進行初始化 mActivityTaskManager = atm; mActivityTaskManager.initialize(mIntentFirewall, mPendingIntentController, DisplayThread.get().getLooper()); //CPU追蹤器進程 mProcessCpuThread = new Thread("CpuTracker") { @Override public void run() { ... } }; }
在AMS的構造函數中進行了一些初始化的東西:比如說啟動CPU監(jiān)控、啟動進程統(tǒng)計服務、啟動低內存監(jiān)控、初始化Service和ContentProvider對應的保存類等等。
start()
當AMS類創(chuàng)建完成之后,會調用start()方法。
private void start() { //移除所有的進程組 removeAllProcessGroups(); //啟動CpuTracker線程 mProcessCpuThread.start(); //啟動電池統(tǒng)計服務,能夠統(tǒng)計具體的應用的電池消耗,從而來進行一定的電量統(tǒng)計 mBatteryStatsService.publish(); //創(chuàng)建LocalService,并添加到LocalServices列表中 LocalServices.addService(ActivityManagerInternal.class, new LocalService()); mActivityTaskManager.onActivityManagerInternalAdded(); mUgmInternal.onActivityManagerInternalAdded(); mPendingIntentController.onActivityManagerInternalAdded(); }
在start方法中,會將在構造函數中創(chuàng)建的一些線程進行啟動。
setSystemProcess
在創(chuàng)建并啟動完成之后,會通過setSystemProcess方法來向ServiceManager中注冊一些系統(tǒng)相關的服務。
public void setSystemProcess() { try { //注冊ActivityService服務 ServiceManager.addService(Context.ACTIVITY_SERVICE, this, /* allowIsolated= */ true, DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO); //注冊進程狀態(tài)服務 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)); //注冊SQLite DB 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)); //獲取“android”應用的ApplicationInfo,并裝載到mSystemThread ApplicationInfo info = mContext.getPackageManager().getApplicationInfo("android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY); mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader()); //創(chuàng)建ProcessRecord維護進程的相關信息 synchronized (this) { ProcessRecord app = mProcessList.newProcessRecordLocked(info, info.processName,...); 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); } }
在這個方法中會設置一些系統(tǒng)進程,主要功能為:
- 注冊一些服務:activity、procstats、meminfo、gfxinfo、dbinfo、cpuinfo、permission、processinfo等。
- 獲取包名為“android”的應用的ApplicationInfo對象,并將該ApplicationInfo信息安裝設置到SystemThread(系統(tǒng)進程主線程)。即可以理解,系統(tǒng)也是一個特殊的應用。
- 創(chuàng)建ProcessRecord維護進程的相關信息,這里MY_PID即為SystemServer進程ID。
- 啟動 檢測應用運行和交互。
后續(xù)
當AMS創(chuàng)建并啟動之后,會有一系列的后續(xù)的工作需要處理。這些操作都是在**startOtherServices()**中去調用的
private void startOtherServices() { //注冊系統(tǒng)的ContentProvider信息 mActivityManagerService.installSystemProviders(); mActivityManagerService.setWindowManager(wm); mActivityManagerService.systemReady(() -> { ......//goingCallback }, BOOT_TIMINGS_TRACE_LOG); }
這里的主要功能是:
- 關鍵服務繼續(xù)進行初始化
- 已經啟動的進程,如果沒有FLAG_PERSISTENT標志位,則會被kill掉
- 運行goingCallBack
- 啟動launcher的Activity,即桌面應用。
這里繼續(xù)跟蹤一下goingCallBack的具體執(zhí)行內容。
goingCallBack
mActivityManagerService.systemReady(() -> { try { //啟動NativeCrash的監(jiān)測 mActivityManagerService.startObservingNativeCrashes(); } catch (Throwable e) { reportWtf("observing native crashes", e); } if (!mOnlyCore && mWebViewUpdateService != null) { webviewPrep = SystemServerInitThreadPool.get().submit(() -> { //啟動WebView相關 mWebViewUpdateService.prepareWebViewInSystemServer(); }, WEBVIEW_PREPARATION); } try { //啟動systemUI startSystemUi(context, windowManagerF); } catch (Throwable e) { reportWtf("starting System UI", e); } ... }
在這個里面會繼續(xù)進行一些初始化的工作:
- 啟動NativeCrash監(jiān)測
- 啟動WebView相關服務
- 啟動SystemUI
startHomeOnAllDisplays
該功能主要是進行桌面程序的啟動,和AMS的啟動流程關聯(lián)不大,在這里不再詳細進行解析。
總結:
- AMS是在SystemServer進程中進行創(chuàng)建并啟動的
- 在AMS的服務啟動過程中,通過構造函數進行了一些對象的創(chuàng)建和初始化工作(初Activity外其他3大組件的列表和調度對象的創(chuàng)建;內存、電池、權限、CPU等的監(jiān)控等等相關對象的創(chuàng)建),并且通過start()方法啟動服務(移除進程組、啟動CPU線程、權限注冊、電池服務等等)。
- AMS創(chuàng)建并將對應服務啟動之后,會通過setSystemProcess方法,將framework-res.apk的信息加入到SystemServer進程的LoadedApk中,并創(chuàng)建了SystemServer進程的ProcessRecord,加入到了mPidsSelfLocked,交給AMS來統(tǒng)一管理
- AMS啟動之后的后續(xù)工作,主要調用systemReady()和傳入的goingCallBack來執(zhí)行。主要是各種服務或者進程,等AMS啟動完成后需要進一步完成的工作以及系統(tǒng)相關的初始化。
- 桌面應用是在systemReady()方法中啟動,systemUI是在goingCallback中完成。
- 當桌面應用啟動完成以后,發(fā)送開機廣播ACTION_BOOT_COMPLETED。
以上就是Android AMS啟動詳解的詳細內容,更多關于Android AMS啟動的資料請關注腳本之家其它相關文章!
相關文章
Android 啟動模式FLAG_ACTIVITY_CLEAR_TOP案例詳解
這篇文章主要介紹了Android 啟動模式FLAG_ACTIVITY_CLEAR_TOP案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-08-08Android ListView下拉刷新上拉自動加載更多DEMO示例
這篇文章主要介紹了Android ListView下拉刷新上拉自動加載更多DEMO示例的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-07-07Android BroadcastReceiver接收收到短信的廣播
這篇文章主要為大家詳細介紹了Android BroadcastReceiver接收收到短信的廣播,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05Android ImageView隨手勢變化動態(tài)縮放圖片
這篇文章主要為大家詳細介紹了Android ImageView隨手勢變化動態(tài)縮放圖片的相關資料,感興趣的小伙伴們可以參考一下2016-05-05