日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

Android AMS啟動詳解

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

在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.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 { //反射構造函數(shù) 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的時候傳入的參數(shù)是: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)建是通過構造函數(shù)來創(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的構造函數(shù)中進行了一些初始化的東西:比如說啟動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方法中,會將在構造函數(shù)中創(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的服務啟動過程中,通過構造函數(shù)進行了一些對象的創(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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
在线亚洲激情| 久久亚洲二区| 国产剧情一区二区在线观看| 亚洲三级在线| 综合国产在线| 日韩欧美在线精品| 欧美日韩91| 国产精品22p| 精品黄色一级片| 久久不卡国产精品一区二区| 国产欧美大片| 美女久久精品| 亚洲综合电影| 免费av一区| 免费人成网站在线观看欧美高清| 人人精品人人爱| 91免费精品国偷自产在线在线| 欧美日本久久| 97精品国产一区二区三区 | 群体交乱之放荡娇妻一区二区| 欧美片第1页| 一区二区视频欧美| 亚洲精品va| 亚洲三级av| 国产精品亲子伦av一区二区三区 | 香蕉成人av| 日韩视频一区二区三区在线播放免费观看 | 老司机精品在线| 久久精品免视看国产成人| 久久wwww| 国产一区日韩欧美| 亚洲精品电影| 日本欧美一区二区| 久久精品国产免费| 亚洲大片在线| 日日夜夜免费精品视频| 麻豆免费精品视频| 久久久久久美女精品| 一二三区精品| 精品精品久久| 日韩午夜在线| 久久不见久久见免费视频7| 日韩另类视频| 久久亚洲影院| 国产欧美一区二区三区国产幕精品 | 欧美中文一区| jizzjizz中国精品麻豆| 亚洲一区国产一区| 国产精久久久| 激情欧美一区| 欧美日本不卡高清| 极品日韩av| 亚洲精品美女| 综合日韩av| 日本成人在线视频网站| 蜜臀久久精品| 日韩激情av在线| 成人羞羞在线观看网站| 日韩精品一级二级| 狠狠久久伊人中文字幕| 在线一区视频| 国产一区二区三区国产精品| 国产精品视区| 国产精品成人一区二区不卡| 蜜桃视频在线观看一区二区| а√天堂8资源在线| 亚州欧美在线| 狠狠躁少妇一区二区三区| 亚洲影视一区二区三区| 韩国女主播一区二区三区| av成人国产| 国产一区二区三区日韩精品| 国产欧美在线观看免费| 自拍日韩欧美| 国产一区二区三区久久| 日本不卡视频在线| 亚洲精品中文字幕乱码| 精品一级视频| 日本欧美韩国一区三区| 欧美在线网站| 日本在线啊啊| 麻豆高清免费国产一区| 喷白浆一区二区| 欧美日韩一二三四| 九九久久国产| 久久国产婷婷国产香蕉| 91精品福利| 黑森林国产精品av| 国产精品mv在线观看| 亚洲精品系列| 欧美网站在线| 欧洲一级精品| 精品国产a一区二区三区v免费| 日韩国产一二三区| 国产亚洲一级| 99久久久久国产精品| 精品美女在线视频| 日韩一区二区三区在线看| 91精品二区| 久久高清免费| 日韩在线观看一区| 国产一区二区视频在线看| 国产伦乱精品| 欧美日韩中出| 日本午夜精品| 亚洲精品动态| 亚洲乱码久久| 老牛影视一区二区三区| 婷婷综合社区| 激情视频一区二区三区| 99久久久久国产精品| 国产麻豆久久| 在线看片福利| 五月激情久久| 久久久精品久久久久久96 | 亚洲青青久久| 中文字幕一区二区精品区| 国产精品毛片| 美女久久一区| 一区二区日韩免费看| 日韩一区欧美二区| 中文字幕视频精品一区二区三区| 免费成人av在线播放| 中文字幕日韩亚洲| 在线精品观看| 日韩在线麻豆| 欧美日韩夜夜| 精品午夜av| 日韩高清欧美| 国内激情久久| 日韩中文字幕区一区有砖一区| 亚洲精一区二区三区| 日韩高清在线不卡| 国产精品宾馆| 成午夜精品一区二区三区软件| 成人污污视频| 久久中文字幕av| 亚洲欧美日韩国产综合精品二区| 首页国产欧美久久| 亚洲日本在线观看视频| 日韩成人精品一区二区三区 | 伊人精品一区| 另类国产ts人妖高潮视频| 免费久久99精品国产| 91九色综合| 黄色精品视频| 欧美亚洲精品在线| 日本大胆欧美人术艺术动态| 日日夜夜免费精品| 国产精品中文字幕制服诱惑| 国产精品日韩精品在线播放| 成人国产精选| 好看不卡的中文字幕| 亚洲精品一级二级三级| 国产精品99久久免费观看| 岛国av在线网站| 九九在线精品| 少妇精品在线| 久久精品国产福利| 激情综合自拍| 97久久亚洲| 日韩伦理福利| 视频一区视频二区中文| 国产精品色婷婷在线观看| 中文字幕在线免费观看视频| 好看的av在线不卡观看| 日韩国产在线一| 亚洲黄色网址| 美国欧美日韩国产在线播放| 国产免费av国片精品草莓男男| 欧洲av不卡| 亚洲精品免费观看| 国产美女高潮在线| 三级欧美在线一区| 精品视频一二| 亚洲在线免费| 精品三级av| 亚洲一区亚洲| 精品视频在线你懂得| 99成人在线| 国产精品午夜一区二区三区| 亚洲性色av| 日本精品在线播放| 神马日本精品| 国产亚洲精aa在线看| 99精品视频在线观看免费播放| 日韩和欧美一区二区| 久久久噜噜噜| 欧美在线不卡| 女同性一区二区三区人了人一| 久久精品xxxxx| 亚洲女同中文字幕| 乱一区二区av| 亚洲免费观看高清完整版在线观| 日本一区二区免费高清| 蜜臀久久99精品久久久久久9 | 日本视频一区二区| 欧美不卡在线| 国产精品九九| 中文字幕亚洲精品乱码|