亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android AMS啟動(dòng)詳解

瀏覽:3日期:2022-09-20 09:33:44
啟動(dòng)

在Android系統(tǒng)啟動(dòng)流程中中我們提到過(guò),AMS是在system_service中啟動(dòng)的,

//frameworks/base/services/java/corri/android/server/SystemServer.java//該方法主要啟動(dòng)服務(wù) ActivityManagerService,PowerManagerService,LightsService,DisplayManagerService,PackageManagerService,UserManagerService。//設(shè)置 ActivityManagerService,啟動(dòng)傳感器服務(wù)。startBootstrapServices(); // 啟動(dòng)引導(dǎo)服務(wù)//該方法主要//啟動(dòng)服務(wù) BatteryService 用于統(tǒng)計(jì)電池電量,需要 LightService。//啟動(dòng)服務(wù) UsageStatsService,用于統(tǒng)計(jì)應(yīng)用使用情況。//啟動(dòng)服務(wù) WebViewUpdateService。startCoreServices(); // 啟動(dòng)核心服務(wù)//該方法主要啟動(dòng)服務(wù) InputManagerService,WindowManagerService。//等待 ServiceManager,SurfaceFlinger啟動(dòng)完成,然后顯示啟動(dòng)界面。//啟動(dòng)服務(wù) StatusBarManagerService,//準(zhǔn)備好 window, power, package, display 服務(wù)://- WindowManagerService.systemReady()//- PowerManagerService.systemReady()//- PackageManagerService.systemReady()//- DisplayManagerService.systemReady()startOtherServices(); // 啟動(dòng)其他服務(wù)

在啟動(dòng)核心服務(wù)功能中,會(huì)進(jìn)行AMS的啟動(dòng)。

//frameworks/base/services/java/corri/android/server/SystemServer.java private void startBootstrapServices() { ... //這里會(huì)將ATMS注冊(cè)到ServiceManager中,然后調(diào)用ATMS的start方法。 ActivityTaskManagerService atm = mSystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class).getService(); //重點(diǎn)方法1。 注冊(cè)AMS服務(wù),并返回對(duì)應(yīng)的對(duì)象信息 mActivityManagerService = ActivityManagerService.Lifecycle.startService(mSystemServiceManager, atm); mActivityManagerService.setSystemServiceManager(mSystemServiceManager); //設(shè)置app安裝器 mActivityManagerService.setInstaller(installer); ... //重點(diǎn)方法2。 向ServiceManager中注冊(cè)Binder服務(wù) mActivityManagerService.setSystemProcess(); }

這里我們只截取了AMS的啟動(dòng)代碼。

這里會(huì)通過(guò)startService方法來(lái)進(jìn)行AMS的注冊(cè)和啟動(dòng)過(guò)程。我們看一下具體的ActivityManagerService中的startService方法

startService

// public static ActivityManagerService startService(SystemServiceManager ssm, ActivityTaskManagerService atm) { sAtm = atm; //調(diào)用SM的startService方法。創(chuàng)建AMS實(shí)例,并啟動(dòng)AMS return ssm.startService(ActivityManagerService.Lifecycle.class).getService(); }

我們?cè)赟erviceManager的工作原理中講解過(guò),systemServiceManager.startService方法會(huì)將對(duì)應(yīng)的服務(wù)注冊(cè)到ServiceManager中,然后再調(diào)用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 { //反射構(gòu)造函數(shù) Constructor<T> constructor = serviceClass.getConstructor(Context.class); //創(chuàng)建服務(wù) service = constructor.newInstance(mContext); ... //啟動(dòng)服務(wù) startService(service); return service; } finally { Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } } public void startService(@NonNull final SystemService service) { // Register it. //注冊(cè)到ServiceManager列表中 mServices.add(service); //調(diào)用服務(wù)對(duì)應(yīng)的onStart方法 service.onStart(); }

在啟動(dòng)AMS的時(shí)候傳入的參數(shù)是:ActivityManagerService.Lifecycle.class。所以這里實(shí)際上會(huì)調(diào)用ActivityManagerService.Lifecycle 的構(gòu)造方法,然后調(diào)用它的onStart方法

public static final class Lifecycle extends SystemService { private final ActivityTaskManagerService mService; public Lifecycle(Context context) { super(context); //創(chuàng)建AMS對(duì)象 mService = new ActivityManagerService(context, sAtm); } @Override public void onStart() { //調(diào)用AMS的start方法 mService.start(); } public ActivityManagerService getService() { //返回了AMS實(shí)例 return mService; } }

在Lifecycle對(duì)象的創(chuàng)建過(guò)程中,會(huì)創(chuàng)建AMS對(duì)象,然后通過(guò)start()方法進(jìn)行了啟動(dòng)。

AMS的創(chuàng)建

對(duì)于AMS對(duì)象的創(chuàng)建是通過(guò)構(gòu)造函數(shù)來(lái)創(chuàng)建的。

//構(gòu)造方法, public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) { //獲取系統(tǒng)的ActivityThread mSystemThread = ActivityThread.currentActivityThread(); //創(chuàng)建一個(gè)ServiceThread用來(lái)處理AMS接收到的命令 mHandlerThread = new ServiceThread(TAG,THREAD_PRIORITY_FOREGROUND, false /*allowIo*/); mHandlerThread.start(); mHandler = new MainHandler(mHandlerThread.getLooper()); mUiHandler = mInjector.getUiHandler(this); //低內(nèi)存監(jiān)控 mLowMemDetector = new LowMemDetector(this); //初始化廣播隊(duì)列。這里包含了前臺(tái)廣播,后臺(tái)廣播等 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; //用于保存注冊(cè)的Service mServices = new ActiveServices(this); //map,用于保存注冊(cè)的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)建進(jìn)程統(tǒng)計(jì)服務(wù),保存在/data/system/proccstats目錄中。 mProcessStats = new ProcessStatsService(this, new File(systemDir, 'procstats')); //賦值A(chǔ)TM,并進(jìn)行初始化 mActivityTaskManager = atm; mActivityTaskManager.initialize(mIntentFirewall, mPendingIntentController, DisplayThread.get().getLooper()); //CPU追蹤器進(jìn)程 mProcessCpuThread = new Thread('CpuTracker') { @Override public void run() { ... } }; }

在AMS的構(gòu)造函數(shù)中進(jìn)行了一些初始化的東西:比如說(shuō)啟動(dòng)CPU監(jiān)控、啟動(dòng)進(jìn)程統(tǒng)計(jì)服務(wù)、啟動(dòng)低內(nèi)存監(jiān)控、初始化Service和ContentProvider對(duì)應(yīng)的保存類等等。

start()

當(dāng)AMS類創(chuàng)建完成之后,會(huì)調(diào)用start()方法。

private void start() { //移除所有的進(jìn)程組 removeAllProcessGroups(); //啟動(dòng)CpuTracker線程 mProcessCpuThread.start(); //啟動(dòng)電池統(tǒng)計(jì)服務(wù),能夠統(tǒng)計(jì)具體的應(yīng)用的電池消耗,從而來(lái)進(jìn)行一定的電量統(tǒng)計(jì) mBatteryStatsService.publish(); //創(chuàng)建LocalService,并添加到LocalServices列表中 LocalServices.addService(ActivityManagerInternal.class, new LocalService()); mActivityTaskManager.onActivityManagerInternalAdded(); mUgmInternal.onActivityManagerInternalAdded(); mPendingIntentController.onActivityManagerInternalAdded(); }

在start方法中,會(huì)將在構(gòu)造函數(shù)中創(chuàng)建的一些線程進(jìn)行啟動(dòng)。

setSystemProcess

在創(chuàng)建并啟動(dòng)完成之后,會(huì)通過(guò)setSystemProcess方法來(lái)向ServiceManager中注冊(cè)一些系統(tǒng)相關(guān)的服務(wù)。

public void setSystemProcess() { try { //注冊(cè)ActivityService服務(wù) ServiceManager.addService(Context.ACTIVITY_SERVICE, this, /* allowIsolated= */ true, DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO); //注冊(cè)進(jìn)程狀態(tài)服務(wù) ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats); //注冊(cè)內(nèi)存Binder ServiceManager.addService('meminfo', new MemBinder(this), /* allowIsolated= */ false,DUMP_FLAG_PRIORITY_HIGH); //注冊(cè)圖像Binder ServiceManager.addService('gfxinfo', new GraphicsBinder(this)); //注冊(cè)SQLite DB binder ServiceManager.addService('dbinfo', new DbBinder(this)); if (MONITOR_CPU_USAGE) { //注冊(cè)CPU使用情況的Binder ServiceManager.addService('cpuinfo', new CpuBinder(this),/* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL); } //注冊(cè)權(quán)限控制Binder ServiceManager.addService('permission', new PermissionController(this)); //注冊(cè)進(jìn)程管理Binder ServiceManager.addService('processinfo', new ProcessInfoService(this)); //獲取“android”應(yīng)用的ApplicationInfo,并裝載到mSystemThread ApplicationInfo info = mContext.getPackageManager().getApplicationInfo('android', STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY); mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader()); //創(chuàng)建ProcessRecord維護(hù)進(jìn)程的相關(guān)信息 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); } }

在這個(gè)方法中會(huì)設(shè)置一些系統(tǒng)進(jìn)程,主要功能為:

注冊(cè)一些服務(wù):activity、procstats、meminfo、gfxinfo、dbinfo、cpuinfo、permission、processinfo等。 獲取包名為“android”的應(yīng)用的ApplicationInfo對(duì)象,并將該ApplicationInfo信息安裝設(shè)置到SystemThread(系統(tǒng)進(jìn)程主線程)。即可以理解,系統(tǒng)也是一個(gè)特殊的應(yīng)用。 創(chuàng)建ProcessRecord維護(hù)進(jìn)程的相關(guān)信息,這里MY_PID即為SystemServer進(jìn)程ID。 啟動(dòng) 檢測(cè)應(yīng)用運(yùn)行和交互。 后續(xù)

當(dāng)AMS創(chuàng)建并啟動(dòng)之后,會(huì)有一系列的后續(xù)的工作需要處理。這些操作都是在**startOtherServices()**中去調(diào)用的

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

這里的主要功能是:

關(guān)鍵服務(wù)繼續(xù)進(jìn)行初始化 已經(jīng)啟動(dòng)的進(jìn)程,如果沒(méi)有FLAG_PERSISTENT標(biāo)志位,則會(huì)被kill掉 運(yùn)行g(shù)oingCallBack 啟動(dòng)launcher的Activity,即桌面應(yīng)用。

這里繼續(xù)跟蹤一下goingCallBack的具體執(zhí)行內(nèi)容。

goingCallBack

mActivityManagerService.systemReady(() -> { try { //啟動(dòng)NativeCrash的監(jiān)測(cè) mActivityManagerService.startObservingNativeCrashes(); } catch (Throwable e) { reportWtf('observing native crashes', e); } if (!mOnlyCore && mWebViewUpdateService != null) { webviewPrep = SystemServerInitThreadPool.get().submit(() -> { //啟動(dòng)WebView相關(guān) mWebViewUpdateService.prepareWebViewInSystemServer(); }, WEBVIEW_PREPARATION); } try { //啟動(dòng)systemUI startSystemUi(context, windowManagerF); } catch (Throwable e) { reportWtf('starting System UI', e); } ... }

在這個(gè)里面會(huì)繼續(xù)進(jìn)行一些初始化的工作:

啟動(dòng)NativeCrash監(jiān)測(cè) 啟動(dòng)WebView相關(guān)服務(wù) 啟動(dòng)SystemUI startHomeOnAllDisplays

該功能主要是進(jìn)行桌面程序的啟動(dòng),和AMS的啟動(dòng)流程關(guān)聯(lián)不大,在這里不再詳細(xì)進(jìn)行解析。

總結(jié): AMS是在SystemServer進(jìn)程中進(jìn)行創(chuàng)建并啟動(dòng)的 在AMS的服務(wù)啟動(dòng)過(guò)程中,通過(guò)構(gòu)造函數(shù)進(jìn)行了一些對(duì)象的創(chuàng)建和初始化工作(初Activity外其他3大組件的列表和調(diào)度對(duì)象的創(chuàng)建;內(nèi)存、電池、權(quán)限、CPU等的監(jiān)控等等相關(guān)對(duì)象的創(chuàng)建),并且通過(guò)start()方法啟動(dòng)服務(wù)(移除進(jìn)程組、啟動(dòng)CPU線程、權(quán)限注冊(cè)、電池服務(wù)等等)。 AMS創(chuàng)建并將對(duì)應(yīng)服務(wù)啟動(dòng)之后,會(huì)通過(guò)setSystemProcess方法,將framework-res.apk的信息加入到SystemServer進(jìn)程的LoadedApk中,并創(chuàng)建了SystemServer進(jìn)程的ProcessRecord,加入到了mPidsSelfLocked,交給AMS來(lái)統(tǒng)一管理 AMS啟動(dòng)之后的后續(xù)工作,主要調(diào)用systemReady()和傳入的goingCallBack來(lái)執(zhí)行。主要是各種服務(wù)或者進(jìn)程,等AMS啟動(dòng)完成后需要進(jìn)一步完成的工作以及系統(tǒng)相關(guān)的初始化。 桌面應(yīng)用是在systemReady()方法中啟動(dòng),systemUI是在goingCallback中完成。 當(dāng)桌面應(yīng)用啟動(dòng)完成以后,發(fā)送開(kāi)機(jī)廣播ACTION_BOOT_COMPLETED。

以上就是Android AMS啟動(dòng)詳解的詳細(xì)內(nèi)容,更多關(guān)于Android AMS啟動(dòng)的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 日韩亚洲欧美一区二区三区 | 麻豆福利影院 | 久久国模| 最新国产你懂的在线网址 | 免费人成观看在线网 | 99一级毛片| 欧美一级毛片高清免费观看 | 黄色一级生活片 | 非洲一区二区三区不卡 | chinese国产在线视频 | 国产亚洲欧美在线视频 | 日韩在线观看视频黄 | 尤物免费视频 | 国产成人91高清精品免费 | 99久久精品男女性高爱 | 国产成人精品一区二三区 | 午夜国产福利视频一区 | 黄网址在线永久免费观看 | 一级毛片一级毛片一级毛片 | 国产福利在线 | 污网站大全 | 黄色影片免费观看 | 在线成人天天鲁夜啪视频 | japanese色系国产在线高清 | 午夜国产精品无套 | 国产在线日本 | 精品视频久久久 | 国产免费小视频 | 久久国产精品只做精品 | 免费观看的成年网址 | 国产亚洲精品bv在线观看 | 久操青青 | 免费国产在线观看不卡 | 曰批免费视频播放在线看片二 | 看最刺激的欧美毛片 | 成人无遮挡毛片免费看 | 青青草国产精品人人爱99 | 亚洲黄色官网 | 国产91精品在线观看 | 免费精品国产日韩热久久 | 中文字幕一区二区在线视频 |