日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 启动过程详解

發布時間:2025/6/15 Android 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 启动过程详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

AndroidLinux系統啟動有4個步驟;

(1) init進程啟動

(2) Native服務啟動

(3) System ServerAndroid服務啟動

(4) Home啟動

總體啟動框架圖如:

?

第一步:initial進程(system/core/init)

???? init進程,它是一個由內核啟動的用戶級進程。內核自行啟動(已經被載入內存,開始運行,并已初始化所有的設備驅動程序和數據結構等)之后,就通過啟動一個用戶級程序init的方式,完成引導進程。init始終是第一個進程.

Init.rc

Init.marvell.rc


Init進程一起來就根據init.rcinit.xxx.rc腳本文件建立了幾個基本的服務:

  • ?servicemanamger
  • ?zygote

。。。

最后Init并不退出,而是擔當起property service的功能。

1.1腳本文件

init@System/Core/Init

Init.c: parse_config_file(Init.rc)

? @parse_config_file(Init.marvel.rc)

解析腳本文件:Init.rcInit.xxxx.rc(硬件平臺相關)

Init.rcAndroid自己規定的初始化腳本(Android Init Language, System/Core/Init/readme.txt)

該腳本包含四個類型的聲明:

  • Actions
  • Commands
  • Services
  • Options.

1.2 服務啟動機制

我們來看看Init是這樣解析.rc文件開啟服務的。

1)打開.rc文件,解析文件內容@ system/core/init/init.c

service信息放置到service_list中。@ system/core/init parser.c

2restart_service()@ system/core/init/init.c

service_start

execve().建立service進程。

第二步 Zygote

Servicemanagerzygote進程就奠定了Android的基礎。Zygote這個進程起來才會建立起真正的Android運行空間,初始化建立的Service都是Navtive service..rc腳本文件中zygote的描述:

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

所以Zygotemain()@frameworks/base/cmds/app_main.cpp開始。

(1) main()@frameworks/base/cmds/app_main.cpp

  • 建立Java Runtime
  • runtime.start("com.android.internal.os.ZygoteInit", startSystemServer);

(2) runtime.start@AndroidRuntime.cpp

  • 建立虛擬機
  • 運行:com.android.internal.os.ZygoteInitmain函數。

(3)main()@com.android.internal.os.ZygoteInit//正真的Zygote

  • registerZygoteSocket();//登記Listen端口
  • startSystemServer();
  • 進入Zygote服務框架。

經過這幾個步驟,Zygote就建立好了,利用Socket通訊,接收ActivityManangerService的請求,Fork應用程序。

第三步 System Server

startSystemServer@com.android.internal.os.ZygoteInitZygotefork了一個進程:?com.android.server.SystemServer.于是SystemServer@(SystemServer.java就建立了。Android的所有服務循環框架都是建立SystemServer@(SystemServer.java)上。在SystemServer.java中看不到循環結構,只是可以看到建立了init2的實現函數,建立了一大堆服務,并AddService到service Manager。

main() @ com/android/server/SystemServer

{

init1();

}

Init1()是在Native空間實現的(com_andoird_server_systemServer.cpp)。我們一看這個函數就知道了,init1->system_init() @System_init.cpp

system_init()我們看到了循環閉合管理框架。

{

Call "com/android/server/SystemServer", "init2"

…..

ProcessState::self()->startThreadPool();

??? IPCThreadState::self()->joinThreadPool();

}


init2()@SystemServer.java中建立了Android中所有要用到的服務。

這個init2()建立了一個線程,來New ServiceAddService來建立服務


第三步 Home啟動

ServerThread@SystemServer.java后半段,我們可以看到系統在啟動完所有的Android服務后,做了這樣一些動作:

(1) 使用xxx.systemReady()通知各個服務,系統已經就緒。

(2)? 特別對于ActivityManagerService.systemReady(回調)

Widget.wallpaper,imm(輸入法)ready通知。

Home就是在ActivityManagerService.systemReady()通知的過程中建立的。下面是ActivityManagerService.systemReady()的偽代碼:

systemReady()@ActivityManagerService.java

resumeTopActivityLocked()

startHomeActivityLocked();//如果是第一個則啟動HomeActivity

startActivityLocked(。。。)CATEGORY_HOME

總結

以上是生活随笔為你收集整理的Android 启动过程详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。