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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android应用程序安装过程源代码分析(1)

發(fā)布時(shí)間:2025/4/5 Android 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android应用程序安装过程源代码分析(1) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

??? ? ? ?Android系統(tǒng)在啟動(dòng)的過程中,會(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)用程序的安裝過程,本文將詳細(xì)分析這個(gè)過程。

?? ? ? ?應(yīng)用程序管理服務(wù)PackageManagerService安裝應(yīng)用程序的過程,其實(shí)就是解析析應(yīng)用程序配置文件AndroidManifest.xml的過程,并從里面得到得到應(yīng)用程序的相關(guān)信息,例如得到應(yīng)用程序的組件Activity、Service、Broadcast Receiver和Content Provider等信息,有了這些信息后,通過ActivityManagerService這個(gè)服務(wù),我們就可以在系統(tǒng)中正常地使用這些應(yīng)用程序了。

?? ? ? ?應(yīng)用程序管理服務(wù)PackageManagerService是系統(tǒng)啟動(dòng)的時(shí)候由SystemServer組件啟動(dòng)的,啟后它就會(huì)執(zhí)行應(yīng)用程序安裝的過程,因此,本文將從SystemServer啟動(dòng)PackageManagerService服務(wù)的過程開始分析系統(tǒng)中的應(yīng)用程序安裝的過程。

?? ? ? ?應(yīng)用程序管理服務(wù)PackageManagerService從啟動(dòng)到安裝應(yīng)用程序的過程如下圖所示:

?

? ? ? ?下面我們具體分析每一個(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來做一些系統(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();??
  • }??
  • ??
  • /*?
  • ?*?JNI?registration.?
  • ?*/??
  • static?JNINativeMethod?gMethods[]?=?{??
  • ????/*?name,?signature,?funcPtr?*/??
  • ????{?"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));??
  • }??
  • ??
  • };?//?namespace?android??
  • ?? ? ? ?這個(gè)函數(shù)很簡單,只是調(diào)用了system_init函數(shù)來進(jìn)一步執(zhí)行操作。

    ?? ? ? ?Step 3.?libsystem_server.system_init

    ?? ? ? ?函數(shù)system_init實(shí)現(xiàn)在libsystem_server庫中,源代碼位于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)?{??
  • ????????//?Start?the?SurfaceFlinger??
  • ????????SurfaceFlinger::instantiate();??
  • ????}??
  • ??
  • ????//?Start?the?sensor?service??
  • ????SensorService::instantiate();??
  • ??
  • ????//?On?the?simulator,?audioflinger?et?al?don't?get?started?the??
  • ????//?same?way?as?on?the?device,?and?we?need?to?start?them?here??
  • ????if?(!proc->supportsProcesses())?{??
  • ??
  • ????????//?Start?the?AudioFlinger??
  • ????????AudioFlinger::instantiate();??
  • ??
  • ????????//?Start?the?media?playback?service??
  • ????????MediaPlayerService::instantiate();??
  • ??
  • ????????//?Start?the?camera?service??
  • ????????CameraService::instantiate();??
  • ??
  • ????????//?Start?the?audio?policy?service??
  • ????????AudioPolicyService::instantiate();??
  • ????}??
  • ??
  • ????//?And?now?start?the?Android?runtime.??We?have?to?do?this?bit??
  • ????//?of?nastiness?because?the?Android?runtime?initialization?requires??
  • ????//?some?of?the?core?system?services?to?already?be?started.??
  • ????//?All?other?servers?should?just?start?the?Android?runtime?at??
  • ????//?the?beginning?of?their?processes's?main(),?before?calling??
  • ????//?the?init?function.??
  • ????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?running?in?our?own?process,?just?go?into?the?thread??
  • ????//?pool.??Otherwise,?call?the?initialization?finished??
  • ????//?func?to?let?this?process?continue?its?initilization.??
  • ????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ù),然后就通過系統(tǒng)全局唯一的AndroidRuntime實(shí)例變量runtime的callStatic來調(diào)用SystemServer的init2函數(shù)了。關(guān)于這個(gè)AndroidRuntime實(shí)例變量runtime的相關(guān)資料,可能參考前面一篇文章Android應(yīng)用程序進(jìn)程啟動(dòng)過程的源代碼分析一文。?? ? ?Step 4. AndroidRuntime.callStatic

    ?

    ?? ? ? ?這個(gè)函數(shù)定義在frameworks/base/core/jni/AndroidRuntime.cpp文件中:

    [cpp]?view plaincopy
  • /*?
  • *?Call?a?static?Java?Programming?Language?function?that?takes?no?arguments?and?returns?void.?
  • */??
  • 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類的靜態(tài)成員函數(shù),這個(gè)靜態(tài)成員函數(shù)是由參數(shù)methodName指定的。上面?zhèn)鬟M(jìn)來的參數(shù)className的值為"com/android/server/SystemServer",而參數(shù)methodName的值為"init2",因此,接下來就會(huì)調(diào)用SystemServer類的init2函數(shù)了。

    ?

    ?

    轉(zhuǎn)載于:https://blog.51cto.com/shyluo/966518

    總結(jié)

    以上是生活随笔為你收集整理的Android应用程序安装过程源代码分析(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。