深度解析:Android系统启动全过程
"Android系统的启动过程涉及多个关键步骤,从Bootloader阶段开始,逐步进入操作系统核心,执行init进程,解析配置文件,并启动Zygote进程,最终达到用户界面的呈现。以下是详细的Android系统启动流程: 1. Bootloader阶段: Android设备开机后,首先执行的是Bootloader。Bootloader是一个低级别的程序,负责加载操作系统。它会进行硬件检测,初始化必要的设备,然后根据用户的选择或者预设设置加载合适的引导程序,通常是Linux内核。 2. Linux内核启动: Linux内核加载后,开始初始化各种驱动程序,设置内存管理、设备驱动等。当内核完成基本的初始化工作后,它会启动位于/system/core/init.c中的init进程,这是Android系统中的第一个用户空间进程。 3. Init进程启动: Init进程是Android系统的父进程,它负责执行初始化任务,如创建必要的目录,例如/mnt和/dev/pts,以及初始化日志系统。接着,init进程会解析并执行/init.rc配置文件,这个文件定义了系统启动时需要运行的各种服务和脚本。 4. init.rc配置文件解析: 在init.rc文件中,包含了对系统服务的定义和启动命令。例如,启动Zygote进程,更新系统状态(如唤醒电源),以及重启其他重要服务如media和netd等。 5. Zygote启动: Zygote是Android系统中的一个特殊进程,被称为“孵化器”。它预先加载了Dalvik或ART虚拟机,以及系统库,为后续的应用程序提供了一个共享的运行环境。在C++层,app_process程序被调用,然后在Java层执行com.android.internal.os.ZygoteInit类的main方法,启动Zygote。 6. Zygote初始化与System Server启动: 在Zygote初始化过程中,会创建一个Android运行时环境(AppRuntime)。如果在命令行参数中指定了启动System Server(即"--start-system-server"),Zygote会派生出System Server进程,它是Android系统的控制中心,负责系统服务的管理和调度。 7. 用户界面启动: 当System Server完成初始化,包括启动窗口管理器、内容提供者和其他关键服务后,Android系统将进入用户界面,展示桌面,此时用户可以开始交互操作。 Android系统从Bootloader开始,通过Linux内核,init进程,init.rc配置文件,Zygote进程,再到System Server的启动,一步步构建起整个操作系统环境,最终呈现给用户一个完整的交互界面。这一过程涉及硬件初始化、系统服务启动、应用程序环境准备等多个环节,是理解Android系统运行机制的基础。"
int main(int argc, char **argv)
{
// 创建文件夹 挂载
mount("tmpfs", "/dev", "tmpfs", 0, "mode=0755");
mkdir("/dev/pts", 0755);
// 打开日志
log_init();
INFO("reading config file\n");
// 加载init.rc配置文件
init_parse_config_file("/init.rc");
}
2.init.rc配置文件会进行很多的配置,创建很多的文件夹及文件,然后初始化一些Android驱动器,之后该配置文件最重要的一个任务就是启动一个Zygote(孵化器)进程,此进程是Android系统的一个母进程,用来启动Android的其他服务进程,代码:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
socket zygote stream 666
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd
3. Zygote会执行一个app_process可执行文件,在这个文件中首先添加了Android运行时环境,在Android运行时中调用了ZygoteInit.java,这就从c++代码跳到了java代码。
int main(int argc, const char* const argv[])
{
...
AppRuntime runtime;
...
// Next arg is startup classname or "--zygote"
if (i < argc) {
arg = argv[i++];
if (0 == strcmp("--zygote", arg)) {
bool startSystemServer = (i < argc) ?
strcmp(argv[i], "--start-system-server") == 0 : false;
setArgv0(argv0, "zygote");
set_process_name("zygote");
// 启动java代码
runtime.start("com.android.internal.os.ZygoteInit",
...
}
4.在ZytofeInit.java代码中首先设置了Java虚拟机的堆内存空间,然后启动一个类加载器加载Android启动依赖的类比如Activity等四大组件,dialog等UI的类,然后分出一个子进程启动SystemServer系统服务
public static void main(String argv[]) {
try {
VMRuntime.getRuntime().setMinimumHeapSize(5 * 1024 * 1024);
// 加载Android依赖的类
preloadClasses();
//cacheRegisterMaps();
preloadResources();
...
if (argv[1].equals("true")) {
// 启动系统服务
剩余6页未读,继续阅读
- 粉丝: 91
- 资源: 6
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展