PackageManagerServices 源碼分析

和你一起終身學習,這里是程序員Android
經(jīng)典好文推薦,通過閱讀本文,您將收獲以下知識點:
前言 SystemServer啟動PMS
一、PackageManagerService 簡介
二、PMS.main入口
三、PMS 主要作用
四、PMS 涉及到的模塊
五、PMS 啟動過程
六、PMS 權限管理
七、PMS 安裝 Jar包 、apk
八、PMS 構造函數(shù)
九、PMS構造函數(shù)分析
相關源碼:
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
frameworks/base/services/core/java/com/android/server/pm/PackageInstallerService.java
frameworks/base/services/core/java/com/android/server/pm/Settings.java
frameworks/base/services/core/java/com/android/server/pm/Installer.java
frameworks/base/services/core/java/com/android/server/SystemConfig.java
frameworks/base/core/java/android/content/pm/PackageManager.java
frameworks/base/core/java/android/content/pm/IPackageManager.aidl
frameworks/base/core/java/android/content/pm/PackageParser.java
frameworks/base/core/java/com/android/internal/os/InstallerConnection.java
frameworks/base/cmds/pm/src/com/android/commands/pm/Pm.java前言 SystemServer啟動PMS

SystemServer
一、PackageManagerService 簡介
PackageManagerService?住用來跟蹤管理系統(tǒng)所有的apk,AMS中有兩個重要的鎖(?mInstallLock 鎖,?mPackages鎖?)。
mInstallLock
用來保護所有安裝apk的訪問權限,此操作通常涉及繁重的磁盤數(shù)據(jù)讀寫等,并且是單線程操作,故有時候會處理很慢。
此鎖永遠不會再已經(jīng)持有?mPackages?鎖的情況下獲得。
反過來,在已經(jīng)持有?mInstallLock鎖 的情況下,立即獲取?mPackages?是安全的。
許多內(nèi)部方法依靠調用者來保存適當?shù)逆i,并且此合約通過方法名稱后綴表示:
1.fooLI()
調用者必須持有mInstallLock?鎖。
2.fooLIF()
調用者必須持有mInstallLock?鎖 并且被修改的包必須被凍結
mPackages
用來解析內(nèi)存中所有apk的package 信息及相關狀態(tài),其實系統(tǒng)中劃分最精細,競爭力最強的鎖之一。
1.fooLPr()
調用者必須持有mPackages?read 鎖。
2.fooLPw()
調用者必須持有mPackages?write 鎖。
PackageManagerService 繼承實現(xiàn)關系
PMS 繼承關系圖如下:

PackageManagerService 繼承實現(xiàn)關系

PackageSender 接口類
二、PMS.main入口
PackageManagerService.main過程主要是創(chuàng)建PMS服務,并注冊到ServiceManager大管家
PMS 是在?Systemserver.java?中的startBootstrapServices 方法中啟動并調用的。

Systemserver startBootstrapServices
? ?public static PackageManagerService main(Context context, Installer installer, ? ? ? ? ? ?boolean factoryTest, boolean onlyCore) { ? ? ? ?// Self-check for initial settings.
? ? ? ?PackageManagerServiceCompilerMapping.checkProperties();
? ? ? ?PackageManagerService m = new PackageManagerService(context, installer,
? ? ? ? ? ? ? ?factoryTest, onlyCore);
? ? ? ?m.enableSystemUserPackages();
? ? ? ?ServiceManager.addService("package", m); ? ? ? ?final PackageManagerNative pmn = m.new PackageManagerNative();
? ? ? ?ServiceManager.addService("package_native", pmn); ? ? ? ?return m;
? ?}三、PMS 主要作用
PMS 主要作用如下:
1.管理系統(tǒng) jar包和apk ,負責系統(tǒng)權限
2.負責程序的安裝、卸載、更新、解析
3.對于其他應用和服務提供安裝、卸載服務
四、PMS 涉及到的模塊
PMS 涉及到如下模塊

PMS 涉及到的模塊
五、PMS 啟動過程
PMS 啟動大致過程如下
1.和installed 進行連接,進行安裝、卸載操作。
2.創(chuàng)建PackageHandler 線程,處理外部安裝、卸載請求。
3.處理系統(tǒng)權限相關的文件
/system/etc/permission/*.xml。4.掃描安裝jar包 和APK,并獲取到安裝包的信息。
六、PMS 權限管理
PMS 權限管理 大致如下:

PMS 權限管理
七、PMS 安裝 Jar包 、apk

PMS 安裝 Jar包 、apk
八、PMS 構造函數(shù)

PMS 溝通方法一

PMS構造函數(shù)

掃描系統(tǒng)中的apk
只允許開機向導有高優(yōu)先級

只允許開機向導高優(yōu)先級
checkDefaultBrowser 檢查默認瀏覽器

checkDefaultBrowser 檢查默認瀏覽器
九、PMS構造函數(shù)分析
創(chuàng)建PMS對象的過程,就是執(zhí)行PMS的構造函數(shù),PMS構造函數(shù)比較長,我們把這個過程分成幾個階段
BOOT_PROGRESS_PMS_START,
BOOT_PROGRESS_PMS_SYSTEM_SCAN_START,
BOOT_PROGRESS_PMS_DATA_SCAN_START,
BOOT_PROGRESS_PMS_SCAN_END,
BOOT_PROGRESS_PMS_READY,
BOOT_PROGRESS_PMS_START 主要工作
構造DisplayMetrics類:描述界面顯示,尺寸,分辨率,密度。構造完后并獲取默認的信息保存到變量mMetrics中。
構造Settings類:這個是Android的全局管理者,用于協(xié)助PMS保存所有的安裝包信息
保存Installer對象
獲取系統(tǒng)配置信息:SystemConfig構造函數(shù)中會通過readPermissions()解析指定目錄下的所有xml文件,然后把這些信息保存到systemConfig中,涉及的目錄有如下:
/system/etc/sysconfig
/system/etc/permissions
/oem/etc/sysconfig
/oem/etc/permissions創(chuàng)建名為PackageManager的handler線程,建立PackageHandler消息循環(huán),用于處理外部的安裝請求等消息
創(chuàng)建data下的各種目錄,比如data/app, data/app-private等。
創(chuàng)建用戶管理服務UserManagerService
把systemConfig關于xml中的標簽所指的動態(tài)庫保存到mSharedLibraries
Settings.readLPw掃描解析packages.xml和packages-backup.xml
PMS_SYSTEM_SCAN_START 主要工作
首先將BOOTCLASSPATH,SYSTEMSERVERCLASSPATH這兩個環(huán)境變量下的路徑加入到不需要dex優(yōu)化集合alreadyDexOpted中
SYSTEMSERVERCLASSPATH:
主要包括/system/framework目錄下services.jar,ethernet-service.jar,wifi-service.jar這3個文件。
BOOTCLASSPATH:
該環(huán)境變量內(nèi)容較多,不同ROM可能有所不同,常見內(nèi)容包含/system/framework目錄下的framework.jar,ext.jar,core-libart.jar,telephony-common.jar,ims-common.jar,core-junit.jar等文件。
獲取共享庫mSharedLibraries,判斷是否需要dex優(yōu)化,如果需要則進行dex優(yōu)化,并加入到alreadyDexOpted列表中
添加framework-res.apk、core-libart.jar兩個文件添加到已優(yōu)化集合alreadyDexOpted中
將framework目錄下,其他的apk或者jar,進行dex優(yōu)化并加入已優(yōu)化集合alreadyDexOpted中
scanDirLI(): 掃描指定目錄下的apk文件,最終調用PackageParser.parseBaseApk來完成AndroidManifest.xml文件的解析,生成Application, activity,service,broadcast, provider等信息
刪除系統(tǒng)不存在的包 removePackageLI
清理安裝失敗的包 cleanupInstallFailedPackage
刪除臨時文件 deleteTempPackageFiles
移除不相干包中的所有共享userID
至此,本篇已結束。轉載網(wǎng)絡的文章,小編覺得很優(yōu)秀,歡迎點擊閱讀原文,支持原創(chuàng)作者,如有侵權,懇請聯(lián)系小編刪除。同時感謝您的閱讀,期待您的關注。
點個在看,方便您使用時快速查找!
