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

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

Android AMS啟動詳解

瀏覽:12日期: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久久,三上悠亚国产精品一区二区三区
国产精品视频首页| 高清日韩欧美| 婷婷亚洲五月| 日韩精品久久久久久久电影99爱 | 蜜桃av在线播放| 国产福利片在线观看| 日韩欧美中文| 免费av一区二区三区四区| 欧美在线网站| 欧美福利一区| 久久99伊人| 日韩亚洲精品在线观看| 欧美日韩精品一区二区三区视频 | 日韩在线卡一卡二| 日本成人中文字幕| 一区二区三区四区日韩| 日本欧美一区二区| 国产精品成人一区二区网站软件| 国产精品115| 国产一区二区三区四区大秀| 欧美香蕉视频| 国产视频欧美| 国产探花在线精品一区二区| 国产精品xx| 99国产精品| 欧美天堂一区| av资源新版天堂在线| 91久久久精品国产| 日韩三级一区| 精品三级在线| 91精品国产成人观看| 蜜桃视频免费观看一区| 国产精品久久久久久久久免费高清| caoporn视频在线| 国产精品婷婷| 国产精品白浆| 99精品视频精品精品视频| 中文字幕日韩亚洲| 精品亚洲成人| 亚洲精品午夜av福利久久蜜桃| 日本aⅴ免费视频一区二区三区| 欧美国产日韩电影| 久久久蜜桃一区二区人| 日韩中文字幕av电影| 九九99久久精品在免费线bt| 日本免费久久| 日韩av网站在线免费观看| 日本不良网站在线观看| 蜜臀av在线播放一区二区三区| 美女久久久久久 | 91九色精品| 久久超级碰碰| 亚州av乱码久久精品蜜桃| 日韩精品国产精品| 久久久久久夜| 亚洲+小说+欧美+激情+另类| 国产乱码午夜在线视频| 日韩黄色在线观看| 欧美日韩中文一区二区| 国产精品久久| 国产一级久久| 亚洲欧洲美洲av| 日韩精品视频网站| 99精品在线免费在线观看| 国产日韩欧美| 国产亚洲在线观看| 91视频一区| 欧美欧美黄在线二区| 婷婷丁香综合| 国产一区福利| 日本一区二区中文字幕| 欧美福利在线| 麻豆视频在线观看免费网站黄| 亚洲精品精选| 久久中文字幕二区| 国产精品密蕾丝视频下载| 99在线精品免费视频九九视| 久久三级中文| 日本精品久久| 午夜在线精品偷拍| 日韩欧美少妇| 国产一区二区三区天码| 欧美在线观看天堂一区二区三区| 欧美特黄a级高清免费大片a级| 麻豆国产欧美一区二区三区 | 99视频精品全部免费在线视频| 国产精品hd| 亚洲精品动态| 亚洲免费观看| 久久国产亚洲| 91日韩免费| 精品三区视频| 国产极品久久久久久久久波多结野| 丝袜国产日韩另类美女| 日韩欧美看国产| 麻豆精品99| 国产精一区二区| 亚洲aa在线| 免费人成精品欧美精品 | 欧美精品影院| 亚洲欧洲免费| 日韩精品一区第一页| 伊人影院久久| 在线视频观看日韩| 日韩av福利| 在线精品亚洲欧美日韩国产| 精品伊人久久| 国产精品欧美在线观看| 日本精品在线播放| 亚洲精品在线a| 亚洲精品裸体| 亚洲91网站| 日韩高清不卡在线| 日韩精品国产欧美| 欧美日韩在线精品一区二区三区激情综合 | 国产精品s色| 国产精品白丝av嫩草影院| 国产日韩高清一区二区三区在线 | 亚洲精品高潮| 天堂va在线高清一区| 亚洲精品系列| 日本不卡在线视频| 日韩国产欧美在线播放| 日本va欧美va精品| 久久国产麻豆精品| 国产麻豆精品| 国产免费av国片精品草莓男男| 国产精品第一| 日韩成人精品一区二区| 日韩理论片av| 激情久久久久久久| 亚洲国产不卡| 午夜在线精品偷拍| 伊人久久婷婷| 蜜桃久久久久久| 日韩在线黄色| 国产精品久久久久久久久久妞妞| 久久99青青| 韩国久久久久久| 亚洲黑丝一区二区| 美女国产一区| 欧美亚洲福利| 97精品国产一区二区三区| 久久久久久久久久久妇女 | 久久五月天小说| 亚洲主播在线| 日韩av午夜在线观看| 国产精品调教| 成人一区不卡| 亚洲高清二区| 四虎成人精品一区二区免费网站 | 欧美日韩午夜| 久久久久久夜| 日韩一区二区久久| 91精品国产自产观看在线| 麻豆国产精品一区二区三区| 美女av在线免费看| 国产午夜精品一区二区三区欧美 | 日韩精品dvd| 久久99伊人| 国产精品一区二区三区美女| 国产精选在线| 国产色综合网| 国产精品久久久一区二区| 久久精品影视| 日韩精品91亚洲二区在线观看| 国产一区二区亚洲| 国产亚洲永久域名| 国产精品v一区二区三区| 久久久久国产一区二区| 日韩精品欧美大片| 久久久精品五月天| 97久久亚洲| 中文在线免费视频| 视频一区在线视频| 国产专区精品| 亚洲丝袜啪啪| 超碰99在线| 亚洲+小说+欧美+激情+另类| 欧美国产美女| 亚洲免费毛片| 久久天堂成人| 国产精品自在| 99在线观看免费视频精品观看| 国产精品99久久免费| 欧洲激情综合| 国产精品久久久久av蜜臀| 在线 亚洲欧美在线综合一区| 日韩国产欧美在线播放| 99久久精品费精品国产| 久久av日韩| 视频一区国产视频| 欧美日韩国产观看视频| 日韩精品一区二区三区中文在线| 久久久久亚洲| 久久精品国产久精国产| 亚洲精品成a人ⅴ香蕉片| 亚洲国产影院| 久久精品女人| 日产欧产美韩系列久久99|