<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          PackageManagerServices 源碼分析

          共 4476字,需瀏覽 9分鐘

           ·

          2021-01-05 11:53

          和你一起終身學習,這里是程序員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)系小編刪除。同時感謝您的閱讀,期待您的關注。

          點個在看,方便您使用時快速查找!

          瀏覽 39
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  九九免费视屏 | 99在线免费观看视频 | 操碰97 | 在线视频99 | 大香蕉亚洲在线 |