Android启动过程

1 Android启动过程

(1)上电
(2)bootloader
在cpu内部,根据GPIO设置判断系统是从U盘还是flash启动,引导uboot启动。
(3)uboot
初始化外设,设置启动参数,根据参数引导linux kernel启动。
(4)kernel
初始化硬件,加载驱动,根据uboot参数启动系统。
(5)Android
挂载分区,创建目录,加载驱动,init守护进程,启动系统服务(ServiceManager,adbd等)。

2 Android启动模式

通过uboot来区分通过哪个模式启动。
(1)recovery升级模式
启动recovery分区kernel和文件系统
(2)正常启动模式
启动Kernel和Android系统(boot.img...)

3 init守护进程

init代码位置:system/core/init/init.c
init设备位置:/init

3.1 init进程作用

(1)创建目录,挂载分区
(2)解析启动脚本
(3)启动服务
(4)守护服务

3.2 init进程启动流程

(1)创建目录
(2)klog_init()
将log重定向到/proc/kmsg
cat /proc/kmsg
(3)property_init()
初始化环境变量
(4)get_hardware_name()
获取硬件信息和版本
cat /proc/cpuinfo
adb shell getprop ro.hardware
adb shell getprop ro.revision
(5)process_kernel_cmdline()
解析内核启动参数
cat /proc/cmdline
(6)property_load_boot_defaults()
导入默认环境变量
cat default.prop
adb shell getprop ro.debuggable
(7)get_kernel_cmdline_partitions()
获取系统分区
(8)init_parse_config_file()
解析启动脚本(init.rc),将启动脚本中的每个命令解析到一个列表中
(9)action_for_each_trigger()
将解析脚本中对应的操作加到action_queue队列中
(10)queue_builtin_action()
创建命令,将命令加到action_list和action_queue队列中
(11)执行命令,创建服务并守护服务

3.3 init进程守护阶段原理

init进程守护阶段(for循环)的工作:
(1)启动系统服务,执行系统服务脚本里的命令 
(2)接收shell或系统中的消息以设置系统prop
(3)守护系统服务,如果服务退出重启退出的服务

图1 init进程守护阶段工作
init进程在初始化阶段会创建两个socket,socket1:PROP_SERVICE_NAME,用来监听shell/系统的消息,负责设置系统prop;socket2:设置信号处理函数,用于监听服务的消息,负责重启服务。
(1)socket1
handle_property_set_fd()
手动关闭与启动服务:
adb shell stop netd
adb shell start netd
(2)socket2

图2 init进程守护服务分析
SIGCHLD信号:子进程退出时会向父进程发送SIGCHLD信号。
init进程会先设置SIGCHLD信号处理函数sigchld_handler(),然后创建一对可以通信的socket套接字signal_fd和signal_recv_fd。子进程会继承父进程的信号处理函数和套接字signal_fd和signal_recv_fd。当子进程异常退出时,子进程的signal_recv_fd会和父进程(init进程)的signal_fd进行通信,父进程通过wait_for_one_process()重启服务。

4 zygote启动流程

4.1 Android系统基本服务

介绍zygote之前先看下Android系统的基本服务,这些服务都是init进程启动并守护的服务:
(1)adbd
(2)bootanim
开机动画
(3)debugd
(4)installed
应用安装服务
(5)media
多媒体服务,audio,camera
(6)netd
网络管理
(7)servicemanager
cs服务
(8)surfaceflinger
显示管理
(9)zygote
启动systemserver,启动app

4.2 app_process启动流程

/system/bin/app_process -Xzygote --start--system-server
(1)app_process进程main()会调用AndroidRuntime.start()
(2)startVm()获取虚拟机配置参数,创建虚拟机实例
(3)startReg()注册Android jni函数
(4)CallStaticVoidMethod()启动zygote服务,启动第一个java程序

4.3 zygote启动分析

(1)AndroidRuntime.start("com.android.internal.os.ZygoteInit", "start-system-server")
调用ZygoteInit()方法
(2)registerZygoteSocket()
创建socket为了以后和ActivityManagerService通信,ActivityManagerService服务何时起的?应该是后面的SystemServer启动的。
(3)preload()
预加载目标类(几秒),系统资源(几秒)和opengl等。所有应用app都是Zygote的子进程,子进程继承了Zygote的preload类和资源,这样只需要Zygote加载一次资源即可!
优化方向:多线程(ExecutorService)加载目标类和系统资源。
(4)startSystemServer()
启动SystemServer服务。SystemServer服务如果异常退出,zygote会重启SystemServer服务。
(5)runSelectLoop()
接收并处理来自ActivityManagerService的消息,根据消息创建具体的app。

4.4 zygote创建应用流程

(1)runSelectLoop()
[1]创建socket套接字,接收消息
[2]load资源
[3]创建SystemServer,SystemServer创建所有服务,并启动launcher
(2)selectReadable()
使用select监听本地套接字,接收消息
(3)acceptCommandPeer()
创建新的请求
(4)runOnce()
readArgumentList()解析参数,forkAndSpecialize()创建子进程,handleChildProc()在子进程中启动应用。

5 Bootanim启动分析

5.1 bootanim启动流程

(1)init.rc脚本中的bootanim默认是disable的
(2)bootanim依赖surfaceflinger,等surfaceflinger服务起来后启动bootanim
(3)等SystemServer服务启动了系统HomeUI后,关闭bootanim

5.2 bootanim启动框架

图1 bootanim启动框架图
如上图所示,init进程会启动两个服务surfaceflinger和zygote。首先,surfaceflinger服务实例化并初始化,调用startBootAnim来启动bootanim服务;然后,zygote服务启动SystemServer服务,SystemServer服务又启动了AMS和WMS服务,AMS调用startHomeActivityLocked来启动Android UI,Android UI启动后会向WMS发送消息,WMS会向surfaceflinger服务发送bootFinished消息,进而surfaceflinger服务来停止bootanim服务。

5.3 bootanimation.zip格式

(1)文件位置
/system/media/
(2)文件
part0,part1,desc.txt
(3)显示参数
desc.txt:

384 320 20

分辨率:384*320
帧率:20fps

p 1 0 part1

p后的第一个参数:
1:显示1次
0:循环播放
p后的第二个参数:
休眠时间,以显示下一帧
part1:
显示的图片文件夹

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值