精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深入分析AMS啟動流程

移動開發 Android
AMS(ActivityManagerService)Android的核心服務之一,對于framework各個核心服務,如果不是專門去做framework開發,先了解其基本的流程機制,再慢慢深究;今天我們就來學習下AMS.

[[432146]]

前言

AMS(ActivityManagerService)Android的核心服務之一,對于framework各個核心服務,如果不是專門去做framework開發,先了解其基本的流程機制,再慢慢深究;

今天我們就來學習下AMS

一、AMS功能概述

1、AMS介紹

  • AMS是Android中最核心的服務,主要負責系統中四大組件的啟動、切換、調度及應用進程的管理和調度等工作,其職責與操作系統中的進程管理和調度模塊相類似,因此它在Android中非常重要;
  • 組件狀態管理:包括四大組件的開啟,關閉等一系列操作,如startActivity,startActivityAndWait,activityPaused,startService,stopService,removeContentProvider等;
  • 組件狀態查詢:查詢組件當前運行等情況。如getCallingActivity,getService等;
  • Task相關:包括removeTask,removeSubTask,moveTaskBackwards,moveTaskToFront等;
  • AMS是通過ActivityStack及其他數據結構來記錄,管理系統中的Activity及其他組件狀態的,并提供查詢功能的一個系統服務;

2、AMS中重要的數據結構

ActivityRecord:記錄了Activity的所有信息,因此它用來描述一個activity。它是在activity啟動時被創建的,具體是在ActivityStarter的startActivity()中被創建的。它存儲的信息主要包括以下內容:

  • service:AMS的引用
  • info:ActivityInfo,Activity中代碼和AndroidManifest設置的節點信息,如launchMode
  • launcherFromPackage:啟動activity的包名
  • taskAffinity:activity希望歸屬的棧
  • task:TaskRecord,Activity所在的TaskRecord
  • app:ProcessRecord,ActivityRecord所在的應用程序進程
  • state:ActivityState,當前activity的狀態
  • icon:Activity的圖標資源和標致符
  • theme:Activity的主題資源標識符

TaskRecord:用來描述一個Activity任務棧

  • taskId:任務棧的唯一標識符
  • affinity:任務棧的傾向性
  • Intent:啟動這個activity的intent
  • mActivites:ArrayList,按照歷史順序排列的Activity記錄
  • mStack:ActivityStack,當前歸屬的ActivityStack
  • mService:AMS的引用

ActivityStack:用來管理系統所有的Activity,內部維護了Activity的所有狀態,特殊狀態的Activity以及和Activity相關的列表等數據;

 

 

二、AMS服務的啟動流程詳解

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中關于AMS啟動時的幾個關鍵方法,主要分為4個步驟

  • 創建AMS對象,并啟動服務
  • 將AMS所在的系統進程,添加到進程管理中去
  • 為系統進程安裝ContentProvider對象
  • 在systemReady方法中做善后操作
  • 一個一個的來看先這些方法的作用,這些方法就是AMS的啟動和初始化過程;

2、ActivityManagerService

啟動ActivityManagerService的方法

mActivityManagerService = mSystemServiceManager.startService(

ActivityManagerService.Lifecycle.class).getService();

AMS服務同樣是通過SystemServiceManager來啟動的,那我們首先來看ActivityManagerService.Lifecycle的構造方法,然后在來看它的Start函數;

Lifecycle的構造方法中很簡單就是構造一個AMS的對象

mService = new ActivityManagerService(context);

創建AMS對象的時候需要傳遞一個Context作為參數,那這個mSystemContext是就是上面創建的系統Context;

接著看AMS的構造方法;

  1. public ActivityManagerService(Context systemContext) { 
  2. //系統的context         
  3. mContext = systemContext; 
  4.     //獲得系統的ActivityThread 
  5.         mSystemThread = ActivityThread.currentActivityThread(); 
  6.     //創建一個HandlerThread用來處理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.     //初始化廣播的隊列 
  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相關的容器 
  20.         mServices = new ActiveServices(this); 
  21.     //初始化Provider相關的Map,里面保存了注冊的ContentProvider 
  22.         mProviderMap = new ProviderMap(this); 
  23.         //初始化并創建data/system/目錄 
  24.         File dataDir = Environment.getDataDirectory(); 
  25.         File systemDir = new File(dataDir, "system"); 
  26.         systemDir.mkdirs(); 
  27.     //初始化電量統計服務相關的信息 
  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.     //初始化系統統計服務,用于統計系統的運行信息 
  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.         //創建系統的第一個user,userID為0,該用戶具有管理員權限 
  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.         //初始化字體語言等配置信息 
  46.         mConfiguration.setToDefaults(); 
  47.         mConfiguration.setLocale(Locale.getDefault()); 
  48.      ……; 
  49.         mRecentTasks = new RecentTasks(this); 
  50.     //初始化StackSupervisor,該類是Activity啟動和調度的核心類 
  51.         mStackSupervisor = new ActivityStackSupervisor(this, mRecentTasks); 
  52.         mTaskPersister = new TaskPersister(systemDir, mStackSupervisor, mRecentTasks); 
  • AMS的構造方法主要是在做一些初始化的先關操作;
  • 保存了自己的運行環境的Context和ActivityThread;
  • AMS負責調度四大組件,所以會初始化broadcast,service和contentProvider相關的變量,接著初始化了電量統計服務,創建了系統的第一個用戶,初始化了基本的配置信息,還創建了Activity調度的核心類,因為Activity調度比較復雜,Activity相關的信息初始化會在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方法很簡單,只是啟動了幾個服務,并把AMS服務自己保存到localService中供程序內部調用;
  • AMS的構造方法和start方法中做了AMS服務一些變量的初始化和相關服務的初始化。接著看下一個重要的方法setSystemProcess;

4、setSystemProcess

ActivityManagerService的setSystemProcess方法

  1. public void setSystemProcess() { 
  2.         try { 
  3.     //將AMS注冊到ServiceManager中 
  4.             ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true); 
  5.     //注冊其他服務到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.     //注冊權限服務到ServiceMananger中 
  14.             ServiceManager.addService("permission", new PermissionController(this)); 
  15.             ServiceManager.addService("processinfo", new ProcessInfoService(this)); 
  16.     //從PMS中查詢包名為android的application,即framework-res的Application信息 
  17.             ApplicationInfo info = mContext.getPackageManager().getApplicationInfo( 
  18.                     "android", STOCK_PM_FLAGS); 
  19.         //將application信息配置到開始創建的activityThread中 
  20.             mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader()); 
  21.             synchronized (this) { 
  22.         //創建了一個ProcessRecord對象,該對象中保存著系統ongoing服務的進程信息 
  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.         然后將系統進程的processRecord對象也添加到mPidsSelfLocked集合中,和普通應用的進程一樣,接收AMS的管理調度 
  30.                     mPidsSelfLocked.put(app.pid, app); 
  31.                 } 
  32.         //更細進程管理的調度信息 
  33.                 updateLruProcessLocked(app, falsenull); 
  34.                 updateOomAdjLocked(); 
  35.             } 
  • setSystemProcess方法中,首先將自己AMS服務注冊到了ServiceManager中,然后又注冊了權限服務等其他的系統服務;
  • 通過先前創建的Context,得到PMS服務,檢索framework-res的Application信息,然后將它配置到系統的ActivityThread中;
  • 為了能讓AMS同樣可以管理調度系統進程,也創建了一個關于系統進程的ProcessRecord對象,ProcessRecord對象保存一個進程的相關信息;
  • 然后將它保存到mPidsSelfLocked集合中方便管理;
  • AMS具體是如何將檢索到的framework-res的application信息,配置到ActivityThread中的,需要繼續分析ActivityThread的installSystemApplicationInfo方法;

接著看installSystemApplicationInfo方法

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

這個方法中最終調用上面創建的SystemContext的installSystemApplication方法,那就接著看ConxtextImpl的installSystemApplication方法。

  1. void installSystemApplicationInfo(ApplicationInfo info, ClassLoader classLoader) { 
  2.         mPackageInfo.installSystemApplicationInfo(info, classLoader); 
  3.     } 
  • 它有最終調用了mPackageInfo的installSystemApplication方法,mPackageInfo就是在創建Context對象的時候傳進來的LoadedApk,里面保存了一個應用程序的基本信息;
  • setSystemProcess主要就是設置系統集成的一些信息,在這里設置了系統進程的Application信息,創建了系統進程的ProcessRecord對象將其保存在進程集合中,方便AMS管理調度;

5、installSystemProvider

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

  1. public final void installSystemProviders() { 
  2.         List<ProviderInfo> providers; 
  3.         synchronized (this) { 
  4.             //找到名稱為”System”的進程,就是上一步創建的processRecord對象 
  5.             ProcessRecord app = mProcessNames.get("system", Process.SYSTEM_UID); 
  6.             //找到所有和system進程相關的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.                     //再次確認進程為system的provider,把不是該進程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安裝到系統的ActivityThread中 
  22.             mSystemThread.installSystemProviders(providers); 
  23.         } 
  24.         mCoreSettingsObserver = new CoreSettingsObserver(this); 
  25.     } 

找到名稱為system的進程對象,就是SystemServer進程,然后根據進程對象去查詢所有有關的ContentProvider,調用系統進程的主線程ActivityThread安裝所有相關的ContentProvider,具體是如何查找相關的contentProvider和如何安裝ContentProvider到系統主線程的,接著分析下面兩個方法;

  1. private final List<ProviderInfo> generateApplicationProvidersLocked(ProcessRecord app) { 
  2.         List<ProviderInfo> providers = null
  3.         try { 
  4.             //調用PMS根據進程ID和進程名稱來查詢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列表中查詢對應的provider      
  20. ContentProviderRecord cpr = mProviderMap.getProviderByClass(comp, userId); 
  21.                 if (cpr == null) { 
  22.                     //如果AMS的Provider列表中沒有對應的Provider實例,就根據查詢的provider信息,創建一個對象保存到隊列中 
  23.                     cpr = new ContentProviderRecord(this, cpi, app.info, comp, singleton); 
  24.                     mProviderMap.putProviderByClass(comp, cpr); 
  25.                 } 
  26.                //同時將provider保存到processRecord對象的pubProviders列表中 
  27.                 app.pubProviders.put(cpi.name, cpr); 
  28.                 …… 
  29.             } 
  30.         } 
  31.         return providers; 
  32.     } 

  • 這個方法就是從PMS中查詢和SystemServer進程相關的Provider,也就是SettingsProvder,然后將它保存到AMS的contentProvider列表中;
  • 同時也將它保存到系統進程對象ProcessRecord的變量pubProviders列表中,保存到AMS的provider列表中是因為AMS需要管理所有的ContentProvder;
  • 保存到進程對象的pubProviders列表中是因為,每個ContentProvider都需要對應到一個進程中去;
  • 接著看如何將SettingsProvider安裝到系統的主進程中去;

  1. private void installContentProviders( 
  2.             Context context, List<ProviderInfo> providers) { 
  3.          …… 
  4.         for (ProviderInfo cpi : providers) { 
  5.             //通過installProvider方法把provider封裝成一個ContentProviderHolder對象,有利于進程間傳輸 
  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對象發布到AMS服務,getApplicationThread代表本地進程的一個binder對象,binder對象可跨進程傳輸,它在AMS中對應一個ProcessRecord. 
  15.             ActivityManagerNative.getDefault().publishContentProviders( 
  16.                 getApplicationThread(), results); 
  17.        …… 
  18.     } 
  • 該方法將得到的contentProvider對象封裝成了contentProviderHolder對象,其實就是Binder對象,這樣就可以進程間傳輸了,然后跨進程調用AMS服務注冊Provider;
  • AMS負責管理ContentProvider,只有將ContentProvider注冊到AMS服務其他進程才能訪問;
  • 接著看AMS如何注冊Provider;

6、publishContentProviders

  1. public final void publishContentProviders(IApplicationThread caller, 
  2.             List<ContentProviderHolder> providers) { 
  3.            …… 
  4.             //根據調用者的進程得到相應的processRecord對象,就是系統進程的ProcessRecord 
  5.             final ProcessRecord r = getRecordForAppLocked(caller); 
  6.            …… 
  7.             final int N = providers.size(); 
  8.             for (int i = 0; i < N; i++) { 
  9.                 //ActivityThread客戶端傳過來的provider src 
  10.                 ContentProviderHolder src = providers.get(i); 
  11.                 //根據src provider name得到一開始保存的進程中保存的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.                     //按類將它保存在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的注冊服務就是根據參數傳過來的provider信息,找到原先進程中pubProviders列表中保存的ContentProviderRecord,然后將它分別以類為key保存在mProviderMap中,和以authority為key保存在mProviderMap中;
  • 即AMS提供了多種方案來查找一個ContentProvider,一種是通過authority來查找,一種是指明CompomentName來查找;
  • 此刻位置一個SettingsProvider就正式注冊到SystemServer進程中了,所以可以看出installSystemProvider方法的主要工作就是按照普通進程類似的方式,將SettingsProvider注冊到系統進程中,方便系統進程對settings的配置數據進行調用;

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.             //設置systemReady為true 
  13.             mSystemReady = true
  14.         } 
  15.         ArrayList<ProcessRecord> procsToKill = null
  16.         //收集那些在AMS之前啟動的進程 
  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之前啟動的進程殺死,有的進程不能再AMS之前啟動 
  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的設置總初始化部分變量 
  39.         retrieveSettings(); 
  40.         //調用callback方法,該方法在systemServer代碼中實現 
  41.         if (goingCallback != null) goingCallback.run(); 
  42.                     //查詢那些persistent為1的application,并啟動他們所在的進程 
  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.             //啟動HomeActivity,也就是launcher程序 
  57.             mBooting = true
  58.             startHomeActivityLocked(mCurrentUserId, "systemReady"); 
  59.            …… 
  60.         } 
  61.     } 

SystemReady方法也是比較長,大致可以分為:

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

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

這個回調函數中主要工作就是啟動systemUI并調用其他服務的systemReady方法,SystemReady函數完成了系統就緒的必要的工作,啟動了HomeActivity和SystemUI,然后Android系統就全部啟動了;

總結

AMS服務啟動主要分為幾個步驟:

  • 調用AMS的構造方法和start方法,對AMS必要的內容進行初始化;
  • 將函數AMS注冊到ServiceManager中,同時對systemServer進程也創建了一個ProcessRecord對象,并設置Context的appliation為framework-res的application對象;
  • 將settingsProvider加載到系統進程systemServer中;
  • 調用systemReady方法做一些啟動前的就緒工作,并啟動了HomeActivity和SystemUI;

本文轉載自微信公眾號「Android開發編程」

 

責任編輯:姜華 來源: Android開發編程
相關推薦

2010-09-07 14:21:22

PPPoE協議

2022-04-12 08:30:45

TomcatWeb 應用Servlet

2011-03-23 11:01:55

LAMP 架構

2010-03-08 14:53:48

Linux分區

2023-02-01 08:13:30

Redis內存碎片

2011-09-01 13:51:52

JavaScript

2025-09-16 10:57:31

2009-12-16 16:39:01

Visual Stud

2009-06-10 18:12:38

Equinox動態化OSGi動態化

2009-12-14 14:50:46

Ruby傳參數

2022-08-30 07:00:18

執行引擎Hotspot虛擬機

2011-09-13 09:08:22

架構

2018-12-18 10:11:37

軟件復雜度軟件系統軟件開發

2013-11-14 17:02:41

Android多窗口

2023-08-07 07:44:44

2021-04-13 12:55:06

SpringMVC解析器接口

2015-08-03 09:54:26

Java線程Java

2020-12-07 06:23:48

Java內存

2018-10-25 15:24:10

ThreadLocal內存泄漏Java

2011-06-28 14:11:33

JavaScript
點贊
收藏

51CTO技術棧公眾號

亚洲一区二区三区四区精品| 日韩av一区二区三区在线观看| 国产乱国产乱老熟300| 亚洲免费一区三区| 午夜精品久久久久影视| 日本视频精品一区| 国产精品国产三级国产普通话对白| 亚洲高清影视| 亚洲精品一区二区网址| 99re精彩视频| 爱草tv视频在线观看992| 久久久久久久av麻豆果冻| 国产精品自拍偷拍| 日本在线观看视频网站| 青青草原综合久久大伊人精品| 欧美日韩精品一区视频| 丁香六月激情婷婷| 在线激情小视频| 99久久精品一区二区| 国产精品视频一| 日本在线视频免费| 天天综合网91| 亚洲欧美成人网| www.欧美com| 黄色日韩网站| 色综合婷婷久久| 免费看欧美黑人毛片| 日本在线观看www| 91浏览器在线视频| 国产精品v欧美精品v日韩| 久久久久久av无码免费看大片| 精品福利av| 久久久国产一区二区三区| 波多野结衣一本| 国内自拍欧美| 欧美刺激午夜性久久久久久久| 污色网站在线观看| 91av亚洲| 欧美日韩国产精品一区二区不卡中文 | 亚洲午夜精品视频| 国产性生活毛片| 日韩三级av高清片| 91精品国产综合久久香蕉的特点| 老司机午夜av| 成人美女大片| 日韩欧美成人免费视频| 日韩一级性生活片| 免费在线观看的电影网站| 中文字幕一区二区三区精华液| 三区精品视频| 国产福利在线| 欧美国产综合色视频| 欧美一区1区三区3区公司| 天天操天天射天天| av激情亚洲男人天堂| 精品国产免费久久久久久尖叫| 亚洲经典一区二区| 国产aⅴ精品一区二区三区色成熟| 91午夜在线播放| 国产麻豆91视频| 国产美女一区二区| 99国产超薄丝袜足j在线观看| 国产精品国产三级国产普通话对白 | 成人毛片视频免费看| 国产99久久久国产精品潘金网站| 亚洲综合在线中文字幕| www.亚洲黄色| 99久久精品99国产精品| 精品一区二区不卡| 蜜芽tv福利在线视频| 国产清纯在线一区二区www| 日韩精品电影网站| 午夜在线小视频| 日韩毛片高清在线播放| 久久久久久久久网| h片精品在线观看| 狠狠干狠狠久久| 黄色成人免费看| 日韩一区二区三区四区五区| 日韩欧美黄色影院| 亚洲一区二区三区四区av| 日韩激情啪啪| 视频直播国产精品| 激情五月婷婷在线| 久久国产精品亚洲77777| 国产精品电影观看| 国产三级视频在线播放| 成人爱爱电影网址| 欧美一二三四五区| 国产精品剧情| 精品国产91乱高清在线观看 | 国产麻豆视频一区二区| 国产精品yjizz| 国产永久免费高清在线观看| 中文字幕一区三区| 青青青青草视频| 成人av色网站| 亚洲精品一区二区三区蜜桃下载| 无码国产69精品久久久久同性| 99精品视频在线| 911国产网站尤物在线观看| 中文字幕在线观看欧美| 国产成人亚洲综合a∨婷婷 | 国产资源在线观看| 亚洲免费观看高清完整版在线观看熊| 可以看毛片的网址| 成人黄色免费网站| 亚洲国产精久久久久久| 美女网站视频色| 99国产精品私拍| 91久久国产精品| 六十路在线观看| 亚洲最新视频在线播放| 啊啊啊国产视频| 美女一区2区| 欧美成人黄色小视频| 337p粉嫩色噜噜噜大肥臀| 国产成人在线视频网址| 亚洲欧美日本国产有色 | 97久久视频| 97在线免费观看| 精品久久久中文字幕人妻| 久久精品视频网| 国产综合中文字幕| 国产精品中文| 神马久久久久久| 国产精品久久久久久人| 国产成人精品免费网站| 色香蕉在线观看| а√天堂资源国产精品| 亚洲人成网站免费播放| 日韩成年人视频| 99只有精品| 精品日韩av一区二区| 九九九视频在线观看| 亚洲精一区二区三区| 2019国产精品视频| 日本网站在线免费观看视频| 日韩欧美高清在线视频| 日韩精品人妻中文字幕有码| 欧美成人精品| 91在线网站视频| 日本中文字幕在线播放| 日本久久电影网| 草草影院第一页| 亚洲专区免费| 久久riav| 亚洲综合电影| 亚洲精品成人网| 久久精品视频国产| 成人教育av在线| 成人免费性视频| 国产精品x8x8一区二区| 久久免费国产视频| 秋霞av鲁丝片一区二区| 亚洲成人福利片| 在线xxxxx| 亚洲在线日韩| 亚洲高清精品中出| 91精品一久久香蕉国产线看观看| 久久视频免费观看| 国产999久久久| 亚洲国产欧美日韩另类综合| a天堂视频在线观看| 日韩一级免费| 日韩欧美精品在线不卡| 国产精品久久乐| 美女黄色丝袜一区| 亚洲精品福利网站| 欧美日韩国产一区二区| 日韩人妻无码精品综合区| 免费高清不卡av| 在线综合视频网站| 亚洲精品在线国产| 国产91成人video| 在线观看黄色av| 日韩欧美成人激情| 日本熟妇乱子伦xxxx| 国产亚洲欧美一区在线观看| 天天干天天操天天做| 激情久久久久久久| 欧美日韩一区二区三区在线观看免 | 久久九九久精品国产免费直播| 激情综合网俺也去| 中文字幕乱码亚洲无线精品一区| 国产三区二区一区久久| 黄色精品视频| 欧美夫妻性生活xx| 久久视频www| 欧美一级在线观看| 秋霞精品一区二区三区| 中文字幕在线观看一区| 北京富婆泄欲对白| 免费精品视频最新在线| 欧美狂野激情性xxxx在线观| 美女毛片一区二区三区四区| 亚洲aa在线观看| 成人日韩在线| 久久久久久国产| 亚洲麻豆精品| 亚洲欧美在线第一页| 精品黑人一区二区三区在线观看 | 理论片中文字幕| 欧美色窝79yyyycom| 黄网站免费在线| 日韩一区中文字幕| 91玉足脚交白嫩脚丫| 黄网站免费久久| 成人在线免费播放视频| 激情欧美日韩| 国产盗摄视频在线观看| 国产精品美女久久久久久不卡 | 性中国xxx极品hd| 欧美亚洲日本国产| 99热只有这里有精品| 一区二区三区欧美亚洲| 欧洲性xxxx| 久久婷婷久久一区二区三区| 91人妻一区二区| 国产米奇在线777精品观看| 九色porny91| 免费欧美日韩| 欧美,日韩,国产在线| 欧美在线三区| 裸体大乳女做爰69| 日本一本不卡| 日韩电影免费观看在| 欧洲vs亚洲vs国产| 粉嫩精品一区二区三区在线观看 | 极品色av影院| 亚洲国产成人一区二区三区| 欧美做受高潮6| 国产亚洲综合在线| 中文字幕一二三四区| aaa亚洲精品一二三区| 成人一区二区三区仙踪林| 精品亚洲欧美一区| 五月婷婷六月丁香激情| 日韩av高清在线观看| 欧美少妇性生活视频| 欧美专区一区二区三区| 国产免费黄色av| 国产日韩1区| 免费无遮挡无码永久视频| 亚洲福利精品| 国产精品333| 亚洲欧美成人| 黄色国产小视频| 蜜臀av性久久久久蜜臀av麻豆| 国产又大又黄又粗的视频| 奇米777欧美一区二区| 一区二区在线播放视频| 日本美女一区二区| 欧美午夜aaaaaa免费视频| 男女性色大片免费观看一区二区 | 国产精品毛片大码女人| 91成人精品一区二区| 中文字幕一区二区三区在线播放 | 亚洲欧美亚洲| 激情五月婷婷六月| 伊人久久久大香线蕉综合直播| 日韩中文字幕在线免费| 亚洲永久字幕| 久久国产这里只有精品| 国内欧美视频一区二区| 免费黄色av网址| 91麻豆国产精品久久| 久操视频在线观看免费| 日韩毛片视频在线看| 国产一级片视频| 日本久久一区二区三区| 91麻豆国产在线| 精品国产一区久久| 四虎国产精品永远| 国产一区二区黄| 成人无遮挡免费网站视频在线观看| 欧美老肥婆性猛交视频| 欧美裸体视频| 国产专区欧美专区| 另类在线视频| 中文字幕日韩精品久久| 欧美三级免费| 天天影视综合色| 国产a久久麻豆| 久久久精品成人| 亚洲一区二区三区爽爽爽爽爽| 中文在线第一页| 91精品国产欧美一区二区18| 香蕉久久国产av一区二区| 最近2019免费中文字幕视频三| 丝袜国产在线| 国产精品视频午夜| av成人综合| 神马影院我不卡| 亚洲黄色高清| 亚洲欧美日韩综合网| av一本久道久久综合久久鬼色| 少妇太紧太爽又黄又硬又爽小说| 亚洲午夜一区二区| 中文字幕乱码视频| 精品99久久久久久| 欧美猛烈性xbxbxbxb| 97色在线观看| 国产美女视频一区二区| 日韩av电影免费播放| 亚洲精品极品| 亚欧精品在线视频| 欧美国产亚洲另类动漫| 亚洲精品视频在线观看免费视频| 欧美久久久久久蜜桃| 青草久久伊人| 国模精品视频一区二区| 免费看日产一区二区三区| 日韩免费电影一区二区三区| 亚洲精品欧洲| 日本成人在线免费观看| 国产精品嫩草影院com| 欧美videossex极品| 欧美不卡123| a毛片在线看免费观看| 国产精品极品尤物在线观看| 免费看成人人体视频| 妺妺窝人体色www看人体| 精品在线播放午夜| 亚洲图片第一页| 欧美在线免费观看视频| 欧美色视频免费| 韩剧1988在线观看免费完整版| 亚洲一区二区三区免费| 中文字幕一区二区三区最新| 人人精品人人爱| 婷婷色一区二区三区| 黑人精品xxx一区一二区| 日本韩国免费观看| 欧美黑人又粗大| 51精品国产| 精品国产一区二区三区无码| 国产精品99久久久久久有的能看 | 99久久www免费| 亚洲xxx在线观看| 综合网在线视频| 999av视频| 色综合久综合久久综合久鬼88| 精品国产亚洲一区二区三区在线 | 欧美日一区二区三区| 欧洲精品一区色| 久久综合图片| 蜜臀久久99精品久久久久久| 91国在线观看| 777电影在线观看| 国产日韩在线播放| 国产二区精品| 在线观看一区二区三区视频| 亚洲综合一二区| 污污视频在线观看网站| 欧美黑人性生活视频| 久久黄色影视| 国产精彩免费视频| 国产精品视频第一区| 国产麻豆精品一区| 欧美激情免费在线| 日韩理论电影中文字幕| 成人在线看视频| 国产精品网友自拍| 国产美女无遮挡永久免费| 欧美久久精品一级黑人c片| 粉嫩av一区二区| 成人免费观看视频在线观看| 国产欧美一区二区三区网站| 97人妻精品一区二区三区动漫| 欧美精品免费看| 日本亚洲不卡| 老司机久久精品| 亚洲成av人片| 成人综合影院| 999精品在线观看| 久久成人精品| 多男操一女视频| 亚洲国产成人久久| 欧美与亚洲与日本直播| 麻豆传媒网站在线观看| 91丝袜高跟美女视频| 国产精品无码AV| 18性欧美xxxⅹ性满足| 91亚洲国产高清| 91黄色免费视频| 欧美高清视频一二三区| av丝袜在线| 在线免费观看一区二区三区| 成人高清在线视频| 一级黄色大片网站| 97视频在线观看成人| 97久久夜色精品国产| 中文字幕一区二区人妻在线不卡| 欧美日产在线观看| 性国裸体高清亚洲| 国产又粗又硬又长| 国产视频一区在线播放| 国产91久久久| 成人黄色免费网站在线观看|