一、Android系统启动过程概述
Android系统启动过程大体可以分为以下6个阶段:
- 硬件初始化阶段
- 内核启动阶段
- init进程启动阶段
- 系统服务启动阶段
- 应用进程启动阶段
- 系统启动完成阶段
二、硬件初始化阶段
在这个阶段,系统主要进行硬件初始化,包括基本的硬件检测和初始化,如CPU、内存、存储等。这个阶段由Bootloader来执行,它首先会在硬件检测及初始化完成后,读取内核映像文件,将内核映像文件加载到内存中,并跳转到内核映像文件的入口点。在这之后,硬件初始化阶段基本完成,系统开始进入到内核启动阶段。
int main(int argc, char** argv) { /* Hardware initialization */ hw_init(); /* Load kernel image file to memory */ load_kernel_image(); /* Jump to kernel image entry point */ jump_to_kernel_entry_point(); /* Should not reach here */ return 0; }
三、内核启动阶段
在这个阶段,内核主要进行的是自身的初始化,包括系统调用、内存管理、进程管理、文件系统等。其中最重要的是内存管理,因为内存管理是整个系统的基础。内核首先会创建第一个进程init,并将其放入进程调度链表中等待运行。接着,内核会解压缩RAM disk文件系统到内存中,并挂载到根文件系统中。随后,内核会读取init.rc文件,这个文件是系统启动时的主要配置文件,它通过service节点定义了系统将要启动的各种服务。
void __init start_kernel(void) { /* Initialize memory management */ mm_init(); /* Initialize process management */ process_init(); /* Mount RAM disk file system to root file system */ mount_ram_disk(); /* Read init.rc file and start services */ start_services(); /* Should not reach here */ return 0; }
四、init进程启动阶段
在这个阶段,系统会启动第一个用户级进程——init进程。init进程是Android系统中最重要的进程之一,它负责在系统启动时加载各种服务和模块,并启动系统中其他的进程。init进程的启动由内核完成,在用户空间中调用init可执行文件开始。
int main(int argc, char** argv) { /* Parse command line arguments */ parse_args(argc, argv); /* Load configuration file */ parse_config_file(); /* Load services and start modules */ load_services_and_start_modules(); /* Start other processes */ start_other_processes(); /* Should not reach here */ return 0; }
五、系统服务启动阶段
在这个阶段,系统会启动各种系统级服务,如Wifi管理服务、蓝牙管理服务、定位服务等。这些服务都是作为系统进程在init进程启动后启动的,它们会被注册到System Server中,作为System Server的一个线程来运行。
void main() { /* Initialize System Server */ SystemServer system_server = new SystemServer(); /* Register system services */ system_server.registerService(WifiService.class); system_server.registerService(BluetoothService.class); system_server.registerService(LocationService.class); /* Start System Server */ system_server.start(); /* Should not reach here */ return 0; }
六、应用进程启动阶段
在这个阶段,系统会启动各个应用进程,如Launcher、浏览器、短信等。应用进程由应用程序启动器Activity Manager来管理,通过应用进程启动命令am start或am startservice可以启动一个应用进程或服务。
void startActivity(String packageName, String className) { /* Start application process */ Process applicationProcess = Runtime.getRuntime().exec("am start " + packageName + "/" + className); /* Wait for application process to finish */ applicationProcess.waitFor(); }
七、系统启动完成阶段
在所有进程和服务都启动完成后,系统启动就算完成了。在这个阶段,启动过程会显示出系统桌面,这时用户就可以使用Android系统了。
void onSystemBootCompleted() { /* Display system desktop */ displaySystemDesktop(); /* Should not reach here */ return 0; }