Application 启动

从开机上电到显示桌面,再在桌面点击图标,打开应用的整个流程。

一:从开机上电--> 桌面展示

1. 整体流程如下:

SystemServer 通知zygote, zygote fork 出各种APP.

 解释一下rom 和 ram 的区别:

上电后,会从ROM 加载到RAM, 然后执行加载到的代码/程序。

BootLoader 是引导操作系统启动,相当于window系统的dll
BootLoader启动的第一个安卓系统的进程是idle(pid=0)进程, idle 做了哪些呢?
1). 启动内核kernel空间的进程,kthreadd(pid=2)进程
2). 启动了用户空间的进程,init(pid=1)进程
3). 初始化进程管理/内存管理/加载Binder Driver/Dispaly/Camera Driver等相关工作

2. init 进程启动

 init 进程是怎么开始执行的?

谁来执行 system/bin/init 呢?

因为init 进程是 由 kernel层的 idle 进程 生成的,所以我们去看看 kernel 的源码。

一般的C/C++ 的程序,都是从main()方法开始。我们找到kernel/common/init/main.c

 FirstStageMain:
1.挂载 创建文件的
2.重定向 输入输出
3.初始化内核 的日志打印
4.启动 selinux_setup

 SetupSelinux
1. linux这块的安全策略:对应Android权限这块,最小权限原则
2. 启动second_stage

 

 

 总结 init处理的重要事情:
1.挂载文件
2.设置selinux -- 安全策略
3.开启属性服务,注册到epoll中
4.解析init.rc 
5.循环处理脚本 -->处理脚本,这里就是去启动zygote
6.循环等待

3.启动zygote

 init.rc是干嘛的?相当于配置文件,比如: 
1).执行zygote
2).执行重启

1. 怎么启动 Zygote ?(init.rc  --- zygote )

通过解析init.rc 文件,rc里面就会执行 tirgget zygote-start, 然后执行 start zygote

 有app_process, app_process32, app_process64 这些都是zygote, 那执行哪个zygote 呢?取决于系统是32还是64位的

start zygote 启动的就是 bin目录下的app_processXX 这样的文件

再看看zygote.rc 配置文件(会执行哪些指令)

启动 zygote是传入的参数:-Xzygote /system/bin --zygote --start-system-server --socket-name=zygote

frameworks/base/cmds/app_process/Android.bp  文件就会执行app_main.cpp

 frameworks/base/cmds/app_process/app_main.cpp, 找到了 app_main.cpp文件

执行runtime.start("com.android.internal.os.ZygoteInit", args, zygote);

static const RegJNIRec gRegJNI[] = { // gRegJNI的返回值类型是RegJNIRec

 1)preload(bootTimingsTraceLog); // 预加载,加快进程的启动

预加载加载的是 /system/bin/preloaded-classes 文件里的那些类

预加载的资源

2)创建socket 

// AMS 通知zygote 去创建进程,就是通过socket去通知的
zygoteServer = new ZygoteServer(isPrimaryZygote); // zygoteServer就是socket,这里相当于new Socket()

3)启动SystemServer

Runnable r = forkSystemServer // 启动 SystemServer 进程,AMS
caller = zygoteServer.runSelectLoop(abiList); // 死循环,接收AMS传过来的消息

 

 4. SystemServer启动

pid 返回值(pid是int类型,返回的pid=0时,说明该进程没有子进程。比如zygote进程fork出systemserver进程,返回pid 是systemserver的进程id, 但是刚fork出来的systemerver 进程,是没有子进程的,所以返回值pid=0)

假如SystemServer 的进程id 是6000, 因SystemServer 刚fork 出来,没有子进程,所以pid 的值为0, 即 pid=0

 //1.开启Binder线程池

 //2.运行 SystemServer.main

 SystemServer进程启动后,做了啥?

 SystemServer执行过程中,对应的一些状态值

 

 总结:

5. 查看启动时的启动了哪些进程

首先创建一个7.0的虚拟机

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值