PackageManagerService 學習記錄 基於7.1.1源碼


 

參考:

http://blog.csdn.net/innost/article/details/47253179

http://blog.csdn.net/gaugamela/article/details/52619720

感謝文章作者

 

PackageManagerService是Android系統服務,它負責系統中Package的管理,應用程序的安裝、卸載、信息查詢等。

 

 

上圖主要展示了PackageManagerService及客戶端的通信方式,以及相關類的繼承關系。

 

PMS的啟動

PMS由SystemServer創建,SystemServer調用了PMS的main函數創建PMS實例,

之后依次調用PMS的

isFirstBoot函數,判斷本次是否為初次啟動。當Zygote或SystemServer退出時,init會再次啟動它們,所以這里的FirstBoot是指開機后的第一次啟動

performBootDexOpt函數,做dex優化。dex是Android上針對Java字節碼的一種優化技術,可提高運行效率

systemReady函數,通知PMS,系統進入就緒狀態

主要分析main函數 :

PMS在其構造方法中掃描如下目錄中的apk文件,解析apk中的清單文件,並創建相應的數據結構保存掃描到package信息,組件信息,權限信息等:

下面具體分析PMS構造方法中掃描APK文件的過程:

A、調用Setting的readLPw方法解析/System/目錄下的xml文件,並保存解析的信息,一共有5個文件:

packages.xml: PKMS掃描完目標文件夾后會創建該文件。當系統進行程序安裝、卸載和更新等操作時,均會更新該文件。該文件保存了系統中與package相關的一些信息

packages-backup.xml和packages.xml為一組,用於描述系統中所安裝的Package的信息,其中backup是臨時文件。PKMS先把數據寫到backup中,信息都寫成功后再改名成非backup的文件。其目的是防止在寫文件過程中出錯,導致信息丟失。

packages.list:描述系統中存在的所有非系統自帶的APK(應用級,即UID大於10000)的信息。當這些程序有變動時,PKMS就會更新該文件

packages-stopped.xml:從系統自帶的設置程序中進入應用程序頁面,然后在選擇強制停止(ForceStop)某個應用時,系統會將該應用的相關信息記錄到此文件中。也就是該文件保存系統中被用戶強制停止的Package的信息

packages-stopped-backup.xml和packages-stopped.xml為一組,用於描述系統中強制停止運行的pakcage的信息,backup也是臨時文件。如果此處存在該臨時文件,表明此前系統因為某種原因中斷了正常流程

B、解析完XML之后,就是一次掃描各個文件夾中的apk文件,具體會掃描如下5個目錄:

/system/frameworks:該目錄中的文件都是系統庫,例如framework.jar、services.jar、framework-res.apk,不過scanDirLI只掃描APK文件

/system/app:該目錄下全是默認的系統應用,例如Browser.apk、SettingsProvider.apk等

/vendor/app:該目錄中的文件由廠商提供,即廠商特定的APK文件,不過目前市面上的廠商都把自己的應用放在/system/app目錄下

/data/app : 該目錄為第三方APK目錄,安裝的第三方apk都會拷貝到這里

/data/app-private : 安裝的受DRM保護的APK文件(這個不理解)

a) PMS的構造方法調用scanDirLI()方法掃描以上文件夾,通過后綴判斷以上目錄是否有.apk文件,如果則調用scanPackageLI()方法;

b) scanPackageLI()方法中會實例化一個PackageParser對象,並調用PackageParser的parsePackage函數解析apk;

c)上步解析完apk信息之后,會和A步中解析到的XML中保存的apk信息做對比,以確定是否需要升級;

d)再次調用另一個個重載的scanPackageLI()函數將b步解析的apk信息保存在PMS中,並在該函數中將apk中的so文件提取並復制到lib目錄下

PMS的其他功能

除以上啟動時執行的任務外,PMS還承擔安裝apk與查詢apk信息的功能,以后分析。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM