ApplicationPackageManager又是通過對IPackageManager封裝調用,來實現的。
[java]這裡的mPM就是IPackageManager,PackageManagerService就是對IPackageManager的實現。所以我們平時對PackageManager的調用,最終是的在PackageManagerService.java中實現的。在PackageManagerService.java每個方法的實現。
PackageManagerService啟動流程:
PackageManagerService(context, factoryTest)是包管理服務的主進程。它完成了對/system/app,/data/app,/system/framework,/data/app-private下的apk文件的解析。詳細流程如下:
1.建立java層的installer與c層的installd的socket聯接,使得在上層的install,remove,dexopt等功能最終由installd在底層實現
2.建立PackageHandler消息循環,用於處理外部的apk安裝請求消息,如adb install,packageinstaller安裝apk時會發送消息
3.解析/system/etc/permission下xml文件(framework/base/data/etc/),包括platform.xml和系統支持的各種硬件模塊的feature.主要工作:
(1)建立底層user ids和group ids 同上層permissions之間的映射;可以指定一個權限與幾個組ID對應。當一個APK被授予這個權限時,它也同時屬於這幾個組。
(2)給一些底層用戶分配權限,如給shell授予各種permission權限;把一個權限賦予一個UID,當進程使用這個UID運行時,就具備了這個權限。
(3) library,系統增加的一些應用需要link的擴展jar庫;
(4) feature,系統每增加一個硬件,都要添加相應的feature.將解析結果放入mSystemPermissions,mSharedLibraries,mSettings.mPermissions,mAvailableFeatures等幾個集合中供系統查詢和權限配置使用。
4.檢查/data/system/packages.xml是否存在,這個文件是在解析apk時由
writeLP()創建的,裡面記錄了系統的permissions,以及每個apk的name,codePath,flags,version,uesrid等信息,這些信息主要通過apk的
AndroidManifest.xml解析獲取,解析完apk後將更新信息寫入這個文件並保
存到flash,下次開機直接從裡面讀取相關信息添加到內存相關列表中。當有apk
升級,安裝或刪除時會更新這個文件。
5.檢查BootClassPath,mSharedLibraries及/system/framework下的jar
是否需要dexopt,需要的則通過dexopt進行優化
6.啟動AppDirObserver線程監測/system/framework,/system/app,/data/app,/data/
app-private目錄的事件,主要監聽add和remove事件。對於目錄監聽底層通過
inotify機制實現,inotify 是一種文件系統的變化通知機制,如文件增加、刪除
等事件可以立刻讓用戶態得知,它為用戶態監視文件系統的變化提供了強大的支持。
當有add event時調用scanPackageLI(File , int , int)處理;
當有remove event時調用removePackageLI()處理;
7.對於以上幾個目錄下的apk逐個解析,主要是解析每個apk的AndroidMa-
nifest.xml文件,處理asset/res等資源文件,建立起每個apk的配置結構信息,
並將每個apk的配置信息添加到全局列表進行管理。f
8.將解析的每個apk的信息保存到packages.xml和packages.list文件裡,
packages.list記錄了如下數據:pkgName,userId,debugFlag,dataPath(包的數據路徑)