电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

Android AMS啟動詳解

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

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

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

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

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

這里我們只截取了AMS的啟動代碼。

這里會通過startService方法來進(jìn)行AMS的注冊和啟動過程。我們看一下具體的ActivityManagerService中的startService方法

startService

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

我們在ServiceManager的工作原理中講解過,systemServiceManager.startService方法會將對應(yīng)的服務(wù)注冊到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); ... //啟動服務(wù) 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); //調(diào)用服務(wù)對應(yīng)的onStart方法 service.onStart(); }

在啟動AMS的時(shí)候傳入的參數(shù)是:ActivityManagerService.Lifecycle.class。所以這里實(shí)際上會調(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對象 mService = new ActivityManagerService(context, sAtm); } @Override public void onStart() { //調(diào)用AMS的start方法 mService.start(); } public ActivityManagerService getService() { //返回了AMS實(shí)例 return mService; } }

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

AMS的創(chuàng)建

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

//構(gòu)造方法, public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) { //獲取系統(tǒng)的ActivityThread mSystemThread = ActivityThread.currentActivityThread(); //創(chuàng)建一個(gè)ServiceThread用來處理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ì)列。這里包含了前臺廣播,后臺廣播等 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)建進(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)行了一些初始化的東西:比如說啟動CPU監(jiān)控、啟動進(jìn)程統(tǒng)計(jì)服務(wù)、啟動低內(nèi)存監(jiān)控、初始化Service和ContentProvider對應(yīng)的保存類等等。

start()

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

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

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

setSystemProcess

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

public void setSystemProcess() { try { //注冊ActivityService服務(wù) ServiceManager.addService(Context.ACTIVITY_SERVICE, this, /* allowIsolated= */ true, DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO); //注冊進(jìn)程狀態(tài)服務(wù) ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats); //注冊內(nèi)存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); } //注冊權(quán)限控制Binder ServiceManager.addService('permission', new PermissionController(this)); //注冊進(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è)方法中會設(shè)置一些系統(tǒng)進(jìn)程,主要功能為:

注冊一些服務(wù):activity、procstats、meminfo、gfxinfo、dbinfo、cpuinfo、permission、processinfo等。 獲取包名為“android”的應(yīng)用的ApplicationInfo對象,并將該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。 啟動 檢測應(yīng)用運(yùn)行和交互。 后續(xù)

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

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

這里的主要功能是:

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

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

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相關(guān) mWebViewUpdateService.prepareWebViewInSystemServer(); }, WEBVIEW_PREPARATION); } try { //啟動systemUI startSystemUi(context, windowManagerF); } catch (Throwable e) { reportWtf('starting System UI', e); } ... }

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

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

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

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

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

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 注塑模具_塑料模具_塑胶模具_范仕达【官网】_东莞模具设计与制造加工厂家 | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 合肥弱电工程_安徽安防工程_智能化工程公司-合肥雷润 | 菲希尔X射线测厚仪-菲希尔库伦法测厚仪-无锡骏展仪器有限责任公司 | 酶联免疫分析仪-多管旋涡混合仪|混合器-莱普特科学仪器(北京)有限公司 | 步进电机_agv电机_伺服马达-伺服轮毂电机-和利时电机 | 气动调节阀,电动调节阀,自力式压力调节阀,切断阀「厂家」-浙江利沃夫自控阀门 | 食品无尘净化车间,食品罐装净化车间,净化车间配套风淋室-青岛旭恒洁净技术有限公司 | 青岛美佳乐清洁工程有限公司|青岛油烟管道清洗|酒店|企事业单位|学校工厂厨房|青岛油烟管道清洗 插针变压器-家用电器变压器-工业空调变压器-CD型电抗器-余姚市中驰电器有限公司 | 绿萝净除甲醛|深圳除甲醛公司|测甲醛怎么收费|培训机构|电影院|办公室|车内|室内除甲醛案例|原理|方法|价格立马咨询 | 北京模型公司-工业模型-地产模型-施工模型-北京渝峰时代沙盘模型制作公司 | 地图标注-手机导航电子地图如何标注-房地产商场地图标记【DiTuBiaoZhu.net】 | 水冷式工业冷水机组_风冷式工业冷水机_水冷螺杆冷冻机组-深圳市普威机械设备有限公司 | 预制舱-电力集装箱预制舱-模块化预制舱生产厂家-腾达电器设备 | 彩信群发_群发彩信软件_视频短信营销平台-达信通 | 上海律师事务所_上海刑事律师免费咨询平台-煊宏律师事务所 | 国际船舶网 - 船厂、船舶、造船、船舶设备、航运及海洋工程等相关行业综合信息平台 | 精密模具制造,注塑加工,吹塑和吹瓶加工,EPS泡沫包装生产 - 济南兴田塑胶有限公司 | 绿萝净除甲醛|深圳除甲醛公司|测甲醛怎么收费|培训机构|电影院|办公室|车内|室内除甲醛案例|原理|方法|价格立马咨询 | 中药二氧化硫测定仪,食品二氧化硫测定仪|俊腾百科 | 篷房[仓储-婚庆-展览-活动]生产厂家-江苏正德装配式帐篷有限公司 | 智成电子深圳tdk一级代理-提供TDK电容电感贴片蜂鸣器磁芯lambda电源代理经销,TDK代理商有哪些TDK一级代理商排名查询。-深圳tdk一级代理 | 钛板_钛管_钛棒_钛盘管-无锡市盛钛科技有限公司| U拓留学雅思一站式服务中心_留学申请_雅思托福培训 | 色油机-色母机-失重|称重式混料机-称重机-米重机-拌料机-[东莞同锐机械]精密计量科技制造商 | 真空泵维修保养,普发,阿尔卡特,荏原,卡西亚玛,莱宝,爱德华干式螺杆真空泵维修-东莞比其尔真空机电设备有限公司 | 脑钠肽-白介素4|白介素8试剂盒-研域(上海)化学试剂有限公司 | 天津暖气片厂家_钢制散热器_天津铜铝复合暖气片_维尼罗散热器 | 重庆磨床过滤机,重庆纸带过滤机,机床伸缩钣金,重庆机床钣金护罩-重庆达鸿兴精密机械制造有限公司 | 建筑资质代办-建筑企业资质代办机构-建筑资质代办公司 | 包塑软管|金属软管|包塑金属软管-闵彬管业 | 上海深蓝_缠绕机_缠膜机-上海深蓝机械装备有限公司 | 咖啡加盟-咖啡店加盟-咖啡西餐厅加盟-塞纳左岸咖啡西餐厅官网 | 亚克隆,RNAi干扰检测,miRNA定量检测-上海基屹生物科技有限公司 | 高通量组织研磨仪-多样品组织研磨仪-全自动组织研磨仪-研磨者科技(广州)有限公司 | 明渠式紫外线杀菌器-紫外线消毒器厂家-定州市优威环保 | 外贸网站建设-外贸网站设计制作开发公司-外贸独立站建设【企术】 | 电镀电源整流器_高频电解电源_单脉双脉冲电源 - 东阳市旭东电子科技 | 莱州网络公司|莱州网站建设|莱州网站优化|莱州阿里巴巴-莱州唯佳网络科技有限公司 | 流量检测仪-气密性检测装置-密封性试验仪-东莞市奥图自动化科技有限公司 | 热处理炉-退火炉-回火炉设备厂家-丹阳市电炉厂有限公司 |