App启动流程


请添加图片描述
图片链接

Android系统启动流程

  1. 按下电源开机,从ROM的特定位置加载Bootloader到RAM中
  2. Bootloader拉起OS执行
  3. linux内核启动,设置缓存,加载驱动等。完成内核设置后,首先在系统文件中寻找init.rc文件,启动init进程。init的进程id为1,是在用户空间执行的第一个进程
  4. init进程启动。对应的文件是init.cpp,所在位置是system/core/init/init.cpp

init.cpp(init进程)中做的事情

  1. 创建和挂载启动所需的文件目录
  2. 初始化属性服务
    • 调用一个函数来初始化
  3. 设置子进程的信号处理函数
  4. 启动属性服务 (属性服务中是用socket进行通信的
    • 监听时设置了 最我可以同时为8个试图设置属性的用户提供服务
  5. 解析init.rc文件

解析init.rc文件

init.rc文件主要有Action,command,service,option,import语句组成,action和command配合使用,service和option语句配合使用。并且使用import导入文件。
Android8.0对init.rc文件进行了拆分,每一个服务对应一个文件。
import语句
解析Action要用ActionParser,解析Service要用ServiceParser.。在ServiceParser中,解析时只要与两个函数有关,一个函数是ParserSection,一个函数是EndSection。解析过程总体来说是:根据参数创造出Service对象,然后将Service对象加入到一个Service链表中。

Zygote的启动

  1. init.cpp的循环中会启动服务,调用do_class_start函数
  2. do_class_start函数中会循环寻找名称为mainZygote,并调用StartIfNotDisabled函数(位于service.cpp中)
  3. StartIfNotDisabled函数中,调用Start函数
  4. service.cpp中的Start函数中,进行必要的判断,是否服务已经启动/是否所需的文件已经存在,如果可以启动,则fork一个子进程.(写时复制,子进程会突然蒸发)
  5. fork出来的子进程中,调用execve函数,就会启动app_main.cpp中的main函数。文件路径为:framworks/base/cmds/app_processs/app_main.cpp
  6. app_main.cppmain函数中,会解析参数。参数中有Zygote,会调用runtime.start("com.android.internal.os.ZygoteInit")
  7. Runtime::start()函数中,会startVm()即创建虚拟机,会注册jni方法。最终会通过jni调用ZygoteInitmain方法

ZygoteInitmain方法中做的事情:

  1. 调用registerServerSocket 方法,创建一个服务端的Socket此处具体的是一个LocalServerSocket),名称为zygote,并转化了环境变量的值。 并启动这个服务端的Socket,用于等待AMS请求Zygote进程来创建新的应用程序进程。
  2. 加载通用的资源,并进行一次GC
  3. 启动SystemServer进程。
  4. 等待AMS的请求

SystemServer中做的事情

总体来说,是先启动binder线程池,然后再进入main()方法。

  1. 创建SystemServiceManager管理各类服务
  2. 启动Binder线程池进行通信
  3. 启动三类服务,引导服务,核心服务与其他服务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值