一、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;
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/150604.html
微信掃一掃
支付寶掃一掃