Android PackageManagerService流程詳細分析(五)之packages

接着上一節(四)的分析,看看上一節的PackageManagerService構造函數的代碼如:

public PackageManagerService(Context context, Installer installer,
            boolean factoryTest, boolean onlyCore) 
{
    // 前面省略...

    // 第二節討論過
    mInstaller = installer;

    synchronized (mInstallLock) {
    // writer
    synchronized (mPackages) {
    mHandlerThread.start();
    // 第三節討論過
    mHandler = new PackageHandler(mHandlerThread.getLooper());
    // 第四節討論過
    readPermissions();

    // 本節分析內容
    mRestoredSettings = mSettings.readLPw(sUserManager.getUsers(false),
                    mSdkVersion, mOnlyCore);

    } 

    // 後面省略...
}

mSettings.readLPw(sUserManager.getUsers(false),mSdkVersion, mOnlyCore)
主要目的就是讀取packages.xml生成mPackages,檢查/data/system/packages.xml是否存在,第一次開機的時候該文件不存在,而以後每次系統如果有apk變動如新apk安裝、刪除、更新等,都會將相關信息記錄到該文件;下次開機直接從裏面讀取相關信息添加到內存相關列表中。當有 apk升級,安裝或刪除時會更新這個文件。
主要的流程如下:
這裏寫圖片描述
這裏把有關setting相關的流程都畫出來的,apk信息的讀取是通過readLPw來完成的。

具體的代碼就不分析了,很容易看懂,這裏給出主要的代碼流程(生成mPackages):

readLPw->
getPackageLPw->
addPackageSettingLPw->
mPackages.put(name, p);

在機器裏的文件如下:
這裏寫圖片描述

packages.list 的 數 據 格 式 是 :pkgName,userId,debugFlag,dataPath
下面是文件的一小段:

com.xtc.QSILoveKindergarten 10121 0 /data/data/com.xtc.QSILoveKindergarten
com.eebbk.cocos2dx.maorongrong 10026 1 /data/data/com.eebbk.cocos2dx.maorongrong
com.android.defcontainer 10076 0 /data/data/com.android.defcontainer
com.xtc.rynihao 10130 1 /data/data/com.xtc.rynihao
com.xtc.QSBrushTeeth 10118 0 /data/data/com.xtc.QSBrushTeeth
com.xtc.health.time.xyy 10067 1 /data/data/com.xtc.health.time.xyy
com.eebbk.DataInformation 10038 1 /data/data/com.eebbk.DataInformation
com.xtc.appmarket 10077 1 /data/data/com.xtc.appmarket
com.xtc.petsystem.resource 10062 1 /data/data/com.xtc.petsystem.resource
com.xtc.LGMathSupermarket 10113 0 /data/data/com.xtc.LGMathSupermarket
......

packages.xml複雜一點,不過主要特徵如下(文件一小段):

......
<package name="com.xtc.LGHenBusy" codePath="/data/app/com.xtc.LGHenBusy-1.apk" nativeLibraryPath="/data/app-lib/com.xtc.LGHenBusy-1" flags="572996" ft="150891e0f20" it="150891e1786" ut="150891e1786" version="131" userId="10112">
<sigs count="1">
<cert index="0" />
</sigs>
<perms>
<item name="android.permission.DISABLE_KEYGUARD" />
<item name="android.permission.READ_EXTERNAL_STORAGE" />
<item name="android.permission.SYSTEM_ALERT_WINDOW" />
<item name="android.permission.INTERNET" />
<item name="android.permission.WRITE_EXTERNAL_STORAGE" />
<item name="android.permission.WRITE_SETTINGS" />
<item name="android.permission.CHANGE_WIFI_STATE" />
<item name="android.permission.ACCESS_WIFI_STATE" />
<item name="android.permission.RECORD_AUDIO" />
<item name="android.permission.ACCESS_NETWORK_STATE" />
<item name="android.permission.WAKE_LOCK" />
<item name="android.permission.MODIFY_AUDIO_SETTINGS" />
<item name="com.xtc.appmarket.permission.READ_LOCAL_APP" />
</perms>
......

數據結構參考源代碼,可以很清楚知道每個元素是什麼意義,包ft,it,ut等等,源碼如下:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章