Android系统启动过程
2017-03-20 11:13:52 0 举报
登录查看完整内容
Android系统启动过程是一个复杂的过程,它包括硬件自检、引导加载程序、内核启动、系统服务启动和用户界面显示等阶段。在硬件自检阶段,计算机会检查硬件设备是否正常工作。接下来是引导加载程序阶段,它会加载操作系统内核并将其放入内存中。然后是内核启动阶段,内核会初始化各种驱动程序和系统服务。接下来是系统服务启动阶段,它会启动各种必要的系统服务,如网络连接、文件系统等。最后是用户界面显示阶段,它会显示桌面并允许用户与系统进行交互。整个过程需要一定的时间来完成,但一旦完成,用户就可以开始使用Android系统了。
作者其他创作
大纲/内容
启动boot.img中的kernel
Launcher启动
注:service_manager是系统进程间通讯机制binder的守护进程,主要维护系统服务与客户端之间的binder通讯。它负责管理server注册,以及向client端提供查询server的信息。
service_manager进程启动
加载recovery.img
kernel启动
init进程
判断是否有组合键
开机执行boot loader引导程序uboot
启动recovery中的kernel
打开/dev/binder设备,将自己注册为服务器管理者(句柄为0),然后进入消息循环,等待客户端请求
init进程启动
展示桌面主界面
Zygote进程
1. 加载library库(android_servers)2. 启动引导服务(7个): ActivityManagerService、PowerManagerService、LightsService、DisplayManagerService、PackageManagerService、UserManagerService、SensorService3. 启动核心服务(3个):BatteryService、UsageStatsService、WebViewUpdateService;4. 启动其他服务(70个+):AlarmManagerService、VibratorService等。5. 调用AMS的systemReady方法
开机键/音量-
系统启动
Launcher启动(app_process进程)
fastboot模式
接收到AMS的启动应用进程app_process的socket请求
点击桌面应用图标
app_process启动com.android.internal.os.WrapperInit -> RuntimeInit.applicationInit()ActivityThread.main()ApplicationThread -- binder线程1ActivityThread.attach()ActivityManagerNative -- binder线程2ActivityManagerNative.attachApplicationattachApplication (AMS)handleBindApplication(ApplicationThread -> mH)realStartActivityLocked(AMS)scheduleLauncheActivity (ApplicationThread -> mH)
加载boot.img
注:1. fork是Linux系统的一个系统调用,作用就是复制当前进程产生一个新的进程。除了进程id不同,新进程将拥有和原始进程完全相同的进程信息。创建后,它们将共享已经分配的内存空间,仅当需要向内存中写入信息的时候,操作系统才会复制一份目标地址空间,并将数据写入到新的地址中。这种“仅当写的时候才复制”的机制可以最大限度的在多个进程中共享物理内存。2. Zygote进程同一时间只能fork出一个新的进程,保证进程的唯一性
1. 创建虚拟机,并执行ZygoteInit的main方法2. 创建socket服务端3. 加载资源 a. 加载/system/etc/preloaded-classes类 b. 加载系统资源 c. 加载library库 (android\\compiler_rt\\jnigraphics) d. 加载语言4. fork出system_server进程5. 执行循环,等待客户端请求
启动init进程
注:1. SystemServer主要是启动一些系统服务,每个系统服务都是一个线程。2. 每个服务启动后都会将自己注册到service_manager中,方便其它调用者可以通过注册的服务名从ServiceManager中获取该服务(如:AMS的服务名为activity)。3. 其中AMS服务很重要,管理所有activity\\service的生命周期。4. service_manager的binder句柄为0,所以所有任何进程都能通过binder找到它,然后通过它就能找到已经注册的服务,进而达到app进程与已注册的服务进程进行通讯了。
system_server进程启动
service_manager进程
挂载目录等操作(如:处理system.img、data.img等镜像文件)
recovery模式
开机键/音量+
通过ServiceManager获取AMS服务,并调用AMS中的startActivity,并通过socket告诉Zygote进程fork出app进程,并启动app
执行init.rc脚本:1. 权限设置、网络初始化、内存管理等2. 启动系统管理器的所有服务(位置、音频、SharedPreference等)3. 启动service_manager服务进程4. 启动zygote进程
Android启动过程
fork出app_process进程
注:1. bootloader是在启动kernel之前做好准备环境: a. 初始化硬件设备 b. 初始化堆栈 c. 建立内存空间的映射图 d. 设置内核相关参数2. recovery.img和boot.img中的kernel是不同的,recovery.img只包含部分核心功能3. 进入fastboot模式,可以通过USB连接手机,并通过fastboot命令工具进行刷机(可刷rom、boot.img、recovery.img等)
system_server进程
设置缓存、计划列表、加载驱动程序等系统设置
Zygote进程启动
收藏
收藏
0 条评论
回复 删除
下一页