資源描述:
《Android應(yīng)用程序安裝過(guò)程源代碼分析》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、Android系統(tǒng)在啟動(dòng)的過(guò)程中,會(huì)啟動(dòng)一個(gè)應(yīng)用程序管理服務(wù)PackageManagerService,這個(gè)服務(wù)負(fù)責(zé)掃描系統(tǒng)中特定的目錄,找到里面的應(yīng)用程序文件,即以Apk為后綴的文件,然后對(duì)這些文件進(jìn)解析,得到應(yīng)用程序的相關(guān)信息,完成應(yīng)用程序的安裝過(guò)程,本文將詳細(xì)分析這個(gè)過(guò)程。?????應(yīng)用程序管理服務(wù)PackageManagerService安裝應(yīng)用程序的過(guò)程,其實(shí)就是解析析應(yīng)用程序配置文件AndroidManifest.xml的過(guò)程,并從里面得到得到應(yīng)用程序的相關(guān)信息,例如得到應(yīng)用程序的組件Activity、Service、BroadcastReceiver和ContentProv
2、ider等信息,有了這些信息后,通過(guò)ActivityManagerService這個(gè)服務(wù),我們就可以在系統(tǒng)中正常地使用這些應(yīng)用程序了。?????應(yīng)用程序管理服務(wù)PackageManagerService是系統(tǒng)啟動(dòng)的時(shí)候由SystemServer組件啟動(dòng)的,啟后它就會(huì)執(zhí)行應(yīng)用程序安裝的過(guò)程,因此,本文將從SystemServer啟動(dòng)PackageManagerService服務(wù)的過(guò)程開(kāi)始分析系統(tǒng)中的應(yīng)用程序安裝的過(guò)程。?????應(yīng)用程序管理服務(wù)PackageManagerService從啟動(dòng)到安裝應(yīng)用程序的過(guò)程如下圖所示:?????下面我們具體分析每一個(gè)步驟。?????Step1.Syst
3、emServer.main?????這個(gè)函數(shù)定義在frameworks/base/services/java/com/android/server/SystemServer.java文件中:viewplain1.public?class?SystemServer??2.{??3.????......??4.??5.????native?public?static?void?init1(String[]?args);??6.??7.????......??8.??9.????public?static?void?main(String[]?args)?{??10.????????.....
4、.??11.??12.????????init1(args);??13.??14.????????......??15.????}??16.??17.????......??18.}???????SystemServer組件是由Zygote進(jìn)程負(fù)責(zé)啟動(dòng)的,啟動(dòng)的時(shí)候就會(huì)調(diào)用它的main函數(shù),這個(gè)函數(shù)主要調(diào)用了JNI方法init1來(lái)做一些系統(tǒng)初始化的工作。?????Step2.SystemServer.init1?????這個(gè)函數(shù)是一個(gè)JNI方法,實(shí)現(xiàn)在?frameworks/base/services/jni/com_android_server_SystemServer.cpp文件中:
5、viewplain1.namespace?android?{??2.??3.extern?"C"?int?system_init();??4.??5.static?void?android_server_SystemServer_init1(JNIEnv*?env,?jobject?clazz)??6.{??7.????system_init();??8.}??9.??10./*?11.?*?JNI?registration.?12.?*/??13.static?JNINativeMethod?gMethods[]?=?{??14.????/*?name,?signature,?func
6、Ptr?*/??15.????{?"init1",?"([Ljava/lang/String;)V",?(void*)?android_server_SystemServer_init1?},??16.};??1.??2.int?register_android_server_SystemServer(JNIEnv*?env)??3.{??4.????return?jniRegisterNativeMethods(env,?"com/android/server/SystemServer",??5.????????????gMethods,?NELEM(gMethods));??6.}?
7、?7.??8.};?//?namespace?android???????這個(gè)函數(shù)很簡(jiǎn)單,只是調(diào)用了system_init函數(shù)來(lái)進(jìn)一步執(zhí)行操作。?????Step3.?libsystem_server.system_init?????函數(shù)system_init實(shí)現(xiàn)在libsystem_server庫(kù)中,源代碼位于frameworks/base/cmds/system_server/library/system_init.cpp文件中