ActivityManagerService boot up sequence analysis

ActivityManagerService (AMS) 是android系统中最核心的服务,主要负责四大组件的启动,切换,调度及应用程序的管理和调度等工作,其职责与操作系统中的进程管理和调度模块类似。

以system server中ActivityManagerService的调用轨迹分为以下四个部分:

Part 1: AMS.main
Part 2: AMS.setSystemProcess

Part 3: AMS.installSystemProviders

Part 4: AMS.self().systemReady

启动流程介绍 1


 次图片转载自网络,特别说明

启动流程介绍2 

  Part 1: AMS Main Function

  1. 创建了 AMS对象
2. 创建一个ActivityThread 对象,它代表一个应用进程的
    主线程
3. 获得一个context对象,它对应的application环境与
     framework-res.apk有关;

通过此函数,为system_server 进程搭建了一个和应用进程一样的android运行环境

Part 1-1:Create AMS object



Part 1-2:Create ActivityThread & context 



Part 1-2:Create ActivityThread & Context 



Part 1-2:Create ActivityThread & Context 


Part 1-3:Create ActivityStack


Part 2:setSystemProcess


1. 将ActivityManagerService, meminfo,gfxinfo等以下服务注册到ServiceManager


            ServiceManager.addService("activity", m, true);
            ServiceManager.addService("meminfo", new MemBinder(m));
            ServiceManager.addService("gfxinfo", new GraphicsBinder(m));
            ServiceManager.addService("dbinfo", new DbBinder(m));
            ServiceManager.addService("cpuinfo", new CpuBinder(m));
            ServiceManager.addService("permission", new PermissionController(m));




2.   通过PKMS 查询关于 framework-res.apk的ApplicationInfo,并用此初始化anroid运行环境 
       //向PKMS查询package名字为“android”的ApplicationInfo。PKMS 与AMS同一个进程,
          但通过android运行环境context(AMS->binder->PKMS)来实现,
         保证接口统一性及可扩展性
         ApplicationInfo info = mSelf.mContext.getPackageManager().getApplicationInfo(
                            "android", STOCK_PM_FLAGS);


         //对context进行二次初始化,与得到的applicatoninfo进行绑定。
            mSystemThread.installSystemApplicationInfo(info);


 3.  创建代表 system_server进程的管理结构ProcessRecord,并将systemserver进程并入
      AMS管理
               ProcessRecord app = mSelf.newProcessRecordLocked(
               mSystemThread.getApplicationThread(), info,
               info.processName, false); 创建processrecord,包含电量统计,应用信息,
               进程名(system),oom_adj,IApplicationThread和应用进程通信等信息。


                app.persistent = true;(常驻进程)
                app.pid = MY_PID;  system_server的进程号
                app.maxAdj = ProcessList.SYSTEM_ADJ;(-16)最高优先级


                AMS中用于保存管理 processRecord的两个成员变量结构。
                mSelf.mProcessNames.put(app.processName, app.uid, app);
                mSelf.mPidsSelfLocked.put(app.pid, app);
                根据系统当前状态,调整进程调度优先级和OOM_ADJ.
                mSelf.updateLruProcessLocked(app, true);

  Part 3:installSystemProviders

SettingsProvider.apk 包含SettingsProvider,放在system_serever中运行方便为各个service提供配置信息查询 



  


1 android程序中,一般创建的数据库存放在 /data/data/[应用程序包名]/databases 
的目录下
2. 通过URI 进行操作,例如content://contacts/people/1  指定ID为1 联系人的数据
3. 相关操作涉及 query, insert,update ,delete 等操作






### 计算机启动序列过程 计算机的启动序列是一个复杂的过程,涉及多个阶段和组件之间的交互。以下是关于计算机启动序列的关键部分: #### 1. BIOS/UEFI 初始化 BIOS 或 UEFI 是硬件固件的一部分,在系统加电后立即运行。它负责初始化硬件设备并执行自检 (Power-On Self Test, POST)[^1]。如果检测到任何错误,则会通过蜂鸣器或其他方式发出警告。 #### 2. 启动引导加载程序 (Boot Loader) 一旦完成硬件初始化,控制权交给位于磁盘特定位置上的引导加载程序。对于传统 PC 来说可能是 GRUB 或 LILO;而在嵌入式系统中可能使用 u-boot 等工具来加载操作系统内核。此阶段的主要任务是从存储介质读取核心文件至内存,并准备传递必要的参数给后续操作环境。 ```bash # Example of a simple bootloader command line argument passing in Linux systems. linux /vmlinuz root=/dev/sda1 ro quiet splash $vt_handoff initrd /initrd.img boot ``` #### 3. 内核初始化 当内核被载入RAM之后,便开始了它的初始化流程。这一步骤包括设置中断向量表、建立页表结构以及开启调度机制等功能模块。不同架构下的Linux内核有着各自独特的初期化方法论[^2]。 #### 4. 用户空间初始化 随着 init 进程成为第一个用户级应用程序被执行起来以后,整个系统的其余部分也开始逐步构建出来。根据发行版的不同,可能会采用 System V风格的服务管理或者现代化 systemd 解决方案来进行服务激活和服务配置等工作[^3]。 #### 5. 登录界面呈现 最后一步就是展示图形化的登录屏幕让用户输入凭证信息从而进入桌面环境或者是命令行终端模式下继续工作了[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值