【筆記】 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掃描檔案