1. 程式人生 > >【筆記】 PackageManagerService 分析

【筆記】 PackageManagerService 分析

1.Settings  類:Settings主要用於儲存一些資訊,實際上它確實是用於管理Android系統執行過程中的一些設定資訊
  1.成員變數:
    1.settings 類初始化時 生成/建立/data/system/ 下的packages.xml , packages-backup.xml 和 packages.list 檔案; 
       
    2.packages.xml和package-backup.xml為一組,用於描述系統所安裝的Package資訊,其中packages-backup.xml是package.xml的備份。
    
      pkg的許可權狀態,codePath,nativeLibraryPath , privateFlags 等;
    
    3.packages-list用於描述系統中存在的所有非系統自帶的apk資訊及UID大於10000的apk。當這些APK有變化時,PackageManagerService就會更新該檔案
    
      【packages-list:com.android.bluetooth 1002 0 /data/user_de/0/com.android.bluetooth platform:targetSdkVersion=27 3002,1023,1015,3003,3001,3007,1002,3010,3011,3005,1016】
    
    4.在Android中每一個應用都有一個UID,兩個相同的UID的應用可以執行在同一個程序中,所以為了讓兩個應用執行在一個程序中,往往會在AndroidManifest.xml檔案中設定shareUserId這個屬性
       =====》 1.Android中每一個應用都有一個UID,uid 相同的2個app可以執行在同一程序
               2.執行在同一程序了才可以進行資料交換
               
               
    5. ShareUserSetting :【記錄某一特定UID下所有PKG共有的許可權 和 其中單個PKG 不同於其他PKG 自己特有的許可權】
       1.Settings 的一個成員變數, 是已一個特定的UID為key值建立。
       2.ShareUserSetting的成員變數packageSettings 代表單個PKG,記錄此PKG的**獨有**的許可權;
       3.ShareUserSetting的成員變數permissionState就記錄了 同一個UID下所有PKG 的共有許可權;
       4.不同的UID 對應不同的ShareUserSetting成員變數
    
    6.SystemConfig :
      PKMS建立的SystemConfig負責解析系統的xml配置檔案,最終將形成資料結構,在此之後,PKMS取出並儲存了SystemConfig中的許可權和feature等資訊.

     PKMS 建構函式中呼叫mGlobalGids = systemConfig.getGlobalGids(); 獲取系統UID 合集,實際上systemConfig.getGlobalGids()函式是讀取”etc/permissions/platform.xml“ 來得到uid 合集的。
    7.PackageManageService啟動的時候會將PackageHandler和ServiceThread進行繫結。ServiceThread其實就是PackageManageService的工作執行緒,PackageManageService的各種操作都將利用PackageHandler分發到HandlerThread去處理
               
               
               
               
    ==============================================PKMS 流程======================================================================
    PackageManager在啟動時會
    1.掃描所有的APK檔案和jar包,然後把他們的資訊讀取出來,儲存在記憶體中(SystemConfig類中),這樣系統執行時就能迅速找到各種應用和元件的資訊。
    2.掃描中如果遇到沒有優化過的檔案還要進行優化工作(dex格式轉換成oat格式(Android 5.0以前是odex)),優化後的檔案放在/data/dalvik-cache/下面
     
    初始化:
    1.new Settings()物件
      增加共享使用者組資訊;
    
    2.獲取預設的裝置展示資訊
      // 建立一個Installer物件,該物件和Native程序installd互動
    
    3.建立PackageHandler()物件
      處理安裝或者解除安裝命令
      
    4.建立UserManagerService 物件
      解析user相關資訊
      
    5.readPermission()
      解析/system/etc/permissions/目錄下的檔案
      
    6.呼叫Settins.readLPW()
       解析/data/system/ 下的4個檔案
      
    7.進行dex優化操作
    
    8.呼叫ScanDirLI掃描檔案