Android啟動流程可以說是整個系統運行的基礎,了解其啟動過程可以更好地編寫自己的應用。本文將對Android系統啟動流程進行詳細的分析,幫助讀者更好地理解Android系統啟動的整個過程。
一、Bootloader
當Android設備開機時,首先執行的是bootloader,其主要作用是引導Linux內核的啟動。Bootloader程序運行時會載入內核鏡像和文件系統鏡像到內存中,然後跳轉到內核的啟動地址,將控制權交給內核。
.text
.globl _start
_start:
/* perform power-on self-tests */
test %al, %al
jne got_linux
/* program FPGA */
call program_fpga
cmp %al, %al
jne got_linux
/* invoke BIOS */
call setup_bios
cmp %al, %al
jne got_linux
/* boot Linux kernel */
call boot_linux
二、Linux內核
在引導程序的幫助下,Linux內核開始啟動,其主要作用是建立系統的第一個進程,該進程即是用戶空間的init進程。內核啟動後會完成以下操作:
● 提取自己的代碼和數據到RAM中。
● 初始化硬體設備,設置內存和中斷控制器。
● 構建虛擬文件系統。
● 啟動第一個用戶空間進程init。
/* Set up memory and interrupts */
setup_arch(&command_line);
/* Do CPU specific initialisation */
(void)cpu_init();
/* Initialize scheduler */
scheduler_init();
/* Call init function of each module */
initcall_start = &__initcall_start;
initcall_end = &__initcall_end;
for (; initcall_start<initcall_end; initcall_start++)
(*initcall_start)();
/* Start init */
init();
三、init進程
當init進程啟動後,系統的大部分服務和進程都已經準備就緒,因此,init進程會在執行自己的初始化操作之後,開始啟動其他系統服務和進程。下面是init進程的主要作用:
● 載入init.rc配置文件,從而啟動其他服務和進程。
● 執行各個服務的初始化腳本,使其進入運行狀態。
● 啟動標準輸入輸出服務,該服務提供了與設備交互的介面。
/* Main function */
int main(int argc, char **argv)
{
struct init_action *act;
/* Setup signal handlers */
setup_signal_handlers();
/* Open log */
open_log();
/* Parse args */
parse_args(argc, argv);
/* Register action drivers */
register_action_drivers();
/* Execute scripts from /init.*.rc */
execute_scripts();
/* Execute the default action */
act = find_action("default");
execute_action(act);
/* Daemonize */
if (!FLAG_NO_DAEMON)
daemonize();
return 0;
}
四、Zygote進程
Zygote進程是Android系統中的重要進程之一,其主要作用是為所有新建的進程提供創建和初始化的模板。Zygote進程啟動後會完成以下操作:
● fork出多個子進程,用於處理用戶應用程序請求。
● 註冊ActivityManager和SystemServer進程。
● 將應用程序的資源文件與進程相關的信息載入到內存中。
/* Main function */
int main(int argc, char **argv)
{
pid_t pid;
int retval;
/* Determine caller user ID */
determine_user_id(argv);
/* Create socket pair */
create_socketpair();
/* Fork */
pid = fork();
if (pid == 0) {
/* Child process */
close(child_socket);
retval = zygote_child(argv);
} else {
/* Parent process */
close(parent_socket);
retval = zygote_parent(pid);
}
return retval;
}
五、ActivityManager進程
ActivityManager進程是用戶界面的管理者,負責為用戶界面提供支持,並協調各個界面之間的切換和數據共享。其主要作用如下:
● 接收Intent請求,並啟動相應的應用程序組件。
● 監聽其他進程的狀態,以便可以及時更新UI。
● 維護應用程序窗口的狀態,管理窗口的打開和關閉。
/* Main function */
int main(int argc, char **argv)
{
/* Start up */
start_up();
/* Loop */
while (1) {
/* Process requests */
if (process_request() == 0)
break;
}
/* Shut down */
shut_down();
return 0;
}
六、SystemServer進程
SystemServer進程是Android系統中的最後一個進程啟動,負責構建和啟動系統的各個服務組件,其主要作用如下:
● 啟動屬性服務對象,提供屬性對象靜態和動態屬性的訪問。
● 啟動ActivityManagerService服務,管理應用程序的生命周期。
● 啟動PackageManagerService服務,管理應用程序的安裝和卸載。
● 啟動WindowManagerService服務,管理窗口和用戶界面。
/* Main function */
int main(int argc, char **argv)
{
/* Start up */
start_up();
/* Create services */
create_services();
/* Register listeners */
register_listeners();
/* Loop */
while (1) {
/* Process requests */
if (process_request() == 0)
break;
}
/* Shut down */
shut_down();
return 0;
}
總結
通過對Android系統啟動流程的分析,我們可以了解到整個Android系統是如何啟動的,了解每個進程具體的作用,以及系統各個組件是如何相互協作的。同時,學習Android系統啟動流程有助於簡化自己的應用程序開發,提高自己的編程水平。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/295324.html
微信掃一掃
支付寶掃一掃