成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入分析AMS啟動(dòng)流程

移動(dòng)開(kāi)發(fā) Android
AMS(ActivityManagerService)Android的核心服務(wù)之一,對(duì)于framework各個(gè)核心服務(wù),如果不是專(zhuān)門(mén)去做framework開(kāi)發(fā),先了解其基本的流程機(jī)制,再慢慢深究;今天我們就來(lái)學(xué)習(xí)下AMS.

[[432146]]

前言

AMS(ActivityManagerService)Android的核心服務(wù)之一,對(duì)于framework各個(gè)核心服務(wù),如果不是專(zhuān)門(mén)去做framework開(kāi)發(fā),先了解其基本的流程機(jī)制,再慢慢深究;

今天我們就來(lái)學(xué)習(xí)下AMS

一、AMS功能概述

1、AMS介紹

  • AMS是Android中最核心的服務(wù),主要負(fù)責(zé)系統(tǒng)中四大組件的啟動(dòng)、切換、調(diào)度及應(yīng)用進(jìn)程的管理和調(diào)度等工作,其職責(zé)與操作系統(tǒng)中的進(jìn)程管理和調(diào)度模塊相類(lèi)似,因此它在Android中非常重要;
  • 組件狀態(tài)管理:包括四大組件的開(kāi)啟,關(guān)閉等一系列操作,如startActivity,startActivityAndWait,activityPaused,startService,stopService,removeContentProvider等;
  • 組件狀態(tài)查詢(xún):查詢(xún)組件當(dāng)前運(yùn)行等情況。如getCallingActivity,getService等;
  • Task相關(guān):包括removeTask,removeSubTask,moveTaskBackwards,moveTaskToFront等;
  • AMS是通過(guò)ActivityStack及其他數(shù)據(jù)結(jié)構(gòu)來(lái)記錄,管理系統(tǒng)中的Activity及其他組件狀態(tài)的,并提供查詢(xún)功能的一個(gè)系統(tǒng)服務(wù);

2、AMS中重要的數(shù)據(jù)結(jié)構(gòu)

ActivityRecord:記錄了Activity的所有信息,因此它用來(lái)描述一個(gè)activity。它是在activity啟動(dòng)時(shí)被創(chuàng)建的,具體是在ActivityStarter的startActivity()中被創(chuàng)建的。它存儲(chǔ)的信息主要包括以下內(nèi)容:

  • service:AMS的引用
  • info:ActivityInfo,Activity中代碼和AndroidManifest設(shè)置的節(jié)點(diǎn)信息,如launchMode
  • launcherFromPackage:啟動(dòng)activity的包名
  • taskAffinity:activity希望歸屬的棧
  • task:TaskRecord,Activity所在的TaskRecord
  • app:ProcessRecord,ActivityRecord所在的應(yīng)用程序進(jìn)程
  • state:ActivityState,當(dāng)前activity的狀態(tài)
  • icon:Activity的圖標(biāo)資源和標(biāo)致符
  • theme:Activity的主題資源標(biāo)識(shí)符

TaskRecord:用來(lái)描述一個(gè)Activity任務(wù)棧

  • taskId:任務(wù)棧的唯一標(biāo)識(shí)符
  • affinity:任務(wù)棧的傾向性
  • Intent:啟動(dòng)這個(gè)activity的intent
  • mActivites:ArrayList,按照歷史順序排列的Activity記錄
  • mStack:ActivityStack,當(dāng)前歸屬的ActivityStack
  • mService:AMS的引用

ActivityStack:用來(lái)管理系統(tǒng)所有的Activity,內(nèi)部維護(hù)了Activity的所有狀態(tài),特殊狀態(tài)的Activity以及和Activity相關(guān)的列表等數(shù)據(jù);

 

 

二、AMS服務(wù)的啟動(dòng)流程詳解

1、startBootstrapServices

  1. private void startBootstrapServices() { 
  2.         // Activity manager runs the show. 
  3.      mActivityManagerService = mSystemServiceManager.startService( 
  4.                 ActivityManagerService.Lifecycle.class).getService(); 
  5.      mActivityManagerService.setSystemProcess(); 
  6. …… 
  7.      mActivityManagerService.installSystemProviders(); 
  8. …… 
  9.      mActivityManagerService.systemReady(new Runnable() { 
  10.             @Override 
  11.             public void run() { 
  12.                 Slog.i(TAG, "Making services ready"); 
  13.                 mSystemServiceManager.startBootPhase( 
  14.                         SystemService.PHASE_ACTIVITY_MANAGER_READY); 
  15.                 try { 
  16.                     mActivityManagerService.startObservingNativeCrashes(); 
  17.                 } catch (Throwable e) { 
  18.                     reportWtf("observing native crashes", e); 
  19.                 } 

SystemServer中關(guān)于AMS啟動(dòng)時(shí)的幾個(gè)關(guān)鍵方法,主要分為4個(gè)步驟

  • 創(chuàng)建AMS對(duì)象,并啟動(dòng)服務(wù)
  • 將AMS所在的系統(tǒng)進(jìn)程,添加到進(jìn)程管理中去
  • 為系統(tǒng)進(jìn)程安裝ContentProvider對(duì)象
  • 在systemReady方法中做善后操作
  • 一個(gè)一個(gè)的來(lái)看先這些方法的作用,這些方法就是AMS的啟動(dòng)和初始化過(guò)程;

2、ActivityManagerService

啟動(dòng)ActivityManagerService的方法

mActivityManagerService = mSystemServiceManager.startService(

ActivityManagerService.Lifecycle.class).getService();

AMS服務(wù)同樣是通過(guò)SystemServiceManager來(lái)啟動(dòng)的,那我們首先來(lái)看ActivityManagerService.Lifecycle的構(gòu)造方法,然后在來(lái)看它的Start函數(shù);

Lifecycle的構(gòu)造方法中很簡(jiǎn)單就是構(gòu)造一個(gè)AMS的對(duì)象

mService = new ActivityManagerService(context);

創(chuàng)建AMS對(duì)象的時(shí)候需要傳遞一個(gè)Context作為參數(shù),那這個(gè)mSystemContext是就是上面創(chuàng)建的系統(tǒng)Context;

接著看AMS的構(gòu)造方法;

  1. public ActivityManagerService(Context systemContext) { 
  2. //系統(tǒng)的context         
  3. mContext = systemContext; 
  4.     //獲得系統(tǒng)的ActivityThread 
  5.         mSystemThread = ActivityThread.currentActivityThread(); 
  6.     //創(chuàng)建一個(gè)HandlerThread用來(lái)處理AMS接收的命令 
  7.         mHandlerThread = new ServiceThread(TAG, 
  8.                 android.os.Process.THREAD_PRIORITY_FOREGROUND, false /*allowIo*/); 
  9.         mHandlerThread.start(); 
  10.         mHandler = new MainHandler(mHandlerThread.getLooper()); 
  11.         mUiHandler = new UiHandler(); 
  12.     //初始化廣播的隊(duì)列 
  13.         mFgBroadcastQueue = new BroadcastQueue(this, mHandler, 
  14.                 "foreground", BROADCAST_FG_TIMEOUT, false); 
  15.         mBgBroadcastQueue = new BroadcastQueue(this, mHandler, 
  16.                 "background", BROADCAST_BG_TIMEOUT, true); 
  17.         mBroadcastQueues[0] = mFgBroadcastQueue; 
  18.         mBroadcastQueues[1] = mBgBroadcastQueue; 
  19.     //初始化Service相關(guān)的容器 
  20.         mServices = new ActiveServices(this); 
  21.     //初始化Provider相關(guān)的Map,里面保存了注冊(cè)的ContentProvider 
  22.         mProviderMap = new ProviderMap(this); 
  23.         //初始化并創(chuàng)建data/system/目錄 
  24.         File dataDir = Environment.getDataDirectory(); 
  25.         File systemDir = new File(dataDir, "system"); 
  26.         systemDir.mkdirs(); 
  27.     //初始化電量統(tǒng)計(jì)服務(wù)相關(guān)的信息 
  28.         mBatteryStatsService = new BatteryStatsService(systemDir, mHandler); 
  29.         mBatteryStatsService.getActiveStatistics().readLocked(); 
  30.         mBatteryStatsService.scheduleWriteToDisk(); 
  31.         mOnBattery = DEBUG_POWER ? true 
  32.                 : mBatteryStatsService.getActiveStatistics().getIsOnBattery(); 
  33.         mBatteryStatsService.getActiveStatistics().setCallback(this); 
  34.     //初始化系統(tǒng)統(tǒng)計(jì)服務(wù),用于統(tǒng)計(jì)系統(tǒng)的運(yùn)行信息 
  35.         mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats")); 
  36.         mAppOpsService = new AppOpsService(new File(systemDir, "appops.xml"), mHandler); 
  37.         mGrantFile = new AtomicFile(new File(systemDir, "urigrants.xml")); 
  38.         //創(chuàng)建系統(tǒng)的第一個(gè)user,userID為0,該用戶(hù)具有管理員權(quán)限 
  39.         mStartedUsers.put(UserHandle.USER_OWNER, new UserState(UserHandle.OWNER, true)); 
  40.         mUserLru.add(UserHandle.USER_OWNER); 
  41.         updateStartedUserArrayLocked(); 
  42.     //獲取opengle的版本 
  43.         GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version"
  44.             ConfigurationInfo.GL_ES_VERSION_UNDEFINED); 
  45.         //初始化字體語(yǔ)言等配置信息 
  46.         mConfiguration.setToDefaults(); 
  47.         mConfiguration.setLocale(Locale.getDefault()); 
  48.      ……; 
  49.         mRecentTasks = new RecentTasks(this); 
  50.     //初始化StackSupervisor,該類(lèi)是Activity啟動(dòng)和調(diào)度的核心類(lèi) 
  51.         mStackSupervisor = new ActivityStackSupervisor(this, mRecentTasks); 
  52.         mTaskPersister = new TaskPersister(systemDir, mStackSupervisor, mRecentTasks); 
  • AMS的構(gòu)造方法主要是在做一些初始化的先關(guān)操作;
  • 保存了自己的運(yùn)行環(huán)境的Context和ActivityThread;
  • AMS負(fù)責(zé)調(diào)度四大組件,所以會(huì)初始化broadcast,service和contentProvider相關(guān)的變量,接著初始化了電量統(tǒng)計(jì)服務(wù),創(chuàng)建了系統(tǒng)的第一個(gè)用戶(hù),初始化了基本的配置信息,還創(chuàng)建了Activity調(diào)度的核心類(lèi),因?yàn)锳ctivity調(diào)度比較復(fù)雜,Activity相關(guān)的信息初始化會(huì)在ActivityStackSupervisor中;

3、start

AMS的start方法。

  1. private void start() { 
  2.      mProcessCpuThread.start(); 
  3.      mBatteryStatsService.publish(mContext); 
  4.      LocalServices.addService(ActivityManagerInternal.class, new LocalService()); 
  5.  } 
  • AMS的start方法很簡(jiǎn)單,只是啟動(dòng)了幾個(gè)服務(wù),并把AMS服務(wù)自己保存到localService中供程序內(nèi)部調(diào)用;
  • AMS的構(gòu)造方法和start方法中做了AMS服務(wù)一些變量的初始化和相關(guān)服務(wù)的初始化。接著看下一個(gè)重要的方法setSystemProcess;

4、setSystemProcess

ActivityManagerService的setSystemProcess方法

  1. public void setSystemProcess() { 
  2.         try { 
  3.     //將AMS注冊(cè)到ServiceManager中 
  4.             ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true); 
  5.     //注冊(cè)其他服務(wù)到ServiceMananger中 
  6.             ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats); 
  7.             ServiceManager.addService("meminfo", new MemBinder(this)); 
  8.             ServiceManager.addService("gfxinfo", new GraphicsBinder(this)); 
  9.             ServiceManager.addService("dbinfo", new DbBinder(this)); 
  10.             if (MONITOR_CPU_USAGE) { 
  11.                 ServiceManager.addService("cpuinfo", new CpuBinder(this)); 
  12.             } 
  13.     //注冊(cè)權(quán)限服務(wù)到ServiceMananger中 
  14.             ServiceManager.addService("permission", new PermissionController(this)); 
  15.             ServiceManager.addService("processinfo", new ProcessInfoService(this)); 
  16.     //從PMS中查詢(xún)包名為android的application,即framework-res的Application信息 
  17.             ApplicationInfo info = mContext.getPackageManager().getApplicationInfo( 
  18.                     "android", STOCK_PM_FLAGS); 
  19.         //將application信息配置到開(kāi)始創(chuàng)建的activityThread中 
  20.             mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader()); 
  21.             synchronized (this) { 
  22.         //創(chuàng)建了一個(gè)ProcessRecord對(duì)象,該對(duì)象中保存著系統(tǒng)ongoing服務(wù)的進(jìn)程信息 
  23.                 ProcessRecord app = newProcessRecordLocked(info, info.processName, false, 0); 
  24.                 app.persistent = true
  25.                 app.pid = MY_PID; 
  26.                 app.maxAdj = ProcessList.SYSTEM_ADJ; 
  27.                 app.makeActive(mSystemThread.getApplicationThread(), mProcessStats); 
  28.                 synchronized (mPidsSelfLocked) { 
  29.         然后將系統(tǒng)進(jìn)程的processRecord對(duì)象也添加到mPidsSelfLocked集合中,和普通應(yīng)用的進(jìn)程一樣,接收AMS的管理調(diào)度 
  30.                     mPidsSelfLocked.put(app.pid, app); 
  31.                 } 
  32.         //更細(xì)進(jìn)程管理的調(diào)度信息 
  33.                 updateLruProcessLocked(app, falsenull); 
  34.                 updateOomAdjLocked(); 
  35.             } 
  • setSystemProcess方法中,首先將自己AMS服務(wù)注冊(cè)到了ServiceManager中,然后又注冊(cè)了權(quán)限服務(wù)等其他的系統(tǒng)服務(wù);
  • 通過(guò)先前創(chuàng)建的Context,得到PMS服務(wù),檢索framework-res的Application信息,然后將它配置到系統(tǒng)的ActivityThread中;
  • 為了能讓AMS同樣可以管理調(diào)度系統(tǒng)進(jìn)程,也創(chuàng)建了一個(gè)關(guān)于系統(tǒng)進(jìn)程的ProcessRecord對(duì)象,ProcessRecord對(duì)象保存一個(gè)進(jìn)程的相關(guān)信息;
  • 然后將它保存到mPidsSelfLocked集合中方便管理;
  • AMS具體是如何將檢索到的framework-res的application信息,配置到ActivityThread中的,需要繼續(xù)分析ActivityThread的installSystemApplicationInfo方法;

接著看installSystemApplicationInfo方法

  1. public void installSystemApplicationInfo(ApplicationInfo info, ClassLoader classLoader) { 
  2.         synchronized (this) { 
  3.             getSystemContext().installSystemApplicationInfo(info, classLoader); 
  4.         } 
  5.     } 

這個(gè)方法中最終調(diào)用上面創(chuàng)建的SystemContext的installSystemApplication方法,那就接著看ConxtextImpl的installSystemApplication方法。

  1. void installSystemApplicationInfo(ApplicationInfo info, ClassLoader classLoader) { 
  2.         mPackageInfo.installSystemApplicationInfo(info, classLoader); 
  3.     } 
  • 它有最終調(diào)用了mPackageInfo的installSystemApplication方法,mPackageInfo就是在創(chuàng)建Context對(duì)象的時(shí)候傳進(jìn)來(lái)的LoadedApk,里面保存了一個(gè)應(yīng)用程序的基本信息;
  • setSystemProcess主要就是設(shè)置系統(tǒng)集成的一些信息,在這里設(shè)置了系統(tǒng)進(jìn)程的Application信息,創(chuàng)建了系統(tǒng)進(jìn)程的ProcessRecord對(duì)象將其保存在進(jìn)程集合中,方便AMS管理調(diào)度;

5、installSystemProvider

  • ActivityManagerService的installSystemProvider方法;
  • Android系統(tǒng)中有很多配置信息都需要保存,這些信息是保存在SettingsProvider中,而這個(gè)SettingsProvider也是運(yùn)行在SystemServer進(jìn)程中的,由于SystemServer進(jìn)程依賴(lài)SettingsProvider,放在一個(gè)進(jìn)程中可以減少進(jìn)程間通信的效率損失;
  • 下面就來(lái)分析下如何將SettingsProvider.apk也加載到SystemServer進(jìn)程中;

  1. public final void installSystemProviders() { 
  2.         List<ProviderInfo> providers; 
  3.         synchronized (this) { 
  4.             //找到名稱(chēng)為”System”的進(jìn)程,就是上一步創(chuàng)建的processRecord對(duì)象 
  5.             ProcessRecord app = mProcessNames.get("system", Process.SYSTEM_UID); 
  6.             //找到所有和system進(jìn)程相關(guān)的ContentProvider 
  7.             providers = generateApplicationProvidersLocked(app); 
  8.             if (providers != null) { 
  9.                 for (int i=providers.size()-1; i>=0; i--) { 
  10.                     ProviderInfo pi = (ProviderInfo)providers.get(i); 
  11.                     //再次確認(rèn)進(jìn)程為system的provider,把不是該進(jìn)程provider移除 
  12.                     if ((pi.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) { 
  13.                         Slog.w(TAG, "Not installing system proc provider " + pi.name 
  14.                                 + ": not system .apk"); 
  15.                         providers.remove(i); 
  16.                     } 
  17.                 } 
  18.             } 
  19.         } 
  20.         if (providers != null) { 
  21.             //把provider安裝到系統(tǒng)的ActivityThread中 
  22.             mSystemThread.installSystemProviders(providers); 
  23.         } 
  24.         mCoreSettingsObserver = new CoreSettingsObserver(this); 
  25.     } 

找到名稱(chēng)為system的進(jìn)程對(duì)象,就是SystemServer進(jìn)程,然后根據(jù)進(jìn)程對(duì)象去查詢(xún)所有有關(guān)的ContentProvider,調(diào)用系統(tǒng)進(jìn)程的主線程ActivityThread安裝所有相關(guān)的ContentProvider,具體是如何查找相關(guān)的contentProvider和如何安裝ContentProvider到系統(tǒng)主線程的,接著分析下面兩個(gè)方法;

  1. private final List<ProviderInfo> generateApplicationProvidersLocked(ProcessRecord app) { 
  2.         List<ProviderInfo> providers = null
  3.         try { 
  4.             //調(diào)用PMS根據(jù)進(jìn)程ID和進(jìn)程名稱(chēng)來(lái)查詢(xún)Provider 
  5.             ParceledListSlice<ProviderInfo> slice = AppGlobals.getPackageManager(). 
  6.                 queryContentProviders(app.processName, app.uid, 
  7.                         STOCK_PM_FLAGS | PackageManager.GET_URI_PERMISSION_PATTERNS); 
  8.             providers = slice != null ? slice.getList() : null
  9.         } catch (RemoteException ex) { 
  10.         } 
  11.         int userId = app.userId; 
  12.         if (providers != null) { 
  13.             int N = providers.size(); 
  14.             for (int i=0; i<N; i++) { 
  15.                 ProviderInfo cpi = 
  16.                     (ProviderInfo)providers.get(i); 
  17.                …… 
  18.                 ComponentName comp = new ComponentName(cpi.packageName, cpi.name); 
  19.            //從AMS管理的contentProvider列表中查詢(xún)對(duì)應(yīng)的provider      
  20. ContentProviderRecord cpr = mProviderMap.getProviderByClass(comp, userId); 
  21.                 if (cpr == null) { 
  22.                     //如果AMS的Provider列表中沒(méi)有對(duì)應(yīng)的Provider實(shí)例,就根據(jù)查詢(xún)的provider信息,創(chuàng)建一個(gè)對(duì)象保存到隊(duì)列中 
  23.                     cpr = new ContentProviderRecord(this, cpi, app.info, comp, singleton); 
  24.                     mProviderMap.putProviderByClass(comp, cpr); 
  25.                 } 
  26.                //同時(shí)將provider保存到processRecord對(duì)象的pubProviders列表中 
  27.                 app.pubProviders.put(cpi.name, cpr); 
  28.                 …… 
  29.             } 
  30.         } 
  31.         return providers; 
  32.     } 

  • 這個(gè)方法就是從PMS中查詢(xún)和SystemServer進(jìn)程相關(guān)的Provider,也就是SettingsProvder,然后將它保存到AMS的contentProvider列表中;
  • 同時(shí)也將它保存到系統(tǒng)進(jìn)程對(duì)象ProcessRecord的變量pubProviders列表中,保存到AMS的provider列表中是因?yàn)锳MS需要管理所有的ContentProvder;
  • 保存到進(jìn)程對(duì)象的pubProviders列表中是因?yàn)椋總€(gè)ContentProvider都需要對(duì)應(yīng)到一個(gè)進(jìn)程中去;
  • 接著看如何將SettingsProvider安裝到系統(tǒng)的主進(jìn)程中去;

  1. private void installContentProviders( 
  2.             Context context, List<ProviderInfo> providers) { 
  3.          …… 
  4.         for (ProviderInfo cpi : providers) { 
  5.             //通過(guò)installProvider方法把provider封裝成一個(gè)ContentProviderHolder對(duì)象,有利于進(jìn)程間傳輸 
  6.             IActivityManager.ContentProviderHolder cph = installProvider(context, null, cpi, 
  7.                     false /*noisy*/, true /*noReleaseNeeded*/, true /*stable*/); 
  8.             if (cph != null) { 
  9.                 cph.noReleaseNeeded = true
  10.                 results.add(cph); 
  11.             } 
  12.         } 
  13.         try { 
  14.             //將上面得到的contentProviderHolder對(duì)象發(fā)布到AMS服務(wù),getApplicationThread代表本地進(jìn)程的一個(gè)binder對(duì)象,binder對(duì)象可跨進(jìn)程傳輸,它在AMS中對(duì)應(yīng)一個(gè)ProcessRecord. 
  15.             ActivityManagerNative.getDefault().publishContentProviders( 
  16.                 getApplicationThread(), results); 
  17.        …… 
  18.     } 
  • 該方法將得到的contentProvider對(duì)象封裝成了contentProviderHolder對(duì)象,其實(shí)就是Binder對(duì)象,這樣就可以進(jìn)程間傳輸了,然后跨進(jìn)程調(diào)用AMS服務(wù)注冊(cè)Provider;
  • AMS負(fù)責(zé)管理ContentProvider,只有將ContentProvider注冊(cè)到AMS服務(wù)其他進(jìn)程才能訪問(wèn);
  • 接著看AMS如何注冊(cè)Provider;

6、publishContentProviders

  1. public final void publishContentProviders(IApplicationThread caller, 
  2.             List<ContentProviderHolder> providers) { 
  3.            …… 
  4.             //根據(jù)調(diào)用者的進(jìn)程得到相應(yīng)的processRecord對(duì)象,就是系統(tǒng)進(jìn)程的ProcessRecord 
  5.             final ProcessRecord r = getRecordForAppLocked(caller); 
  6.            …… 
  7.             final int N = providers.size(); 
  8.             for (int i = 0; i < N; i++) { 
  9.                 //ActivityThread客戶(hù)端傳過(guò)來(lái)的provider src 
  10.                 ContentProviderHolder src = providers.get(i); 
  11.                 //根據(jù)src provider name得到一開(kāi)始保存的進(jìn)程中保存的ProciderRecord 
  12.                 ContentProviderRecord dst = r.pubProviders.get(src.info.name); 
  13.                 if (dst != null) { 
  14.                     ComponentName comp = new ComponentName(dst.info.packageName, dst.info.name); 
  15.                     //按類(lèi)將它保存在mProviderMap中 
  16.                     mProviderMap.putProviderByClass(comp, dst); 
  17.                     String names[] = dst.info.authority.split(";"); 
  18.                     for (int j = 0; j < names.length; j++) { 
  19.                         //按authority保存在mProviderMap中 
  20.                         mProviderMap.putProviderByName(names[j], dst); 
  21.                     } 
  22.                    …… 
  23.                     } 
  • AMS的注冊(cè)服務(wù)就是根據(jù)參數(shù)傳過(guò)來(lái)的provider信息,找到原先進(jìn)程中pubProviders列表中保存的ContentProviderRecord,然后將它分別以類(lèi)為key保存在mProviderMap中,和以authority為key保存在mProviderMap中;
  • 即AMS提供了多種方案來(lái)查找一個(gè)ContentProvider,一種是通過(guò)authority來(lái)查找,一種是指明CompomentName來(lái)查找;
  • 此刻位置一個(gè)SettingsProvider就正式注冊(cè)到SystemServer進(jìn)程中了,所以可以看出installSystemProvider方法的主要工作就是按照普通進(jìn)程類(lèi)似的方式,將SettingsProvider注冊(cè)到系統(tǒng)進(jìn)程中,方便系統(tǒng)進(jìn)程對(duì)settings的配置數(shù)據(jù)進(jìn)行調(diào)用;

7、systemReady

ActivityManagerService的systemReady方法

  1. public void systemReady(final Runnable goingCallback) { 
  2.         synchronized(this) { 
  3.             //初始化Doze模式的controller 
  4.             mLocalDeviceIdleController 
  5.                     = LocalServices.getService(DeviceIdleController.LocalService.class); 
  6.         //重置RecentTasks 
  7.             mRecentTasks.clear(); 
  8.             mRecentTasks.addAll(mTaskPersister.restoreTasksLocked()); 
  9.             mRecentTasks.cleanupLocked(UserHandle.USER_ALL); 
  10.             mTaskPersister.startPersisting(); 
  11.             …… 
  12.             //設(shè)置systemReady為true 
  13.             mSystemReady = true
  14.         } 
  15.         ArrayList<ProcessRecord> procsToKill = null
  16.         //收集那些在AMS之前啟動(dòng)的進(jìn)程 
  17.         synchronized(mPidsSelfLocked) { 
  18.             for (int i=mPidsSelfLocked.size()-1; i>=0; i--) { 
  19.                 ProcessRecord proc = mPidsSelfLocked.valueAt(i); 
  20.                 if (!isAllowedWhileBooting(proc.info)){ 
  21.                     if (procsToKill == null) { 
  22.                         procsToKill = new ArrayList<ProcessRecord>(); 
  23.                     } 
  24.                     procsToKill.add(proc); 
  25.                 } 
  26.             } 
  27.         } 
  28.        //將那些在AMS之前啟動(dòng)的進(jìn)程殺死,有的進(jìn)程不能再AMS之前啟動(dòng) 
  29.         synchronized(this) { 
  30.             if (procsToKill != null) { 
  31.                 for (int i=procsToKill.size()-1; i>=0; i--) { 
  32.                     ProcessRecord proc = procsToKill.get(i); 
  33.                     Slog.i(TAG, "Removing system update proc: " + proc); 
  34.                     removeProcessLocked(proc, truefalse"system update done"); 
  35.                 } 
  36.             } 
  37.         } 
  38.         //從settingsProvider的設(shè)置總初始化部分變量 
  39.         retrieveSettings(); 
  40.         //調(diào)用callback方法,該方法在systemServer代碼中實(shí)現(xiàn) 
  41.         if (goingCallback != null) goingCallback.run(); 
  42.                     //查詢(xún)那些persistent為1的application,并啟動(dòng)他們所在的進(jìn)程 
  43.                     List apps = AppGlobals.getPackageManager(). 
  44.                         getPersistentApplications(STOCK_PM_FLAGS); 
  45.                     if (apps != null) { 
  46.                         int N = apps.size(); 
  47.                         int i; 
  48.                         for (i=0; i<N; i++) { 
  49.                             ApplicationInfo info 
  50.                                 = (ApplicationInfo)apps.get(i); 
  51.                             if (info != null && 
  52.                                     !info.packageName.equals("android")) { 
  53.                                 addAppLocked(info, falsenull /* ABI override */); 
  54.                             } 
  55.             } 
  56.             //啟動(dòng)HomeActivity,也就是launcher程序 
  57.             mBooting = true
  58.             startHomeActivityLocked(mCurrentUserId, "systemReady"); 
  59.            …… 
  60.         } 
  61.     } 

SystemReady方法也是比較長(zhǎng),大致可以分為:

  • 第一:在systemReady的時(shí)候初始化了deviceIdleController等對(duì)象
  • 第二:移除并殺死了那些不該在AMS之前啟動(dòng)的進(jìn)程
  • 第三:執(zhí)行了參數(shù)傳入的回調(diào)函數(shù)
  • 第四:?jiǎn)?dòng)了Launcer界面
  • 第五:?jiǎn)?dòng)那些persistent配置為1的進(jìn)程;
  • 再來(lái)看些systemReady參數(shù)的回調(diào)函數(shù)做了什么工作.
  1. try { 
  2.                     //ams開(kāi)始監(jiān)聽(tīng)native層的crash信息 
  3.                     mActivityManagerService.startObservingNativeCrashes(); 
  4.                 } catch (Throwable e) { 
  5.                     reportWtf("observing native crashes", e); 
  6.                 } 
  7.                 //初始化webVew 
  8.                 WebViewFactory.prepareWebViewInSystemServer(); 
  9.                 try { 
  10.                     //啟動(dòng)systemUI 
  11.                     startSystemUi(context); 
  12.                 } catch (Throwable e) { 
  13.                     reportWtf("starting System UI", e); 

  14.                 } 
  15.                 try { 
  16.                     //調(diào)用其他服務(wù)的systemready方法 
  17.                     if (networkScoreF != null) networkScoreF.systemReady(); 
  18.                 } catch (Throwable e) { 
  19.                     reportWtf("making Network Score Service ready", e); 
  20.                 } 

這個(gè)回調(diào)函數(shù)中主要工作就是啟動(dòng)systemUI并調(diào)用其他服務(wù)的systemReady方法,SystemReady函數(shù)完成了系統(tǒng)就緒的必要的工作,啟動(dòng)了HomeActivity和SystemUI,然后Android系統(tǒng)就全部啟動(dòng)了;

總結(jié)

AMS服務(wù)啟動(dòng)主要分為幾個(gè)步驟:

  • 調(diào)用AMS的構(gòu)造方法和start方法,對(duì)AMS必要的內(nèi)容進(jìn)行初始化;
  • 將函數(shù)AMS注冊(cè)到ServiceManager中,同時(shí)對(duì)systemServer進(jìn)程也創(chuàng)建了一個(gè)ProcessRecord對(duì)象,并設(shè)置Context的appliation為framework-res的application對(duì)象;
  • 將settingsProvider加載到系統(tǒng)進(jìn)程systemServer中;
  • 調(diào)用systemReady方法做一些啟動(dòng)前的就緒工作,并啟動(dòng)了HomeActivity和SystemUI;

本文轉(zhuǎn)載自微信公眾號(hào)「Android開(kāi)發(fā)編程」

 

責(zé)任編輯:姜華 來(lái)源: Android開(kāi)發(fā)編程
相關(guān)推薦

2011-03-23 11:01:55

LAMP 架構(gòu)

2010-09-07 14:21:22

PPPoE協(xié)議

2022-04-12 08:30:45

TomcatWeb 應(yīng)用Servlet

2009-12-16 16:39:01

Visual Stud

2009-06-10 18:12:38

Equinox動(dòng)態(tài)化OSGi動(dòng)態(tài)化

2022-08-30 07:00:18

執(zhí)行引擎Hotspot虛擬機(jī)

2009-12-14 14:50:46

Ruby傳參數(shù)

2023-02-01 08:13:30

Redis內(nèi)存碎片

2011-09-01 13:51:52

JavaScript

2010-03-08 14:53:48

Linux分區(qū)

2009-07-03 11:14:57

2011-06-28 14:11:33

JavaScript

2014-10-30 15:08:21

快速排序編程算法

2009-04-13 16:37:33

JSPWeb標(biāo)簽

2015-08-03 09:54:26

Java線程Java

2018-10-25 15:24:10

ThreadLocal內(nèi)存泄漏Java

2018-12-18 10:11:37

軟件復(fù)雜度軟件系統(tǒng)軟件開(kāi)發(fā)

2021-04-13 12:55:06

SpringMVC解析器接口

2023-08-07 07:44:44

2020-12-07 06:23:48

Java內(nèi)存
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美激情 一区 | 国产精品视频久久 | 天天天操操操 | 夜夜精品视频 | av大全在线 | www.性色| 国产欧美一区二区三区日本久久久 | 欧美日韩成人一区二区 | 久久精品欧美一区二区三区不卡 | 亚洲国产情侣自拍 | av在线一区二区三区 | 在线观看视频h | 久久久久久久一区二区三区 | 国产精品一区二区三区四区 | 欧美一级视频免费看 | 成人精品一区二区 | 欧美日韩国产一区二区 | 久久久蜜桃 | 久久久精品影院 | 欧美综合一区二区三区 | 一区二区三区四区av | 国产大片黄色 | 欧美日韩在线一区二区 | zzzwww在线看片免费 | 成人精品久久久 | 久久亚洲欧美日韩精品专区 | 中文字幕日韩三级 | 久久久久欧美 | 亚洲一区二区免费电影 | 国产精品视频久久 | 天天搞天天操 | 亚洲不卡在线观看 | 精品欧美色视频网站在线观看 | 久久新视频 | 天天操天天射综合网 | 久久久久久亚洲国产精品 | a黄视频 | 亚洲视频一区在线观看 | 国产精品99| 色999日韩 | 一区欧美|