ActivityManagerService啟動分析

AMS系列:
1、Activity生命周期、啟動模式和隱式啟動總結
2、本文ActivityManagerService啟動分析
3、ActivityMnagerService分析之啟動一個Acitvity流程分析

本文分析代碼基于Android N,ActivityManagerService簡稱AMS,其它類似;
“...”代表省略部分代碼

整體思路

1、android啟動linux內核,加載虛擬機,走到framework啟動Systemserver;
2、Systemserver啟動Activity Manager,Package Manager,Window Manager等等一系列系統服務;
3、分析AMS的啟動;
4、本文主要分析AMS初始化干了些什么,其他細節后續再分析;

簡述Android啟動

簡單說一下Android的啟動過程:
Android基于Linux,前面和Linux大致相同
按下電源 -> BIOS自檢 -> 引導程序 -> 啟動kernel -> 啟動Init進程(system\core\init\init.c) -> 開啟虛擬機(Zygotes)
然后
Zygote會startSystemServer,而Systemserver就開始啟動framework層的各種公共服務,AMS、WMS、PMS等...

Systemserver啟動AMS

從Systemserver.run開始,這里開始啟動各種服務

private void run() {
    ....
    // 初始化system Context
    createSystemContext();

    // 創建system manager
    mSystemServiceManager = new SystemServiceManager(mSystemContext);
    LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
    ...
    // Start services.
    try {
        Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartServices");
        // 開始引導Services,Installer創建user/data等目錄,
        // 以及MessageMonitorService,AMS,PowerManagerService,LightsService,DisplayManagerService,UserManagerService等
        startBootstrapServices();
        // 核心Services,BatteryService,UsageStatsService,WebViewUpdateService
        startCoreServices();
        // 其他Services,這里啟動的服務最多,TelecomLoaderService,CameraService,AccountManagerService等等一系列Service
        startOtherServices();
    } 
    ...
    // Loop forever.
    Looper.loop();
    ...
}

其他服務的啟動這里就不展開了,這里開始看AMS的啟動

private void startBootstrapServices() {
    ...
    // 創建AMS
    mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();
    // 設置對象關聯
    mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);
    ...
        // 初始化power manager
    mActivityManagerService.initPowerManagement();
    ...
    // 為系統進程設置應用程序實例
        mActivityManagerService.setSystemProcess();
}
private void startOtherServices() {
    ...
    // 和SettingsProvider關聯
    mActivityManagerService.installSystemProviders();
    ...
    // 設置對象關聯
    mActivityManagerService.setWindowManager(wm);
    ...
    // 當AMS準備好后,再啟動。類似location的服務很多,在ready之前已經創建服務并添加到ServiceManager中
    mActivityManagerService.systemReady(new Runnable() {
        ...
        startSystemUi(context);
        ...
        Watchdog.getInstance().start();
        ...
        if (locationF != null) locationF.systemRunning();
        ...
        ...
    }
}

1.創建ActivityManagerService

mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
實際就是返回一個new ActivityManagerService(context);

    public ActivityManagerService(Context systemContext) {
    // Context 和 ActvityThread
        mContext = systemContext;
        mFactoryTest = FactoryTest.getMode();
        mSystemThread = ActivityThread.currentActivityThread();

    // AMS運行的線程和Handler,還有顯示相關的UiHandler
        mHandlerThread = new ServiceThread(TAG,
                android.os.Process.THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
        mHandlerThread.start();
        mHandler = new MainHandler(mHandlerThread.getLooper());
        mUiHandler = new UiHandler();

        /* static; one-time init here */
        if (sKillHandler == null) {
            sKillThread = new ServiceThread(TAG + ":kill",
                    android.os.Process.THREAD_PRIORITY_BACKGROUND, true /* allowIo */);
            sKillThread.start();
            sKillHandler = new KillHandler(sKillThread.getLooper());
        }

    // Broadcast管理的相關初始化
        mFgBroadcastQueue = new BroadcastQueue(this, mHandler,
                "foreground", BROADCAST_FG_TIMEOUT, false);
        mBgBroadcastQueue = new BroadcastQueue(this, mHandler,
                "background", BROADCAST_BG_TIMEOUT, true);
        mBroadcastQueues[0] = mFgBroadcastQueue;
        mBroadcastQueues[1] = mBgBroadcastQueue;

    // Server管理的相關初始化
        mServices = new ActiveServices(this);
    // Provider管理的相關初始化
        mProviderMap = new ProviderMap(this);
    // App錯誤控制
        mAppErrors = new AppErrors(mContext, this);

        // 創建system文件路徑
        File dataDir = Environment.getDataDirectory();
        File systemDir = new File(dataDir, "system");
        systemDir.mkdirs();
    // 初始化BatteryStatsService
        mBatteryStatsService = new BatteryStatsService(systemDir, mHandler);
        mBatteryStatsService.getActiveStatistics().readLocked();
        mBatteryStatsService.scheduleWriteToDisk();
        mOnBattery = DEBUG_POWER ? true
                : mBatteryStatsService.getActiveStatistics().getIsOnBattery();
        mBatteryStatsService.getActiveStatistics().setCallback(this);

    // ProcessStatsService進程來統計不用的app以及不好行為的app的信息
        mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats"));

    // 權限管理,安全機制
        mAppOpsService = new AppOpsService(new File(systemDir, "appops.xml"), mHandler);
        mAppOpsService.startWatchingMode(AppOpsManager.OP_RUN_IN_BACKGROUND, null,
                new IAppOpsCallback.Stub() {
                    @Override public void opChanged(int op, int uid, String packageName) {
                        if (op == AppOpsManager.OP_RUN_IN_BACKGROUND && packageName != null) {
                            if (mAppOpsService.checkOperation(op, uid, packageName)
                                    != AppOpsManager.MODE_ALLOWED) {
                                runInBackgroundDisabled(uid);
                            }
                        }
                    }
                });

        mGrantFile = new AtomicFile(new File(systemDir, "urigrants.xml"));

    // 多用戶功能
        mUserController = new UserController(this);

        GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version",
            ConfigurationInfo.GL_ES_VERSION_UNDEFINED);

        mTrackingAssociations = "1".equals(SystemProperties.get("debug.track-associations"));

        mConfiguration.setToDefaults();
        mConfiguration.setLocales(LocaleList.getDefault());

        mConfigurationSeq = mConfiguration.seq = 1;
        mProcessCpuTracker.init();

    // 當APK所運行的設備不滿足要求時,AMS會根據設置的參數以采用屏幕兼容的方式去運行它
        mCompatModePackages = new CompatModePackages(this, systemDir, mHandler);
    // 一些校驗
        mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler);
    // Activity管理的相關初始化
        mStackSupervisor = new ActivityStackSupervisor(this);
        mActivityStarter = new ActivityStarter(this, mStackSupervisor);
    // 最近任務
        mRecentTasks = new RecentTasks(this, mStackSupervisor);

    // 每半小時跟新CPU信息
        mProcessCpuThread = new Thread("CpuTracker") {
            @Override
            public void run() {
                while (true) {
                    try {
                        try {
                            synchronized(this) {
                                final long now = SystemClock.uptimeMillis();
                                long nextCpuDelay = (mLastCpuTime.get()+MONITOR_CPU_MAX_TIME)-now;
                                long nextWriteDelay = (mLastWriteTime+BATTERY_STATS_TIME)-now;
                                //Slog.i(TAG, "Cpu delay=" + nextCpuDelay
                                //        + ", write delay=" + nextWriteDelay);
                                if (nextWriteDelay < nextCpuDelay) {
                                    nextCpuDelay = nextWriteDelay;
                                }
                                if (nextCpuDelay > 0) {
                                    mProcessCpuMutexFree.set(true);
                                    this.wait(nextCpuDelay);
                                }
                            }
                        } catch (InterruptedException e) {
                        }
                        updateCpuStatsNow();
                    } catch (Exception e) {
                        Slog.e(TAG, "Unexpected exception collecting process stats", e);
                    }
                }
            }
        };

    // 看門狗
        Watchdog.getInstance().addMonitor(this);
        Watchdog.getInstance().addThread(mHandler);

        /// M: AMEventHook event @{
        AMEventHookData.EndOfAMSCtor eventData =
            AMEventHookData.EndOfAMSCtor.createInstance();
        mAMEventHook.hook(AMEventHook.Event.AM_EndOfAMSCtor,
            eventData);
        /// M: AMEventHook event @}
    }

setSystemProcess

mActivityManagerService.setSystemProcess();
初始化一些服務,為系統進程設置應用程序實例,AMS得到systemserver的ProcessRecord,以便AMS管理systemserver.

    public void setSystemProcess() {
        try {
        // 添加各種服務
            ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);
            ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
            ServiceManager.addService("meminfo", new MemBinder(this));
            ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
            ServiceManager.addService("dbinfo", new DbBinder(this));
            if (MONITOR_CPU_USAGE) {
                ServiceManager.addService("cpuinfo", new CpuBinder(this));
            }
            ServiceManager.addService("permission", new PermissionController(this));
            ServiceManager.addService("processinfo", new ProcessInfoService(this));

            /// M: ANRManager mechanism @{
            ServiceManager.addService("anrmanager", mANRManager, true);
            /// @}
    
        // 這里是獲得報名為“android”的apk信息,即獲得framework-res.apk
            ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(
                    "android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);
        // 系統進程加載framework-res.apk
            mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());
        
        // AMS得到systemserver的ProcessRecord,以便AMS管理systemserver
            synchronized (this) {
        // 從info里得到systemserver所在的系統進程的名字,然后封裝成一個ProcessRecord,即封裝系統進程的信息
                ProcessRecord app = newProcessRecordLocked(info, info.processName, false, 0);
                app.persistent = true;
                app.pid = MY_PID;
                app.maxAdj = ProcessList.SYSTEM_ADJ;
                app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);
                synchronized (mPidsSelfLocked) {
                    mPidsSelfLocked.put(app.pid, app);
                }
                updateLruProcessLocked(app, false, null);
                updateOomAdjLocked();
            }
        } catch (PackageManager.NameNotFoundException e) {
            throw new RuntimeException(
                    "Unable to find android system package", e);
        }
    }

這里說下,ProcessRecord描述一個app所在進程的所有信息。因為AMS是運行在systemserver進程中的,所以這里得到的實際就是systemserver

installSystemProviders

關聯管理SettingsProvider
mActivityManagerService.installSystemProviders();

    public final void installSystemProviders() {
        List<ProviderInfo> providers;
        synchronized (this) {
        // 得到名字為“system”,pid為Process.SYSTEM_UID的進程,即systemserver所在系統進程
            ProcessRecord app = mProcessNames.get("system", Process.SYSTEM_UID);
        // 得到運行在系統進程中的所有ContentProvider的ProviderInfo信息
            providers = generateApplicationProvidersLocked(app);
            if (providers != null) {
                for (int i=providers.size()-1; i>=0; i--) {
                    ProviderInfo pi = (ProviderInfo)providers.get(i);
                    if ((pi.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
                        Slog.w(TAG, "Not installing system proc provider " + pi.name
                                + ": not system .apk");
            // 過濾掉非系統進程運行的provider
                        providers.remove(i);
                    }
                }
            }
        }
    // 上面已經過濾掉,剩下一個ContentProvider其實就是SettingsProvider
        if (providers != null) {
        // 安裝SettingsProvider
            mSystemThread.installSystemProviders(providers);
        }

    // 創建CoreSettingsObserver監聽SettingsProvider變化
        mCoreSettingsObserver = new CoreSettingsObserver(this);
        mFontScaleSettingObserver = new FontScaleSettingObserver();

        //mUsageStatsService.monitorPackages();
    }

systemReady

mActivityManagerService.systemReady(new Runnable(){}

先看public void systemReady(final Runnable goingCallback) {}

1、校驗進行systemReady

synchronized(this) {
            if (mSystemReady) {
                // If we're done calling all the receivers, run the next "boot phase" passed in
                // by the SystemServer
                if (goingCallback != null) {
                    goingCallback.run();
                }
                return;
            }

            mLocalDeviceIdleController
                    = LocalServices.getService(DeviceIdleController.LocalService.class);

            // Make sure we have the current profile info, since it is needed for security checks.
            mUserController.onSystemReady();
            mRecentTasks.onSystemReadyLocked();
            mAppOpsService.systemReady();
            mSystemReady = true;
        }

2.殺死之前系統進程啟動的進程,除過persistent常駐進程

  synchronized(mPidsSelfLocked) {
            for (int i=mPidsSelfLocked.size()-1; i>=0; i--) {
                ProcessRecord proc = mPidsSelfLocked.valueAt(i);
                if (!isAllowedWhileBooting(proc.info)){
                    if (procsToKill == null) {
                        procsToKill = new ArrayList<ProcessRecord>();
                    }
                    procsToKill.add(proc);
                }
            }
        }

        synchronized(this) {
            if (procsToKill != null) {
                for (int i=procsToKill.size()-1; i>=0; i--) {
                    ProcessRecord proc = procsToKill.get(i);
                    Slog.i(TAG, "Removing system update proc: " + proc);
                    removeProcessLocked(proc, true, false, "system update done");
                }
            }

            // Now that we have cleaned up any update processes, we
            // are ready to start launching real processes and know that
            // we won't trample on them any more.
            mProcessesReady = true;
        }

3.啟動傳入的Runable

if (goingCallback != null) goingCallback.run();

4.啟動launcher,即HomeActivity

startHomeActivityLocked(currentUserId, "systemReady");

5.發送啟動廣播

try {
        Intent intent = new Intent(Intent.ACTION_USER_STARTED);
        intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
                | Intent.FLAG_RECEIVER_FOREGROUND);
        intent.putExtra(Intent.EXTRA_USER_HANDLE, currentUserId);
        broadcastIntentLocked(null, null, intent,
                null, null, 0, null, null, null, AppOpsManager.OP_NONE,
                null, false, false, MY_PID, Process.SYSTEM_UID,
                currentUserId);
        intent = new Intent(Intent.ACTION_USER_STARTING);
        intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
        intent.putExtra(Intent.EXTRA_USER_HANDLE, currentUserId);
        broadcastIntentLocked(null, null, intent,
                null, new IIntentReceiver.Stub() {
                    @Override
                    public void performReceive(Intent intent, int resultCode, String data,
                            Bundle extras, boolean ordered, boolean sticky, int sendingUser)
                            throws RemoteException {
                    }
                }, 0, null, null,
                new String[] {INTERACT_ACROSS_USERS}, AppOpsManager.OP_NONE,
                null, true, false, MY_PID, Process.SYSTEM_UID, UserHandle.USER_ALL);
    } 

再看一下Runnable中做了什么

1、啟動carash監聽

try {
    mActivityManagerService.startObservingNativeCrashes();
} 

2、WebView設置

if (!mOnlyCore) {
    Slog.i(TAG, "WebViewFactory preparation");
    Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "WebViewFactoryPreparation");
    mWebViewUpdateService.prepareWebViewInSystemServer();
    Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}

3、啟動systemUI

try {
    startSystemUi(context);
} 

4、在systemReady后,各種類開始設置自己的參數

if (networkScoreF != null) networkScoreF.systemReady();
if (networkManagementF != null) networkManagementF.systemReady();
if (networkStatsF != null) networkStatsF.systemReady();
if (locationF != null) locationF.systemRunning();
...//等等,很多類似方法

總結

AMS啟動簡要概括:
1、new AMS 準備Handler、初始化四大組件相關、權限、多用戶、看門狗
2、setSystemProcess 加載framework-res.apk,和systemserver進程建立關系
3、installSystemProviders 配置ContentProvider即SettingsProvider
4、systemReady 最后工作,啟動launcher,systemUI,發送啟動廣播,其他各類組件準備好

Read the fucking sources code!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,794評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,750評論 2 370

推薦閱讀更多精彩內容