色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

Android AMS啟動詳解

瀏覽:6日期:2022-09-20 09:33:44
啟動

在Android系統啟動流程中中我們提到過,AMS是在system_service中啟動的,

//frameworks/base/services/java/corri/android/server/SystemServer.java//該方法主要啟動服務 ActivityManagerService,PowerManagerService,LightsService,DisplayManagerService,PackageManagerService,UserManagerService。//設置 ActivityManagerService,啟動傳感器服務。startBootstrapServices(); // 啟動引導服務//該方法主要//啟動服務 BatteryService 用于統計電池電量,需要 LightService。//啟動服務 UsageStatsService,用于統計應用使用情況。//啟動服務 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方法。創建AMS實例,并啟動AMS return ssm.startService(ActivityManagerService.Lifecycle.class).getService(); }

我們在ServiceManager的工作原理中講解過,systemServiceManager.startService方法會將對應的服務注冊到ServiceManager中,然后再調用start方法。

//frameworks/base/services/core/java/com/android/server/SystemServiceManager.javapublic 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); //創建服務 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); //創建AMS對象 mService = new ActivityManagerService(context, sAtm); } @Override public void onStart() { //調用AMS的start方法 mService.start(); } public ActivityManagerService getService() { //返回了AMS實例 return mService; } }

在Lifecycle對象的創建過程中,會創建AMS對象,然后通過start()方法進行了啟動。

AMS的創建

對于AMS對象的創建是通過構造函數來創建的。

//構造方法, public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) { //獲取系統的ActivityThread mSystemThread = ActivityThread.currentActivityThread(); //創建一個ServiceThread用來處理AMS接收到的命令 mHandlerThread = new ServiceThread(TAG,THREAD_PRIORITY_FOREGROUND, false /*allowIo*/); mHandlerThread.start(); mHandler = new MainHandler(mHandlerThread.getLooper()); mUiHandler = mInjector.getUiHandler(this); //低內存監控 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); //創建 /data/system目錄 final File systemDir = SystemServiceManager.ensureSystemDir(); //創建進程統計服務,保存在/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監控、啟動進程統計服務、啟動低內存監控、初始化Service和ContentProvider對應的保存類等等。

start()

當AMS類創建完成之后,會調用start()方法。

private void start() { //移除所有的進程組 removeAllProcessGroups(); //啟動CpuTracker線程 mProcessCpuThread.start(); //啟動電池統計服務,能夠統計具體的應用的電池消耗,從而來進行一定的電量統計 mBatteryStatsService.publish(); //創建LocalService,并添加到LocalServices列表中 LocalServices.addService(ActivityManagerInternal.class, new LocalService()); mActivityTaskManager.onActivityManagerInternalAdded(); mUgmInternal.onActivityManagerInternalAdded(); mPendingIntentController.onActivityManagerInternalAdded(); }

在start方法中,會將在構造函數中創建的一些線程進行啟動。

setSystemProcess

在創建并啟動完成之后,會通過setSystemProcess方法來向ServiceManager中注冊一些系統相關的服務。

public void setSystemProcess() { try { //注冊ActivityService服務 ServiceManager.addService(Context.ACTIVITY_SERVICE, this, /* allowIsolated= */ true, DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO); //注冊進程狀態服務 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()); //創建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); } }

在這個方法中會設置一些系統進程,主要功能為:

注冊一些服務:activity、procstats、meminfo、gfxinfo、dbinfo、cpuinfo、permission、processinfo等。 獲取包名為“android”的應用的ApplicationInfo對象,并將該ApplicationInfo信息安裝設置到SystemThread(系統進程主線程)。即可以理解,系統也是一個特殊的應用。 創建ProcessRecord維護進程的相關信息,這里MY_PID即為SystemServer進程ID。 啟動 檢測應用運行和交互。 后續

當AMS創建并啟動之后,會有一系列的后續的工作需要處理。這些操作都是在**startOtherServices()**中去調用的

private void startOtherServices() { //注冊系統的ContentProvider信息 mActivityManagerService.installSystemProviders(); mActivityManagerService.setWindowManager(wm); mActivityManagerService.systemReady(() -> { ......//goingCallback }, BOOT_TIMINGS_TRACE_LOG); }

這里的主要功能是:

關鍵服務繼續進行初始化 已經啟動的進程,如果沒有FLAG_PERSISTENT標志位,則會被kill掉 運行goingCallBack 啟動launcher的Activity,即桌面應用。

這里繼續跟蹤一下goingCallBack的具體執行內容。

goingCallBack

mActivityManagerService.systemReady(() -> { try { //啟動NativeCrash的監測 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); } ... }

在這個里面會繼續進行一些初始化的工作:

啟動NativeCrash監測 啟動WebView相關服務 啟動SystemUI startHomeOnAllDisplays

該功能主要是進行桌面程序的啟動,和AMS的啟動流程關聯不大,在這里不再詳細進行解析。

總結: AMS是在SystemServer進程中進行創建并啟動的 在AMS的服務啟動過程中,通過構造函數進行了一些對象的創建和初始化工作(初Activity外其他3大組件的列表和調度對象的創建;內存、電池、權限、CPU等的監控等等相關對象的創建),并且通過start()方法啟動服務(移除進程組、啟動CPU線程、權限注冊、電池服務等等)。 AMS創建并將對應服務啟動之后,會通過setSystemProcess方法,將framework-res.apk的信息加入到SystemServer進程的LoadedApk中,并創建了SystemServer進程的ProcessRecord,加入到了mPidsSelfLocked,交給AMS來統一管理 AMS啟動之后的后續工作,主要調用systemReady()和傳入的goingCallBack來執行。主要是各種服務或者進程,等AMS啟動完成后需要進一步完成的工作以及系統相關的初始化。 桌面應用是在systemReady()方法中啟動,systemUI是在goingCallback中完成。 當桌面應用啟動完成以后,發送開機廣播ACTION_BOOT_COMPLETED。

以上就是Android AMS啟動詳解的詳細內容,更多關于Android AMS啟動的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
主站蜘蛛池模板: 日韩三级一区二区 | 九九免费视频 | 一本三道a无线码一区v | 男人亚洲天堂 | 久久99国产精一区二区三区 | 在线男人天堂 | 日本卡一卡2卡3卡4精品卡无人区 | 国产高清精品毛片基地 | 欧美三级成版人版在线观看 | 特黄a大片免费视频 | 日韩一级特黄毛片在线看 | 亚洲色欧美| 久久se精品一区二区国产 | 久久精品毛片 | 久久99国产亚洲精品观看 | 在线观看国产一区二区三区 | 91精品一区二区三区在线观看 | 依依成人综合网 | 久久久久久久综合 | 99热久久国产精品一区 | 999热精品这里在线观看 | 国内自拍小视频 | 亚洲在线视频播放 | 久久欧洲视频 | 日本一级特黄aa毛片免费观看 | 成人黄页网站 | 亚洲视频男人的天堂 | 免费看又黄又爽又猛的网站 | 日本一级做人免费视频 | a站在线观看 | 免费又黄又爽的视频 | 精品国产精品久久一区免费式 | 亚洲欧美一二三区 | 久久精品视频在线观看 | 最新国产午夜精品视频不卡 | 岛国午夜精品视频在线观看 | 国产农村乱 | 免费国产一级特黄久久 | 欧美zoofilia杂交videos | 热99re久久精品精品免费 | 国产乱码精品一区二区三区四川人 |