ActivityManagerService启动过程分析

之前讲Android的View的绘制原理和流程的时候,讲到过在Android调用setContentView之后,Android调用了一个prepreTravle的方法,这里面就提到了ActivityManagerService。

ActivityManagerService提供的主要功能:
       (1)统一调度各应用程序的Activity
       (2)内存管理
       (3)进程管理

上一篇我们分析Android启动过程的文章中我们分析到了SystemServer,当时我们只是简单的描述了下,Android启动过程分析,我们还是来看一张启动的流程图,

System Server代码位于://frameworks\base\services\java\com\android\server\SystemServer.java

我们来看一段启动的代码:

private void run() {

    // 准备SystemServer运行环境:设置线程优先级,创建主线层Looper,ActivityThread和SystemContext
    android.os.Process.setThreadPriority();
    Looper.prepareMainLooper();

    // 创建systemserver上进程的ActivityThread和SystemContext
    createSystemContext();

    // 增加SystemServiceManager:统一管理system services的创建,启动和生命周期,多用户切换
    mSystemServiceManager = new SystemServiceManager(mSystemContext);

    // Start services.

    // 1.创建AMS
    mActivityManagerService = mSystemServiceManager.startService(
            ActivityManagerService.Lifecycle.class).getService();

    // Start the Power Manager service
    mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);

    // Start the package manager service
    mPackageManagerService = PackageManagerService.main();

    // 2.将SystemServer进程可加到AMS中调度管理
    mActivityManagerService.setSystemProcess();

    // 3.将相关provider运行在systemserver进程中:SettingsProvider
    mActivityManagerService.installSystemProviders();

    //
    final Watchdog watchdog = Watchdog.getInstance();
    watchdog.init(context, mActivityManagerService);

    // Start Window Manager
    wm = WindowManagerService.main();

    // 4.直接保存wms对象,与WMS交互
    mActivityManagerService.setWindowManager(wm);

    // 5.通过WMS 弹出“正在启动应用”框
    // R.string.android_upgrading_starting_apps
    ActivityManagerNative.getDefault().showBootMessage();

    // 6. AMS作为Framework核心,做好准备就绪后就开始启动应用层,和对AMS有依赖的服务
    mActivityManagerService.systemReady(new Runnable(){
        //启动SystemUI
        startSystemUi(context);

        //启动WatchDog监控核心服务状态
        Watchdog.getInstance().start();

        //
        mmsServiceF.systemRunning();
    });

    // Loop forever.
    Looper.loop();
}

上面的6个步骤就是SystemServer中关于AMS的调用,完成AMS的创建和系统的初始化,以及与WMS交互等流程。
一、ActivityManagerService 创建过程

mActivityManagerService = mSystemServiceManager.startService(
            ActivityManagerService.Lifecycle.class).getService();

通过SystemServiceManager这样一个模板类来创建运行在SystemServer中的Framework服务。并将创建的服务统一保存在队列管理。

public ActivityManagerService(Context systemContext) {

       // 1.系统Context 和 ActivityThread (将systemserver进程作为应用进程管理)
        mContext = systemContext;
        mFactoryTest = FactoryTest.getMode();
        mSystemThread = ActivityThread.currentActivityThread();

        // 2.AMS工作的线程和Handler,处理显示相关的UiHandler  ---》知识点HandlerThread和Handler
        mHandlerThread = new ServiceThread(TAG,
            android.os.Process.THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
        mHandlerThread.start();
        mHandler = new MainHandler(mHandlerThread.getLooper());
        mUiHandler = new UiHandler();

        // 3. 广播队列BroadcastQueue初始化:前台广播队列和后台广播队列
        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;

        // 4. Service 和 Provider 管理
        mServices = new ActiveServices(this);
        mProviderMap = new ProviderMap(this);

        // 5.系统数据存放目录:/data/system/
        File dataDir = Environment.getDataDirectory();
        File systemDir = new File(dataDir, "system");
        systemDir.mkdirs();

        // 电池状态信息,进程状态 和 应用权限管理
        mBatteryStatsService = new BatteryStatsService(systemDir, mHandler);
        mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats"));
        mAppOpsService = new AppOpsService(new File(systemDir, "appops.xml"), mHandler);

        // 6.多用户管理
        mStartedUsers.put(UserHandle.USER_OWNER, new UserState(UserHandle.OWNER, true));
        mUserLru.add(UserHandle.USER_OWNER);
        updateStartedUserArrayLocked();

        // 7.最近任务,Activity,Task管理
        mRecentTasks = new RecentTasks(this);
        mStackSupervisor = new ActivityStackSupervisor(this, mRecentTasks);
        mTaskPersister = new TaskPersister(systemDir, mStackSupervisor, mRecentTasks);

        // 创建一个新线程,用于监控和定时更新系统CPU信息,30分钟更新一次CPU和电池信息
        mProcessCpuTracker.init();
        mProcessCpuThread = new Thread("CpuTracker") {}

        // 加入Watchdog监控起来
        Watchdog.getInstance().addMonitor(this);
        Watchdog.getInstance().addThread(mHandler);
    }

二、将SystemServer进程可加到AMS中调度管理

mActivityManagerService.setSystemProcess();

mActivityManagerService将system扔到ams统一管理和调度

public void setSystemProcess() {
        // 将服务加入到ServiceManager中
        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));

        // 设置application info LoadedApkinfo 有关 framework-res.apk
        ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(
                    "android", STOCK_PM_FLAGS);
        mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());

        //给SystemServer进程创建ProcessRecord,adj值,就是将SystemServer进程加入到AMS进程管理机制中,跟应用进程一致
        synchronized (this) {
            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();
        }
    }

这一步就是给SystemServer进程创建ProcessRecord,adj值,就是将SystemServer进程加入到AMS进程管理。

三、创建运行在SystemServer进程中Provider

mActivityManagerService.installSystemProviders();
取出进程名为"system",user_id为SYSTEM_UID的进程信息 ,生成运行在system进程中的providerInfo,并交给上下文的Provider。这段代码的任务就是查询与安装Content Provider并且发布,其中查询出来的provider为SettingsProvider

public final void installSystemProviders() {
        List<ProviderInfo> providers;
        synchronized (this) {
            //取出进程名为"system",user_id为SYSTEM_UID的进程信息
            ProcessRecord app = mProcessNames.get("system", Process.SYSTEM_UID);
            //生成运行在system进程中的providerInfo,表示一个Content Provider。
            providers = generateApplicationProvidersLocked(app);
            if (providers != null) {
                for (int i=providers.size()-1; i>=0; i--) {
                    ProviderInfo pi = (ProviderInfo)providers.get(i);
                    //过滤掉非系统apk
                    if ((pi.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
                        Slog.w(TAG, "Not installing system proc provider " + pi.name
                                + ": not system .apk");
                        providers.remove(i);
                    }
                }
            }
        }
        if (providers != null) {
           //安装provider
            mSystemThread.installSystemProviders(providers);
        }
        //监听Settings数据库变化。
        mCoreSettingsObserver = new CoreSettingsObserver(this);  

        //mUsageStatsService.monitorPackages();

四、AMS systemReady过程
mActivityManagerService.systemReady();

发送ACTION_PRE_BOOT_COMPLETE方法,清理启动的persistent进程,读取Settings配置,运行runnable接口,启动SystemUI,启动persistent应用程序,启动home,发送ACTION_BOOT_COMPLETE广播

public void systemReady(final Runnable goingCallback) {
        synchronized(this) {
            if (mSystemReady) {
                goingCallback.run();
            }
            ……

            // 1.升级相关处理:发送PRE_BOOT_COMPLETED广播 等待升级处理完成才能继续
            // Check to see if there are any update receivers to run.
            if (!mDidUpdate) {
                // 等待升级完成,否则直接返回
                if (mWaitingUpdate) {
                    return;
                }
                // 发送PRE_BOOT_COMPLETED广播
                final ArrayList<ComponentName> doneReceivers = new ArrayList<ComponentName>();
                mWaitingUpdate = deliverPreBootCompleted(new Runnable() {
                    // 等待所有接收PRE_BOOT_COMPLETED广播者处理完毕
                    public void run() {
                        synchronized (ActivityManagerService.this) {
                            mDidUpdate = true;
                        }
                        showBootMessage(mContext.getText(
                                R.string.android_upgrading_complete),
                                false);

                        // 将系统版本号和处理过的广播写入文件:/data/system/called_pre_boots.dat文件
                        writeLastDonePreBootReceivers(doneReceivers);

                        // 继续systemReady流程
                        systemReady(goingCallback);
                    }
                }, doneReceivers, UserHandle.USER_OWNER);

                if (mWaitingUpdate) {
                    return;
                }
                mDidUpdate = true;
            }

            mSystemReady = true;
        }

        // 2. 收集已经启动的进程并杀死,除过persistent常驻进程
        ArrayList<ProcessRecord> procsToKill = null;
        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.系统准备好后回调传入的Runnable:
        if (goingCallback != null) goingCallback.run();

    
      // 4. 发送账户启动的广播,涉及多用户
      long ident = Binder.clearCallingIdentity();

      Intent intent = new Intent(Intent.ACTION_USER_STARTED);
      broadcastIntentLocked(intent);
      intent = new Intent(Intent.ACTION_USER_STARTING);
      broadcastIntentLocked(intent);

      Binder.restoreCallingIdentity(ident);

        // 5. 启动桌面Home Activity
        mBooting = true;
        startHomeActivityLocked(mCurrentUserId, "systemReady");
        mStackSupervisor.resumeTopActivitiesLocked();
  }

参考:

http://www.cnblogs.com/bastard/p/5770573.html

http://blog.csdn.net/u010083774/article/details/50620355

时间: 2024-10-02 06:23:25

ActivityManagerService启动过程分析的相关文章

Android Service的启动过程分析

Android Service的启动过程分析 刚开始学习Service的时候以为它是一个线程的封装,也可以执行耗时操作.其实不然,Service是运行在主线程的.直接执行耗时操作是会阻塞主线程的.长时间就直接ANR了. 我们知道Service可以执行一些后台任务,是后台任务不是耗时的任务,后台和耗时是有区别的喔. 这样就很容易想到音乐播放器,天气预报这些应用是要用到Service的.当然如果要在Service中执行耗时操作的话,开个线程就可以了. 关于Service的运行状态有两种,启动状态和绑

《Android框架揭秘》——1.2节通过启动过程分析Android Framework

1.2 通过启动过程分析Android FrameworkAndroid框架揭秘Android源码数量极其庞大,以Android 2.2为例,除去Linux代码,代码数量大于4GB.若想理解和掌握这么庞大的Android系统,需要耗费大量的时间,付出极大的努力.并且,到现在为止,也没有相关资料对Android Frame作系统完整的讲解说明. 那么,分析Android Framework用什么方法好呢?回答这一问题之前,先回想一下我们是如何分析他人编写的程序代码的.在分析程序代码时,我们通常从程

OpenWrt启动过程分析+添加自启动脚本【转】

一.OpenWrt启动过程分析 转自: http://www.eehello.com/?post=107   总结一下OpenWrt的启动流程:1.CFE->2.linux->3./etc/preinit->4./sbin/init ->5./etc/inittab ->6./etc/init.d/rcS->7./etc/rc.d/S* ->8.    OpenWrt是一个开放的linux平台,主要用于带wifi的无线路由上. 类似于Ubuntu.Red Hat.

BIOS启动过程分析

1        引言 1.1    文档目的 对于电脑用户来说,打开电源启动电脑几乎是每天必做的事情,但计算机在显示这些启动画面的时候在做什么呢?大多数用户都未必清楚了.下面就向大家介绍一下从打开电源到出现Linux的登录窗口,计算机到底干了些什么工作,BIOS在其中起到什么作用. 电脑的启动过程中有一个非常完善的硬件自检机制.对于采用Award BIOS的电脑来说,它在上电自检那短暂的几秒钟里,就可以完成100多个检测步骤. 1.2    术语和缩写 术语或缩写 描述 BIOS 基本输入/输

Flume-ng启动过程分析

Application.java 入口函数main(): ... //加载flume的配置文件,初始化Sink,Source,Channel的工厂类 PropertiesFileConfigurationProvider configurationProvider = new PropertiesFileConfigurationProvider(agentName, configurationFile); application = new Application(); //configura

Windows CE 6.0 启动过程分析

在理顺了上述文件的相互之间的关系之后,再来分析Windows CE 6.0的启动过程可能就比较容易啦.      1.Startup函数:      从Windows CE 6.0的帮助文档可以看出,WinCE6.0的启动只与oal.exe和kernel.dll有关,至于kitl.dll,只有将操作系统编译成具有 KITL功能时才用到.分析Windows CE 6.0的启动过程实际上找到编译oal.exe和kernel.dll的源码位置.oal.exe的通过Startup函数完成硬件的初始化.S

Redis服务器的启动过程分析_Redis

本文将通过分析代码来介绍Redis的启动过程,通过查看Redis 的启动脚本,得知Redis的启动时从Redis.c的main方法开始的.Redis启动可以分为以下几个步骤: 1.初始化Redis服务器全局配置 2.重置服务器Save参数(具体下文详解)和加载配置文件 3.初始化服务器 4.加载数据库 5.开始网络监听 一,初始化Redis服务器全局配置.这一步骤主要是主要是根据Redis.h中设置的Static值来初始化Redis服务器配置,这里设置是Redis服务器的默认配置.如: ·TCP

ARM多核处理器启动过程分析【转】

转自:http://blog.csdn.net/qianlong4526888/article/details/27695173 版权声明:本文为博主原创文章,未经博主允许不得转载.       说明: 该流程图按照代码执行时间顺序划分为4部分: 1.     Bootloader在图片上半部,最先启动: 2.     Kernel在图片下半部,由bootloader引导启动: 3.CPU0执行流程在图片左半部,bootloader代码会进行判断,先行启动CPU0: 4.  Secondary

Android WebView启动Chromium渲染引擎的过程分析

 首先感谢罗升阳的分享,原文链接http://blog.csdn.net/Luoshengyang/article/details/53237189   Android WebView加载了Chromium动态库之后,就可以启动Chromium渲染引擎了.Chromium渲染引擎由Browser.Render和GPU三端组成.其中,Browser端负责将网页UI合成在屏幕上,Render端负责加载网页的URL和渲染网页的UI,GPU端负责执行Browser端和Render端请求的GPU命令.本文