生活随笔
收集整理的這篇文章主要介紹了
Android应用程序安装过程源代码分析(1)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
??? ? ? ?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、Broadcast Receiver和Content Provider等信息,有了這些信息后,通過(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è)步驟。
?? ? ? ?Step 1. SystemServer.main
?? ? ? ?這個(gè)函數(shù)定義在frameworks/base/services/java/com/android/server/SystemServer.java文件中:
[java]?view plaincopy
public?class?SystemServer??{??????......????????native?public?static?void?init1(String[]?args);????????......????????public?static?void?main(String[]?args)?{??????????......????????????init1(args);????????????......??????}????????......??}?? ?? ? ? ?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)初始化的工作。
?? ? ? ?Step 2. SystemServer.init1
?? ? ? ?這個(gè)函數(shù)是一個(gè)JNI方法,實(shí)現(xiàn)在?frameworks/base/services/jni/com_android_server_SystemServer.cpp文件中:
[cpp]?view plaincopy
namespace?android?{????extern?"C"?int?system_init();????static?void?android_server_SystemServer_init1(JNIEnv*?env,?jobject?clazz)??{??????system_init();??}????????static?JNINativeMethod?gMethods[]?=?{????????????{?"init1",?"([Ljava/lang/String;)V",?(void*)?android_server_SystemServer_init1?},??};????int?register_android_server_SystemServer(JNIEnv*?env)??{??????return?jniRegisterNativeMethods(env,?"com/android/server/SystemServer",??????????????gMethods,?NELEM(gMethods));??}????};??? ?? ? ? ?這個(gè)函數(shù)很簡(jiǎn)單,只是調(diào)用了system_init函數(shù)來(lái)進(jìn)一步執(zhí)行操作。
?? ? ? ?Step 3.?libsystem_server.system_init
?? ? ? ?函數(shù)system_init實(shí)現(xiàn)在libsystem_server庫(kù)中,源代碼位于frameworks/base/cmds/system_server/library/system_init.cpp文件中:
[cpp]?view plaincopy
extern?"C"?status_t?system_init()??{??????LOGI("Entered?system_init()");????????sp<ProcessState>?proc(ProcessState::self());????????sp<IServiceManager>?sm?=?defaultServiceManager();??????LOGI("ServiceManager:?%p\n",?sm.get());????????sp<GrimReaper>?grim?=?new?GrimReaper();??????sm->asBinder()->linkToDeath(grim,?grim.get(),?0);????????char?propBuf[PROPERTY_VALUE_MAX];??????property_get("system_init.startsurfaceflinger",?propBuf,?"1");??????if?(strcmp(propBuf,?"1")?==?0)?{????????????????????SurfaceFlinger::instantiate();??????}??????????????SensorService::instantiate();????????????????????if?(!proc->supportsProcesses())?{??????????????????????AudioFlinger::instantiate();??????????????????????MediaPlayerService::instantiate();??????????????????????CameraService::instantiate();??????????????????????AudioPolicyService::instantiate();??????}????????????????????????????????????????????LOGI("System?server:?starting?Android?runtime.\n");????????AndroidRuntime*?runtime?=?AndroidRuntime::getRuntime();????????LOGI("System?server:?starting?Android?services.\n");??????runtime->callStatic("com/android/server/SystemServer",?"init2");??????????????????????????if?(proc->supportsProcesses())?{??????????LOGI("System?server:?entering?thread?pool.\n");??????????ProcessState::self()->startThreadPool();??????????IPCThreadState::self()->joinThreadPool();??????????LOGI("System?server:?exiting?thread?pool.\n");??????}????????return?NO_ERROR;??}?? ?? ? ? ?這個(gè)函數(shù)首先會(huì)初始化SurfaceFlinger、SensorService、AudioFlinger、MediaPlayerService、CameraService和AudioPolicyService這幾個(gè)服務(wù),然后就通過(guò)系統(tǒng)全局唯一的AndroidRuntime實(shí)例變量runtime的callStatic來(lái)調(diào)用SystemServer的init2函數(shù)了。關(guān)于這個(gè)AndroidRuntime實(shí)例變量runtime的相關(guān)資料,可能參考前面一篇文章Android應(yīng)用程序進(jìn)程啟動(dòng)過(guò)程的源代碼分析一文。?? ? ?Step 4. AndroidRuntime.callStatic
?
?? ? ? ?這個(gè)函數(shù)定義在frameworks/base/core/jni/AndroidRuntime.cpp文件中:
[cpp]?view plaincopy
????status_t?AndroidRuntime::callStatic(const?char*?className,?const?char*?methodName)??{??????JNIEnv*?env;??????jclass?clazz;??????jmethodID?methodId;????????env?=?getJNIEnv();??????if?(env?==?NULL)??????????return?UNKNOWN_ERROR;????????clazz?=?findClass(env,?className);??????if?(clazz?==?NULL)?{??????????LOGE("ERROR:?could?not?find?class?'%s'\n",?className);??????????return?UNKNOWN_ERROR;??????}??????methodId?=?env->GetStaticMethodID(clazz,?methodName,?"()V");??????if?(methodId?==?NULL)?{??????????LOGE("ERROR:?could?not?find?method?%s.%s\n",?className,?methodName);??????????return?UNKNOWN_ERROR;??????}????????env->CallStaticVoidMethod(clazz,?methodId);????????return?NO_ERROR;??}?? ?? ? ? ?這個(gè)函數(shù)調(diào)用由參數(shù)className指定的java類(lèi)的靜態(tài)成員函數(shù),這個(gè)靜態(tài)成員函數(shù)是由參數(shù)methodName指定的。上面?zhèn)鬟M(jìn)來(lái)的參數(shù)className的值為"com/android/server/SystemServer",而參數(shù)methodName的值為"init2",因此,接下來(lái)就會(huì)調(diào)用SystemServer類(lèi)的init2函數(shù)了。
?
?
轉(zhuǎn)載于:https://blog.51cto.com/shyluo/966518
總結(jié)
以上是生活随笔為你收集整理的Android应用程序安装过程源代码分析(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。