Android PackageManagerService流程詳細分析(一)之啓動

Android系統在啓動的過程中,會啓動一個應用程序管理服務PackageManagerService,這個服務負責掃描系統中特定的目錄,找到裏面的應用程序文件,即以Apk爲後綴的文件,然後對這些文件進解析,得到應用程序的相關信息,完成應用程序的安裝過程,本文將詳細分析這個過程。

應用程序管理服務PackageManagerService安裝應用程序的過程,其實就是解析析應用程序配置文件AndroidManifest.xml的過程,並從裏面得到得到應用程序的相關信息,例如得到應用程序的組件Activity、Service、Broadcast Receiver和Content Provider等信息,有了這些信息後,通過ActivityManagerService這個服務,我們就可以在系統中正常地使用這些應用程序了。

應用程序管理服務PackageManagerService是系統啓動的時候由SystemServer組件啓動的,啓後它就會執行應用程序安裝的過程,因此,本文將從SystemServer啓動PackageManagerService服務的過程開始分析系統中的應用程序安裝的過程。

在frameworks/base/services/java/com/android/server/SystemServer.java文件中:
這裏寫圖片描述

SystemServer組件是由Zygote進程負責啓動的,啓動的時候就會調用它的main函數,這個函數主要調用了JNI方法init1來做一些系統初始化的工作。init1這個函數是一個JNI方法,實現在 frameworks/base/services/jni/com_android_server_SystemServer.cpp文件中:
這裏寫圖片描述
這個函數很簡單,只是調用了system_init函數來進一步執行操作。

函數system_init實現在libsystem_server庫中,源代碼位於frameworks/base/cmds/system_server/library/system_init.cpp文件中:
這裏寫圖片描述
這個函數首先會初始化幾個服務,然後就通過系統全局唯一的AndroidRuntime實例變量runtime的callStatic來調用SystemServer的init2函數了。關於這個AndroidRuntime實例變量runtime的相關資料,可能參考文章Android應用程序進程啓動過程的源代碼分析一文。

init2函數定義在frameworks/base/services/java/com/android/server/SystemServer.java文件中:
這裏寫圖片描述

這個函數創建了一個ServerThread線程,PackageManagerService服務就是這個線程中啓動的了。這裏調用了ServerThread實例thr的start函數之後,下面就會執行這個實例的run函數了。看下面代碼片段:
這裏寫圖片描述

這裏寫圖片描述
這個函數除了啓動PackageManagerService服務之外,還啓動了其它很多的服務,例如在前面學習Activity和Service的幾篇文章中經常看到的ActivityManagerService服務,有興趣的讀者可以自己研究一下。

下一節就介紹installd服務以及他怎麼和PKMS服務配合工作的!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章